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.application.viewstate;
20  
21  import java.io.ByteArrayInputStream;
22  import java.io.ByteArrayOutputStream;
23  import java.io.ObjectInputStream;
24  import java.io.ObjectOutputStream;
25  import java.util.Map;
26  import javax.faces.application.ProjectStage;
27  import javax.faces.application.StateManager;
28  
29  import org.apache.myfaces.application.StateCache;
30  import org.apache.myfaces.test.base.junit4.AbstractJsfConfigurableMultipleRequestsTestCase;
31  import org.junit.Test;
32  import org.testng.Assert;
33  
34  public class ServerSideStateCacheTest extends AbstractJsfConfigurableMultipleRequestsTestCase
35  {
36  
37      @Test
38      public void testNumberOfSequentialViewsInSession() throws Exception
39      {
40          servletContext.addInitParameter(StateManager.STATE_SAVING_METHOD_PARAM_NAME, StateManager.STATE_SAVING_METHOD_SERVER);
41          servletContext.addInitParameter("org.apache.myfaces.NUMBER_OF_VIEWS_IN_SESSION", "5");
42          servletContext.addInitParameter("org.apache.myfaces.NUMBER_OF_SEQUENTIAL_VIEWS_IN_SESSION", "2");
43          servletContext.addInitParameter(StateManager.SERIALIZE_SERVER_STATE_PARAM_NAME, "true");
44  
45          // Initialization
46          setupRequest();
47          StateCache stateCache = new ServerSideStateCacheImpl();
48          tearDownRequest();
49          
50          Object savedToken;
51          Object firstSavedToken;
52          
53          try
54          {
55              setupRequest();
56             
57              facesContext.getViewRoot().setViewId("view1.xhtml");
58              savedToken = stateCache.saveSerializedView(facesContext, 1);
59              firstSavedToken = savedToken;
60          }
61          finally
62          {
63              tearDownRequest();
64          }
65          
66          try
67          {
68              setupRequest();
69              
70              Object value = stateCache.restoreSerializedView(facesContext, "view1.xhtml", savedToken);
71              
72              Assert.assertEquals(1, value);
73              
74              facesContext.getViewRoot().setViewId("view2.xhtml");
75              savedToken = stateCache.saveSerializedView(facesContext, 2);
76          }
77          finally
78          {
79              tearDownRequest();
80          }
81  
82          try
83          {
84              setupRequest();
85              
86              Object value = stateCache.restoreSerializedView(facesContext, "view2.xhtml", savedToken);
87              
88              Assert.assertEquals(2, value);
89              
90              facesContext.getViewRoot().setViewId("view2.xhtml");
91              savedToken = stateCache.saveSerializedView(facesContext, 3);
92          }
93          finally
94          {
95              tearDownRequest();
96          }
97          
98          try
99          {
100             setupRequest();
101             
102             Object value = stateCache.restoreSerializedView(facesContext, "view1.xhtml", firstSavedToken);
103             
104             // Since org.apache.myfaces.NUMBER_OF_SEQUENTIAL_VIEWS_IN_SESSION is 2, the first one was already discarded
105             Assert.assertNull(value);
106         }
107         finally
108         {
109             tearDownRequest();
110         }
111     }
112     
113     @Test
114     public void testSaveRestoreStateWrongViewId() throws Exception
115     {
116         servletContext.addInitParameter(StateManager.STATE_SAVING_METHOD_PARAM_NAME, StateManager.STATE_SAVING_METHOD_SERVER);
117 
118         // Initialization
119         setupRequest();
120         StateCache stateCache = new ClientSideStateCacheImpl();
121         tearDownRequest();
122         
123         Object savedToken;
124         Object firstSavedToken;
125         
126         try
127         {
128             setupRequest();
129            
130             facesContext.getViewRoot().setViewId("/view1.xhtml");
131             savedToken = stateCache.saveSerializedView(facesContext, 1);
132             firstSavedToken = savedToken;
133         }
134         finally
135         {
136             tearDownRequest();
137         }
138         
139         try
140         {
141             setupRequest();
142             
143             // Note we are trying to restore restoring another different view with a token from the previous view.
144             // It should return null and later throw ViewExpiredException
145             // In server side state saving, the hashCode of the viewId should be part of the key used to restore
146             // the state, along with a counter.
147             Object value = stateCache.restoreSerializedView(facesContext, "/view2.xhtml", firstSavedToken);
148             
149             Assert.assertNull(value);
150         }
151         finally
152         {
153             tearDownRequest();
154         }
155         
156         try
157         {
158             setupRequest();
159             
160             // It should restore this:
161             Object value = stateCache.restoreSerializedView(facesContext, "/view1.xhtml", firstSavedToken);
162             
163             Assert.assertEquals(1, value);
164         }
165         finally
166         {
167             tearDownRequest();
168         }
169         
170     }
171 
172     @Test
173     public void testNonExistingViewId() throws Exception
174     {
175         servletContext.addInitParameter(StateManager.STATE_SAVING_METHOD_PARAM_NAME, StateManager.STATE_SAVING_METHOD_SERVER);
176         servletContext.addInitParameter("org.apache.myfaces.NUMBER_OF_VIEWS_IN_SESSION", "5");
177         servletContext.addInitParameter("org.apache.myfaces.NUMBER_OF_SEQUENTIAL_VIEWS_IN_SESSION", "2");
178 
179         // this issue only happens in projectstage Production
180         servletContext.addInitParameter("faces.PROJECT_STAGE", "Production");
181 
182         try
183         {
184             // Initialization
185             setupRequest();
186 
187             // we need to take a viewId which is null -> not existing.
188             facesContext.getViewRoot().setViewId(null);
189 
190             StateCache stateCache = new ServerSideStateCacheImpl();
191             Object savedToken = stateCache.saveSerializedView(facesContext, 1);
192 
193         }
194         finally
195         {
196             tearDownRequest();
197         }
198 
199     }
200 
201     public void tryStateKeySerialization() throws Exception
202     {
203         // Initialization
204         setupRequest();
205         StateCache stateCache = new ServerSideStateCacheImpl();
206         tearDownRequest();
207         
208         Object savedToken;
209         Object firstSavedToken;
210         
211         try
212         {
213             setupRequest();
214             facesContext.getViewRoot().setViewId("view1.xhtml");
215             savedToken = stateCache.saveSerializedView(facesContext, 1);
216             firstSavedToken = savedToken;
217             
218             for (Map.Entry<String, Object> entry : facesContext.getExternalContext().getSessionMap().entrySet())
219             {
220                 ByteArrayOutputStream baos = new ByteArrayOutputStream(128);
221                 ObjectOutputStream oos = new ObjectOutputStream(baos);
222                 oos.writeObject(entry.getValue());
223                 oos.flush();
224                 baos.flush();
225                 ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
226                 ObjectInputStream ois = new ObjectInputStream(bais);
227                 Object blorg = ois.readObject();
228             }
229         }
230         finally
231         {
232             tearDownRequest();
233         }
234     }
235 
236     @Test
237     public void testStateKeySerialization1() throws Exception
238     {
239         servletContext.addInitParameter(StateManager.STATE_SAVING_METHOD_PARAM_NAME, StateManager.STATE_SAVING_METHOD_SERVER);
240         servletContext.addInitParameter("org.apache.myfaces.NUMBER_OF_VIEWS_IN_SESSION", "5");
241         servletContext.addInitParameter("org.apache.myfaces.NUMBER_OF_SEQUENTIAL_VIEWS_IN_SESSION", "2");
242         servletContext.addInitParameter(ProjectStage.PROJECT_STAGE_PARAM_NAME, ProjectStage.Production.toString());
243         
244         tryStateKeySerialization();
245     }
246     
247     @Test
248     public void testStateKeySerialization2() throws Exception
249     {
250         servletContext.addInitParameter(StateManager.STATE_SAVING_METHOD_PARAM_NAME, StateManager.STATE_SAVING_METHOD_SERVER);
251         servletContext.addInitParameter("org.apache.myfaces.NUMBER_OF_VIEWS_IN_SESSION", "5");
252         servletContext.addInitParameter("org.apache.myfaces.NUMBER_OF_SEQUENTIAL_VIEWS_IN_SESSION", "2");
253         servletContext.addInitParameter(ProjectStage.PROJECT_STAGE_PARAM_NAME, ProjectStage.Production.toString());
254         servletContext.addInitParameter("org.apache.myfaces.RANDOM_KEY_IN_VIEW_STATE_SESSION_TOKEN", "random");
255         
256         tryStateKeySerialization();
257     }
258     
259     @Test
260     public void testStateKeySerialization3() throws Exception
261     {
262         servletContext.addInitParameter(StateManager.STATE_SAVING_METHOD_PARAM_NAME, StateManager.STATE_SAVING_METHOD_SERVER);
263         servletContext.addInitParameter("org.apache.myfaces.NUMBER_OF_VIEWS_IN_SESSION", "5");
264         servletContext.addInitParameter("org.apache.myfaces.NUMBER_OF_SEQUENTIAL_VIEWS_IN_SESSION", "2");
265         servletContext.addInitParameter(ProjectStage.PROJECT_STAGE_PARAM_NAME, ProjectStage.Development.toString());
266         
267         tryStateKeySerialization();
268     }
269     
270 }