View Javadoc

1   /*
2    * $Id: UrlHelperTest.java 517363 2007-03-12 20:05:02Z husted $
3    *
4    * Licensed to the Apache Software Foundation (ASF) under one
5    * or more contributor license agreements.  See the NOTICE file
6    * distributed with this work for additional information
7    * regarding copyright ownership.  The ASF licenses this file
8    * to you under the Apache License, Version 2.0 (the
9    * "License"); you may not use this file except in compliance
10   * with the License.  You may obtain a copy of the License at
11   *
12   *  http://www.apache.org/licenses/LICENSE-2.0
13   *
14   * Unless required by applicable law or agreed to in writing,
15   * software distributed under the License is distributed on an
16   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
17   * KIND, either express or implied.  See the License for the
18   * specific language governing permissions and limitations
19   * under the License.
20   */
21  package org.apache.struts2.views.util;
22  
23  import java.util.Arrays;
24  import java.util.HashMap;
25  import java.util.LinkedHashMap;
26  import java.util.Map;
27  import java.util.TreeMap;
28  
29  import javax.servlet.http.HttpServletRequest;
30  import javax.servlet.http.HttpServletResponse;
31  
32  import org.apache.struts2.StrutsTestCase;
33  
34  import com.mockobjects.dynamic.Mock;
35  
36  
37  /***
38   * Test case for UrlHelper.
39   *
40   */
41  public class UrlHelperTest extends StrutsTestCase {
42  
43  
44  
45      public void testForceAddSchemeHostAndPort() throws Exception {
46          String expectedUrl = "http://localhost/contextPath/path1/path2/myAction.action";
47  
48          Mock mockHttpServletRequest = new Mock(HttpServletRequest.class);
49          mockHttpServletRequest.expectAndReturn("getScheme", "http");
50          mockHttpServletRequest.expectAndReturn("getServerName", "localhost");
51          mockHttpServletRequest.expectAndReturn("getContextPath", "/contextPath");
52  
53          Mock mockHttpServletResponse = new Mock(HttpServletResponse.class);
54          mockHttpServletResponse.expectAndReturn("encodeURL", expectedUrl, expectedUrl);
55  
56          String result = UrlHelper.buildUrl("/path1/path2/myAction.action", (HttpServletRequest) mockHttpServletRequest.proxy(), (HttpServletResponse)mockHttpServletResponse.proxy(), null, "http", true, true, true);
57          assertEquals(expectedUrl, result);
58          mockHttpServletRequest.verify();
59      }
60  
61      public void testDoNotForceAddSchemeHostAndPort() throws Exception {
62          String expectedUrl = "/contextPath/path1/path2/myAction.action";
63  
64          Mock mockHttpServletRequest = new Mock(HttpServletRequest.class);
65          mockHttpServletRequest.expectAndReturn("getScheme", "http");
66          mockHttpServletRequest.expectAndReturn("getServerName", "localhost");
67          mockHttpServletRequest.expectAndReturn("getContextPath", "/contextPath");
68  
69          Mock mockHttpServletResponse = new Mock(HttpServletResponse.class);
70          mockHttpServletResponse.expectAndReturn("encodeURL", expectedUrl, expectedUrl);
71  
72          String result = UrlHelper.buildUrl("/path1/path2/myAction.action", (HttpServletRequest)mockHttpServletRequest.proxy(), (HttpServletResponse)mockHttpServletResponse.proxy(), null, "http", true, true, false);
73  
74          assertEquals(expectedUrl, result);
75      }
76  
77      public void testForceAddNullSchemeHostAndPort() throws Exception {
78          String expectedUrl = "http://localhost/contextPath/path1/path2/myAction.action";
79  
80          Mock mockHttpServletRequest = new Mock(HttpServletRequest.class);
81          mockHttpServletRequest.expectAndReturn("getScheme", "http");
82          mockHttpServletRequest.expectAndReturn("getServerName", "localhost");
83          mockHttpServletRequest.expectAndReturn("getContextPath",
84              "/contextPath");
85  
86          Mock mockHttpServletResponse = new Mock(HttpServletResponse.class);
87          mockHttpServletResponse.expectAndReturn("encodeURL", expectedUrl,
88              expectedUrl);
89  
90          String result = UrlHelper.buildUrl("/path1/path2/myAction.action",
91              (HttpServletRequest) mockHttpServletRequest.proxy(),
92              (HttpServletResponse) mockHttpServletResponse.proxy(), null,
93              null, true, true, true);
94          assertEquals(expectedUrl, result);
95          mockHttpServletRequest.verify();
96      }        
97  
98      public void testBuildParametersStringWithUrlHavingSomeExistingParameters() throws Exception {
99          String expectedUrl = "http://localhost:8080/myContext/myPage.jsp?initParam=initValue&param1=value1&param2=value2";
100 
101         Map parameters = new LinkedHashMap();
102         parameters.put("param1", "value1");
103         parameters.put("param2", "value2");
104 
105         StringBuffer url = new StringBuffer("http://localhost:8080/myContext/myPage.jsp?initParam=initValue");
106 
107         UrlHelper.buildParametersString(parameters, url);
108 
109         assertEquals(
110            expectedUrl, url.toString());
111     }
112 
113     public void testBuildWithRootContext() {
114         String expectedUrl = "/MyAction.action";
115 
116         Mock mockHttpServletRequest = new Mock(HttpServletRequest.class);
117         mockHttpServletRequest.expectAndReturn("getContextPath", "/");
118         mockHttpServletRequest.expectAndReturn("getScheme", "http");
119 
120         Mock mockHttpServletResponse = new Mock(HttpServletResponse.class);
121         mockHttpServletResponse.expectAndReturn("encodeURL", expectedUrl, expectedUrl);
122 
123         String actualUrl = UrlHelper.buildUrl(expectedUrl, (HttpServletRequest) mockHttpServletRequest.proxy(),
124                 (HttpServletResponse) mockHttpServletResponse.proxy(), new HashMap());
125         assertEquals(expectedUrl, actualUrl);
126     }
127 
128     /***
129      * just one &, not &
130      */
131     public void testBuildUrlCorrectlyAddsAmp() {
132         String expectedString = "my.actionName?foo=bar&hello=world";
133         Mock mockHttpServletRequest = new Mock(HttpServletRequest.class);
134         mockHttpServletRequest.expectAndReturn("getScheme", "http");
135         Mock mockHttpServletResponse = new Mock(HttpServletResponse.class);
136         mockHttpServletResponse.expectAndReturn("encodeURL", expectedString, expectedString);
137 
138         String actionName = "my.actionName";
139         TreeMap params = new TreeMap();
140         params.put("hello", "world");
141         params.put("foo", "bar");
142 
143         String urlString = UrlHelper.buildUrl(actionName, (HttpServletRequest) mockHttpServletRequest.proxy(), (HttpServletResponse) mockHttpServletResponse.proxy(), params);
144         assertEquals(expectedString, urlString);
145     }
146 
147     public void testBuildUrlWithStringArray() {
148         String expectedString = "my.actionName?foo=bar&hello=earth&hello=mars";
149         Mock mockHttpServletRequest = new Mock(HttpServletRequest.class);
150         mockHttpServletRequest.expectAndReturn("getScheme", "http");
151         Mock mockHttpServletResponse = new Mock(HttpServletResponse.class);
152         mockHttpServletResponse.expectAndReturn("encodeURL", expectedString, expectedString);
153 
154         String actionName = "my.actionName";
155         TreeMap params = new TreeMap();
156         params.put("hello", new String[]{"earth", "mars"});
157         params.put("foo", "bar");
158 
159         String urlString = UrlHelper.buildUrl(actionName, (HttpServletRequest) mockHttpServletRequest.proxy(), (HttpServletResponse) mockHttpServletResponse.proxy(), params);
160         assertEquals(expectedString, urlString);
161     }
162 
163     /***
164      * The UrlHelper should build a URL that starts with "https" followed by the server name when the scheme of the
165      * current request is "http" and the port for the "https" scheme is 443.
166      */
167     public void testSwitchToHttpsScheme() {
168         String expectedString = "https://www.mydomain.com/mywebapp/MyAction.action?foo=bar&hello=earth&hello=mars";
169 
170         Mock mockHttpServletRequest = new Mock(HttpServletRequest.class);
171         mockHttpServletRequest.expectAndReturn("getServerName", "www.mydomain.com");
172         mockHttpServletRequest.expectAndReturn("getScheme", "http");
173         mockHttpServletRequest.expectAndReturn("getServerPort", 80);
174         mockHttpServletRequest.expectAndReturn("getContextPath", "/mywebapp");
175 
176         Mock mockHttpServletResponse = new Mock(HttpServletResponse.class);
177         mockHttpServletResponse.expectAndReturn("encodeURL", expectedString, expectedString);
178 
179         String actionName = "/MyAction.action";
180         TreeMap params = new TreeMap();
181         params.put("hello", new String[]{"earth", "mars"});
182         params.put("foo", "bar");
183 
184         String urlString = UrlHelper.buildUrl(actionName, (HttpServletRequest) mockHttpServletRequest.proxy(), (HttpServletResponse) mockHttpServletResponse.proxy(), params, "https", true, true);
185         assertEquals(expectedString, urlString);
186     }
187 
188     /***
189      * The UrlHelper should build a URL that starts with "http" followed by the server name when the scheme of the
190      * current request is "https" and the port for the "http" scheme is 80.
191      */
192     public void testSwitchToHttpScheme() {
193         String expectedString = "http://www.mydomain.com/mywebapp/MyAction.action?foo=bar&hello=earth&hello=mars";
194 
195         Mock mockHttpServletRequest = new Mock(HttpServletRequest.class);
196         mockHttpServletRequest.expectAndReturn("getServerName", "www.mydomain.com");
197         mockHttpServletRequest.expectAndReturn("getScheme", "https");
198         mockHttpServletRequest.expectAndReturn("getServerPort", 443);
199         mockHttpServletRequest.expectAndReturn("getContextPath", "/mywebapp");
200 
201         Mock mockHttpServletResponse = new Mock(HttpServletResponse.class);
202         mockHttpServletResponse.expectAndReturn("encodeURL", expectedString, expectedString);
203 
204         String actionName = "/MyAction.action";
205         TreeMap params = new TreeMap();
206         params.put("hello", new String[]{"earth", "mars"});
207         params.put("foo", "bar");
208 
209         String urlString = UrlHelper.buildUrl(actionName, (HttpServletRequest) mockHttpServletRequest.proxy(), (HttpServletResponse) mockHttpServletResponse.proxy(), params, "http", true, true);
210         assertEquals(expectedString, urlString);
211     }
212 
213     /***
214      * This test is similar to {@link #testSwitchToHttpsScheme()} with the HTTP port equal to 7001 and the HTTPS port
215      * equal to 7002.
216      */
217     public void testSwitchToHttpsNonDefaultPort() {
218 
219         String expectedString = "https://www.mydomain.com:7002/mywebapp/MyAction.action?foo=bar&hello=earth&hello=mars";
220 
221         UrlHelper.setHttpPort("7001");
222         UrlHelper.setHttpsPort("7002");
223 
224         Mock mockHttpServletRequest = new Mock(HttpServletRequest.class);
225         mockHttpServletRequest.expectAndReturn("getServerName", "www.mydomain.com");
226         mockHttpServletRequest.expectAndReturn("getScheme", "http");
227         mockHttpServletRequest.expectAndReturn("getServerPort", 7001);
228         mockHttpServletRequest.expectAndReturn("getContextPath", "/mywebapp");
229 
230         Mock mockHttpServletResponse = new Mock(HttpServletResponse.class);
231         mockHttpServletResponse.expectAndReturn("encodeURL", expectedString, expectedString);
232 
233         String actionName = "/MyAction.action";
234         TreeMap params = new TreeMap();
235         params.put("hello", new String[]{"earth", "mars"});
236         params.put("foo", "bar");
237 
238         String urlString = UrlHelper.buildUrl(actionName, (HttpServletRequest) mockHttpServletRequest.proxy(), (HttpServletResponse) mockHttpServletResponse.proxy(), params, "https", true, true);
239         assertEquals(expectedString, urlString);
240     }
241 
242     /***
243      * This test is similar to {@link #testSwitchToHttpScheme()} with the HTTP port equal to 7001 and the HTTPS port
244      * equal to port 7002.
245      */
246     public void testSwitchToHttpNonDefaultPort() {
247 
248         String expectedString = "http://www.mydomain.com:7001/mywebapp/MyAction.action?foo=bar&hello=earth&hello=mars";
249 
250         UrlHelper.setHttpPort("7001");
251         UrlHelper.setHttpsPort("7002");
252 
253         Mock mockHttpServletRequest = new Mock(HttpServletRequest.class);
254         mockHttpServletRequest.expectAndReturn("getServerName", "www.mydomain.com");
255         mockHttpServletRequest.expectAndReturn("getScheme", "https");
256         mockHttpServletRequest.expectAndReturn("getServerPort", 7002);
257         mockHttpServletRequest.expectAndReturn("getContextPath", "/mywebapp");
258 
259         Mock mockHttpServletResponse = new Mock(HttpServletResponse.class);
260         mockHttpServletResponse.expectAndReturn("encodeURL", expectedString, expectedString);
261 
262         String actionName = "/MyAction.action";
263         TreeMap params = new TreeMap();
264         params.put("hello", new String[]{"earth", "mars"});
265         params.put("foo", "bar");
266 
267         String urlString = UrlHelper.buildUrl(actionName, (HttpServletRequest) mockHttpServletRequest.proxy(), (HttpServletResponse) mockHttpServletResponse.proxy(), params, "http", true, true);
268         assertEquals(expectedString, urlString);
269     }
270 
271     /***
272      * The UrlHelper should build a URL that starts with "https" followed by the server name when the scheme of the
273      * current request is "http" and the port for the "https" scheme is 443. When the request has been forwarded
274      * in a Servlet 2.4 container, the UrlHelper should use the javax.servlet.forward.request_uri request attribute
275      * instead of a call to HttpServletRequest#getRequestURI().
276      */
277     public void testForwardedRequest() {
278         String expectedString = "https://www.example.com/mywebapp/product/widget/promo.html";
279 
280         Mock mockHttpServletRequest = new Mock(HttpServletRequest.class);
281         mockHttpServletRequest.expectAndReturn("getServerName", "www.example.com");
282         mockHttpServletRequest.expectAndReturn("getScheme", "http");
283         mockHttpServletRequest.expectAndReturn("getServerPort", 80);
284         mockHttpServletRequest.expectAndReturn("getContextPath", "/mywebapp");
285         mockHttpServletRequest.expectAndReturn("getAttribute", "javax.servlet.forward.request_uri", "/mywebapp/product/widget/");
286         mockHttpServletRequest.expectAndReturn("getRequestURI", "/mywebapp/");
287 
288         Mock mockHttpServletResponse = new Mock(HttpServletResponse.class);
289         mockHttpServletResponse.expectAndReturn("encodeURL", expectedString, expectedString);
290 
291         String actionName = "promo.html";
292         Map params = new TreeMap();
293 
294         String urlString = UrlHelper.buildUrl(actionName, (HttpServletRequest) mockHttpServletRequest.proxy(), (HttpServletResponse) mockHttpServletResponse.proxy(), params, "https", true, true);
295         assertEquals(expectedString, urlString);
296     }
297 
298 
299     public void testParseQuery() throws Exception {
300         Map result = UrlHelper.parseQueryString("aaa=aaaval&bbb=bbbval&ccc=");
301 
302         assertEquals(result.get("aaa"), "aaaval");
303         assertEquals(result.get("bbb"), "bbbval");
304         assertEquals(result.get("ccc"), "");
305     }
306 
307     public void testParseEmptyQuery() throws Exception {
308         Map result = UrlHelper.parseQueryString("");
309 
310         assertNotNull(result);
311         assertEquals(result.size(), 0);
312     }
313 
314     public void testParseNullQuery() throws Exception {
315         Map result = UrlHelper.parseQueryString(null);
316 
317         assertNotNull(result);
318         assertEquals(result.size(), 0);
319     }
320 
321     public void testParseMultiQuery() throws Exception {
322         Map result = UrlHelper.parseQueryString("param=1&param=1&param=1");
323         
324         assertNotNull(result);
325         assertEquals(result.size(), 1);
326         String values[] = (String[]) result.get("param");
327         Arrays.sort(values);
328         assertEquals(values.length, 3);
329         assertEquals(values[0], "1");
330         assertEquals(values[1], "1");
331         assertEquals(values[2], "1");
332     }
333 
334     public void testParseDuplicateQuery() throws Exception {
335         Map result = UrlHelper.parseQueryString("param=1&param=2&param=3");
336         
337         assertNotNull(result);
338         assertEquals(result.size(), 1);
339         String values[] = (String[]) result.get("param");
340         Arrays.sort(values);
341         assertEquals(values.length, 3);
342         assertEquals(values[0], "1");
343         assertEquals(values[1], "2");
344         assertEquals(values[2], "3");
345     }
346 
347     public void testTranslateAndEncode() throws Exception {
348         UrlHelper.setCustomEncoding("UTF-8");
349         String result = UrlHelper.translateAndEncode("\u65b0\u805e");
350         String expectedResult = "%E6%96%B0%E8%81%9E";
351 
352         assertEquals(result, expectedResult);
353     }
354 
355     public void testTranslateAndDecode() throws Exception {
356         UrlHelper.setCustomEncoding("UTF-8");
357         String result = UrlHelper.translateAndDecode("%E6%96%B0%E8%81%9E");
358         String expectedResult = "\u65b0\u805e";
359 
360         assertEquals(result, expectedResult);
361     }
362 }