View Javadoc

1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one
3    * or more contributor license agreements.  See the NOTICE file
4    * distributed with this work for additional information
5    * regarding copyright ownership.  The ASF licenses this file
6    * to you under the Apache License, Version 2.0 (the
7    * "License"); you may not use this file except in compliance
8    * with the License.  You may obtain a copy of the License at
9    *
10   *   http://www.apache.org/licenses/LICENSE-2.0
11   *
12   * Unless required by applicable law or agreed to in writing,
13   * software distributed under the License is distributed on an
14   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15   * KIND, either express or implied.  See the License for the
16   * specific language governing permissions and limitations
17   * under the License.
18   */
19  package org.apache.myfaces.webapp;
20  
21  import java.lang.reflect.Field;
22  import java.util.Locale;
23  
24  import javax.faces.application.ProjectStage;
25  import javax.faces.component.UIViewRoot;
26  import javax.faces.context.FacesContext;
27  import javax.servlet.ServletConfig;
28  import javax.servlet.ServletException;
29  
30  import org.apache.myfaces.test.base.junit4.AbstractJsfTestCase;
31  import org.easymock.EasyMock;
32  import org.easymock.IAnswer;
33  import org.junit.Assert;
34  import org.junit.Test;
35  import org.junit.runner.RunWith;
36  import org.junit.runners.JUnit4;
37  
38  /**
39   * Test cases for MyFacesServlet
40   * 
41   * @author Jakob Korherr (latest modification by $Author: jakobk $)
42   * @version $Revision: 963629 $ $Date: 2010-07-13 04:29:07 -0500 (Tue, 13 Jul 2010) $
43   */
44  @RunWith(JUnit4.class)
45  public class MyFacesServletTest extends AbstractJsfTestCase
46  {
47      
48      private MyFacesServlet _servlet;
49  
50      @Override
51      public void setUp() throws Exception
52      {
53          super.setUp();
54          
55          _servlet = new MyFacesServlet();
56      }
57  
58      @Override
59      public void tearDown() throws Exception
60      {
61          _servlet = null;
62          
63          super.tearDown();
64      }
65  
66      /**
67       * Verifies the calls to FacesInitializer on init()
68       * @throws ServletException 
69       */
70      @Test
71      public void testInitInitializerCalled() throws ServletException
72      {
73          FacesInitializer initializer = EasyMock.createMock(FacesInitializer.class);
74          EasyMock.expect(initializer.initStartupFacesContext(servletContext)).andReturn(facesContext).once();
75          initializer.initFaces(servletContext);
76          EasyMock.expectLastCall().once();
77          initializer.destroyStartupFacesContext(facesContext);
78          EasyMock.expectLastCall().once();
79          
80          // create Mock for ServletConfig
81          ServletConfig servletConfig = EasyMock.createMock(ServletConfig.class);
82          EasyMock.expect(servletConfig.getServletContext()).andReturn(servletContext).anyTimes();
83          EasyMock.expect(servletConfig.getInitParameter(EasyMock.isA(String.class))).andReturn(null).anyTimes();
84          
85          EasyMock.replay(initializer, servletConfig);
86          _setFacesInitializer(initializer);
87          
88          _servlet.init(servletConfig);
89          EasyMock.verify(initializer);
90      }
91      
92      /**
93       * Verifies the FacesContext handling at application startup.
94       * @throws ServletException 
95       */
96      @Test
97      public void testInitFacesContextAvailable() throws ServletException
98      {
99          // release the current FacesContext to enforce setCurrentInstance(null)
100         facesContext.release();
101         
102         final FacesInitializer realInitializer = FacesInitializerFactory.getFacesInitializer(servletContext);
103         final AssertFacesContextAnswer assertAnswer = new AssertFacesContextAnswer();
104         
105         FacesInitializer mockInitializer = EasyMock.createMock(FacesInitializer.class);
106         
107         // initStartupFacesContext pass through to realInitializer
108         EasyMock.expect(mockInitializer.initStartupFacesContext(servletContext))
109                 .andAnswer(new IAnswer<FacesContext>()
110         {
111 
112             public FacesContext answer() throws Throwable
113             {
114                 assertAnswer.facesContext = realInitializer.initStartupFacesContext(servletContext);
115                 return assertAnswer.facesContext;
116             }
117             
118         });
119         
120         // initFaces with assert answer
121         mockInitializer.initFaces(servletContext);
122         EasyMock.expectLastCall().andStubAnswer(assertAnswer);
123         
124         // destroyStartupFacesContext pass through to realInitializer
125         mockInitializer.destroyStartupFacesContext(EasyMock.isA(FacesContext.class));
126         EasyMock.expectLastCall().andStubAnswer(new IAnswer<Object>()
127         {
128 
129             public Object answer() throws Throwable
130             {
131                 FacesContext argCtx = (FacesContext) EasyMock.getCurrentArguments()[0];
132                 Assert.assertNotNull(argCtx);
133                 Assert.assertEquals(assertAnswer.facesContext, argCtx); // must be the same
134                 
135                 realInitializer.destroyStartupFacesContext(argCtx);
136                 
137                 return null;
138             }
139                     
140                 
141         });
142         
143         // create Mock for ServletConfig
144         ServletConfig servletConfig = EasyMock.createMock(ServletConfig.class);
145         EasyMock.expect(servletConfig.getServletContext()).andReturn(servletContext).anyTimes();
146         EasyMock.expect(servletConfig.getInitParameter(EasyMock.isA(String.class))).andReturn(null).anyTimes();
147         
148         EasyMock.replay(mockInitializer, servletConfig);
149         _setFacesInitializer(mockInitializer);
150         
151         _servlet.init(servletConfig);
152         EasyMock.verify(mockInitializer);
153         
154         Assert.assertNull(FacesContext.getCurrentInstance()); // must be null by now
155     }
156     
157     /**
158      * Sets the FacesInitializer on the MyFacesServlet
159      * @param facesInitializer
160      */
161     private void _setFacesInitializer(FacesInitializer facesInitializer)
162     {
163         try
164         {
165             Field field = MyFacesServlet.class.getDeclaredField("_facesInitializer");
166             field.setAccessible(true);
167             field.set(_servlet, facesInitializer);
168         }
169         catch (Exception e)
170         {
171             throw new IllegalStateException("Could not set FacesInitializer for test", e);
172         }
173         
174     }
175     
176     /**
177      * Helper class to do assertions on the StartupFacesContextImpl.
178      * @author Jakob Korherr
179      */
180     private final class AssertFacesContextAnswer implements IAnswer<Object>
181     {
182 
183         private FacesContext facesContext; // set by the first answer in the test case
184         
185         public Object answer() throws Throwable
186         {
187             Assert.assertEquals(facesContext, FacesContext.getCurrentInstance());
188             Assert.assertNotNull(facesContext);
189             Assert.assertNotNull(facesContext.getApplication());
190             Assert.assertNotNull(facesContext.getExternalContext());
191             Assert.assertNotNull(facesContext.getExceptionHandler());
192             Assert.assertEquals(facesContext.getApplication()
193                     .getProjectStage().equals(ProjectStage.Production),
194                     facesContext.isProjectStage(ProjectStage.Production));
195             UIViewRoot viewRoot = facesContext.getViewRoot();
196             Assert.assertNotNull(viewRoot);
197             Assert.assertEquals(Locale.getDefault(), viewRoot.getLocale());
198             
199             return null;
200         }
201 
202     }
203     
204 }