View Javadoc

1   /*
2    * $Id: UrlHelperTest.java 565492 2007-08-13 20:00:08Z jholmes $
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      public void testForceAddSchemeHostAndPort() throws Exception {
44          String expectedUrl = "http://localhost/contextPath/path1/path2/myAction.action";
45  
46          Mock mockHttpServletRequest = new Mock(HttpServletRequest.class);
47          mockHttpServletRequest.expectAndReturn("getScheme", "http");
48          mockHttpServletRequest.expectAndReturn("getServerName", "localhost");
49          mockHttpServletRequest.expectAndReturn("getContextPath", "/contextPath");
50  	mockHttpServletRequest.expectAndReturn("getServerPort", 80);
51  	
52          Mock mockHttpServletResponse = new Mock(HttpServletResponse.class);
53          mockHttpServletResponse.expectAndReturn("encodeURL", expectedUrl, expectedUrl);
54  
55          String result = UrlHelper.buildUrl("/path1/path2/myAction.action", (HttpServletRequest) mockHttpServletRequest.proxy(), (HttpServletResponse)mockHttpServletResponse.proxy(), null, "http", true, true, true);
56          assertEquals(expectedUrl, result);
57          mockHttpServletRequest.verify();
58      }
59  
60      public void testDoNotForceAddSchemeHostAndPort() throws Exception {
61          String expectedUrl = "/contextPath/path1/path2/myAction.action";
62  
63          Mock mockHttpServletRequest = new Mock(HttpServletRequest.class);
64          mockHttpServletRequest.expectAndReturn("getScheme", "http");
65          mockHttpServletRequest.expectAndReturn("getServerName", "localhost");
66          mockHttpServletRequest.expectAndReturn("getContextPath", "/contextPath");
67  
68          Mock mockHttpServletResponse = new Mock(HttpServletResponse.class);
69          mockHttpServletResponse.expectAndReturn("encodeURL", expectedUrl, expectedUrl);
70  
71          String result = UrlHelper.buildUrl("/path1/path2/myAction.action", (HttpServletRequest)mockHttpServletRequest.proxy(), (HttpServletResponse)mockHttpServletResponse.proxy(), null, "http", true, true, false);
72  
73          assertEquals(expectedUrl, result);
74      }
75  
76      public void testForceAddSchemeHostAndPortWithNonStandardPort() throws Exception {
77          String expectedUrl = "http://localhost:9090/contextPath/path1/path2/myAction.action";
78  
79          Mock mockHttpServletRequest = new Mock(HttpServletRequest.class);
80          mockHttpServletRequest.expectAndReturn("getScheme", "http");
81          mockHttpServletRequest.expectAndReturn("getServerName", "localhost");
82          mockHttpServletRequest.expectAndReturn("getContextPath", "/contextPath");
83          mockHttpServletRequest.expectAndReturn("getServerPort", 9090);
84  
85          Mock mockHttpServletResponse = new Mock(HttpServletResponse.class);
86          mockHttpServletResponse.expectAndReturn("encodeURL", expectedUrl, expectedUrl);
87  
88          String result = UrlHelper.buildUrl("/path1/path2/myAction.action", (HttpServletRequest) mockHttpServletRequest.proxy(), (HttpServletResponse)mockHttpServletResponse.proxy(), null, "http", true, true, true);
89          assertEquals(expectedUrl, result);
90          mockHttpServletRequest.verify();
91      }
92      
93      public void testForceAddNullSchemeHostAndPort() throws Exception {
94          String expectedUrl = "http://localhost/contextPath/path1/path2/myAction.action";
95  
96          Mock mockHttpServletRequest = new Mock(HttpServletRequest.class);
97          mockHttpServletRequest.expectAndReturn("getScheme", "http");
98          mockHttpServletRequest.expectAndReturn("getServerName", "localhost");
99          mockHttpServletRequest.expectAndReturn("getContextPath", "/contextPath");
100 
101         Mock mockHttpServletResponse = new Mock(HttpServletResponse.class);
102         mockHttpServletResponse.expectAndReturn("encodeURL", expectedUrl,
103             expectedUrl);
104 
105         String result = UrlHelper.buildUrl("/path1/path2/myAction.action",
106             (HttpServletRequest) mockHttpServletRequest.proxy(),
107             (HttpServletResponse) mockHttpServletResponse.proxy(), null,
108             null, true, true, true);
109         assertEquals(expectedUrl, result);
110         mockHttpServletRequest.verify();
111     }        
112 
113     public void testBuildParametersStringWithUrlHavingSomeExistingParameters() throws Exception {
114         String expectedUrl = "http://localhost:8080/myContext/myPage.jsp?initParam=initValue&param1=value1&param2=value2";
115 
116         Map parameters = new LinkedHashMap();
117         parameters.put("param1", "value1");
118         parameters.put("param2", "value2");
119 
120         StringBuffer url = new StringBuffer("http://localhost:8080/myContext/myPage.jsp?initParam=initValue");
121 
122         UrlHelper.buildParametersString(parameters, url);
123 
124         assertEquals(
125            expectedUrl, url.toString());
126     }
127 
128     public void testBuildWithRootContext() {
129         String expectedUrl = "/MyAction.action";
130 
131         Mock mockHttpServletRequest = new Mock(HttpServletRequest.class);
132         mockHttpServletRequest.expectAndReturn("getContextPath", "/");
133         mockHttpServletRequest.expectAndReturn("getScheme", "http");
134 
135         Mock mockHttpServletResponse = new Mock(HttpServletResponse.class);
136         mockHttpServletResponse.expectAndReturn("encodeURL", expectedUrl, expectedUrl);
137 
138         String actualUrl = UrlHelper.buildUrl(expectedUrl, (HttpServletRequest) mockHttpServletRequest.proxy(),
139                 (HttpServletResponse) mockHttpServletResponse.proxy(), new HashMap());
140         assertEquals(expectedUrl, actualUrl);
141     }
142 
143     /***
144      * just one &, not &
145      */
146     public void testBuildUrlCorrectlyAddsAmp() {
147         String expectedString = "my.actionName?foo=bar&hello=world";
148         Mock mockHttpServletRequest = new Mock(HttpServletRequest.class);
149         mockHttpServletRequest.expectAndReturn("getScheme", "http");
150         Mock mockHttpServletResponse = new Mock(HttpServletResponse.class);
151         mockHttpServletResponse.expectAndReturn("encodeURL", expectedString, expectedString);
152 
153         String actionName = "my.actionName";
154         TreeMap params = new TreeMap();
155         params.put("hello", "world");
156         params.put("foo", "bar");
157 
158         String urlString = UrlHelper.buildUrl(actionName, (HttpServletRequest) mockHttpServletRequest.proxy(), (HttpServletResponse) mockHttpServletResponse.proxy(), params);
159         assertEquals(expectedString, urlString);
160     }
161 
162     public void testBuildUrlCorrectlyAddsDoNotEscapeAmp() {
163         String expectedString = "my.actionName?foo=bar&hello=world";
164         Mock mockHttpServletRequest = new Mock(HttpServletRequest.class);
165         mockHttpServletRequest.expectAndReturn("getScheme", "http");
166         Mock mockHttpServletResponse = new Mock(HttpServletResponse.class);
167         mockHttpServletResponse.expectAndReturn("encodeURL", expectedString, expectedString);
168 
169         String actionName = "my.actionName";
170         TreeMap params = new TreeMap();
171         params.put("hello", "world");
172         params.put("foo", "bar");
173 
174         String urlString = UrlHelper.buildUrl(actionName, (HttpServletRequest) mockHttpServletRequest.proxy(), (HttpServletResponse) mockHttpServletResponse.proxy(), params, null, true, true, false, false);
175         assertEquals(expectedString, urlString);
176     }
177 
178     public void testBuildUrlWithStringArray() {
179         String expectedString = "my.actionName?foo=bar&hello=earth&hello=mars";
180         Mock mockHttpServletRequest = new Mock(HttpServletRequest.class);
181         mockHttpServletRequest.expectAndReturn("getScheme", "http");
182         Mock mockHttpServletResponse = new Mock(HttpServletResponse.class);
183         mockHttpServletResponse.expectAndReturn("encodeURL", expectedString, expectedString);
184 
185         String actionName = "my.actionName";
186         TreeMap params = new TreeMap();
187         params.put("hello", new String[]{"earth", "mars"});
188         params.put("foo", "bar");
189 
190         String urlString = UrlHelper.buildUrl(actionName, (HttpServletRequest) mockHttpServletRequest.proxy(), (HttpServletResponse) mockHttpServletResponse.proxy(), params);
191         assertEquals(expectedString, urlString);
192     }
193 
194     /***
195      * The UrlHelper should build a URL that starts with "https" followed by the server name when the scheme of the
196      * current request is "http" and the port for the "https" scheme is 443.
197      */
198     public void testSwitchToHttpsScheme() {
199         String expectedString = "https://www.mydomain.com/mywebapp/MyAction.action?foo=bar&hello=earth&hello=mars";
200 
201         Mock mockHttpServletRequest = new Mock(HttpServletRequest.class);
202         mockHttpServletRequest.expectAndReturn("getServerName", "www.mydomain.com");
203         mockHttpServletRequest.expectAndReturn("getScheme", "http");
204         mockHttpServletRequest.expectAndReturn("getServerPort", 80);
205         mockHttpServletRequest.expectAndReturn("getContextPath", "/mywebapp");
206 
207         Mock mockHttpServletResponse = new Mock(HttpServletResponse.class);
208         mockHttpServletResponse.expectAndReturn("encodeURL", expectedString, expectedString);
209 
210         String actionName = "/MyAction.action";
211         TreeMap params = new TreeMap();
212         params.put("hello", new String[]{"earth", "mars"});
213         params.put("foo", "bar");
214 
215         String urlString = UrlHelper.buildUrl(actionName, (HttpServletRequest) mockHttpServletRequest.proxy(), (HttpServletResponse) mockHttpServletResponse.proxy(), params, "https", true, true);
216         assertEquals(expectedString, urlString);
217     }
218 
219     /***
220      * The UrlHelper should build a URL that starts with "http" followed by the server name when the scheme of the
221      * current request is "https" and the port for the "http" scheme is 80.
222      */
223     public void testSwitchToHttpScheme() {
224         String expectedString = "http://www.mydomain.com/mywebapp/MyAction.action?foo=bar&hello=earth&hello=mars";
225 
226         Mock mockHttpServletRequest = new Mock(HttpServletRequest.class);
227         mockHttpServletRequest.expectAndReturn("getServerName", "www.mydomain.com");
228         mockHttpServletRequest.expectAndReturn("getScheme", "https");
229         mockHttpServletRequest.expectAndReturn("getServerPort", 443);
230         mockHttpServletRequest.expectAndReturn("getContextPath", "/mywebapp");
231 
232         Mock mockHttpServletResponse = new Mock(HttpServletResponse.class);
233         mockHttpServletResponse.expectAndReturn("encodeURL", expectedString, expectedString);
234 
235         String actionName = "/MyAction.action";
236         TreeMap params = new TreeMap();
237         params.put("hello", new String[]{"earth", "mars"});
238         params.put("foo", "bar");
239 
240         String urlString = UrlHelper.buildUrl(actionName, (HttpServletRequest) mockHttpServletRequest.proxy(), (HttpServletResponse) mockHttpServletResponse.proxy(), params, "http", true, true);
241         assertEquals(expectedString, urlString);
242     }
243 
244     /***
245      * This test is similar to {@link #testSwitchToHttpsScheme()} with the HTTP port equal to 7001 and the HTTPS port
246      * equal to 7002.
247      */
248     public void testSwitchToHttpsNonDefaultPort() {
249 
250         String expectedString = "https://www.mydomain.com:7002/mywebapp/MyAction.action?foo=bar&hello=earth&hello=mars";
251 
252         UrlHelper.setHttpPort("7001");
253         UrlHelper.setHttpsPort("7002");
254 
255         Mock mockHttpServletRequest = new Mock(HttpServletRequest.class);
256         mockHttpServletRequest.expectAndReturn("getServerName", "www.mydomain.com");
257         mockHttpServletRequest.expectAndReturn("getScheme", "http");
258         mockHttpServletRequest.expectAndReturn("getServerPort", 7001);
259         mockHttpServletRequest.expectAndReturn("getContextPath", "/mywebapp");
260 
261         Mock mockHttpServletResponse = new Mock(HttpServletResponse.class);
262         mockHttpServletResponse.expectAndReturn("encodeURL", expectedString, expectedString);
263 
264         String actionName = "/MyAction.action";
265         TreeMap params = new TreeMap();
266         params.put("hello", new String[]{"earth", "mars"});
267         params.put("foo", "bar");
268 
269         String urlString = UrlHelper.buildUrl(actionName, (HttpServletRequest) mockHttpServletRequest.proxy(), (HttpServletResponse) mockHttpServletResponse.proxy(), params, "https", true, true);
270         assertEquals(expectedString, urlString);
271     }
272 
273     /***
274      * This test is similar to {@link #testSwitchToHttpScheme()} with the HTTP port equal to 7001 and the HTTPS port
275      * equal to port 7002.
276      */
277     public void testSwitchToHttpNonDefaultPort() {
278 
279         String expectedString = "http://www.mydomain.com:7001/mywebapp/MyAction.action?foo=bar&hello=earth&hello=mars";
280 
281         UrlHelper.setHttpPort("7001");
282         UrlHelper.setHttpsPort("7002");
283 
284         Mock mockHttpServletRequest = new Mock(HttpServletRequest.class);
285         mockHttpServletRequest.expectAndReturn("getServerName", "www.mydomain.com");
286         mockHttpServletRequest.expectAndReturn("getScheme", "https");
287         mockHttpServletRequest.expectAndReturn("getServerPort", 7002);
288         mockHttpServletRequest.expectAndReturn("getContextPath", "/mywebapp");
289 
290         Mock mockHttpServletResponse = new Mock(HttpServletResponse.class);
291         mockHttpServletResponse.expectAndReturn("encodeURL", expectedString, expectedString);
292 
293         String actionName = "/MyAction.action";
294         TreeMap params = new TreeMap();
295         params.put("hello", new String[]{"earth", "mars"});
296         params.put("foo", "bar");
297 
298         String urlString = UrlHelper.buildUrl(actionName, (HttpServletRequest) mockHttpServletRequest.proxy(), (HttpServletResponse) mockHttpServletResponse.proxy(), params, "http", true, true);
299         assertEquals(expectedString, urlString);
300     }
301 
302     /***
303      * The UrlHelper should build a URL that starts with "https" followed by the server name when the scheme of the
304      * current request is "http" and the port for the "https" scheme is 443. When the request has been forwarded
305      * in a Servlet 2.4 container, the UrlHelper should use the javax.servlet.forward.request_uri request attribute
306      * instead of a call to HttpServletRequest#getRequestURI().
307      */
308     public void testForwardedRequest() {
309         String expectedString = "https://www.example.com/mywebapp/product/widget/promo.html";
310 
311         Mock mockHttpServletRequest = new Mock(HttpServletRequest.class);
312         mockHttpServletRequest.expectAndReturn("getServerName", "www.example.com");
313         mockHttpServletRequest.expectAndReturn("getScheme", "http");
314         mockHttpServletRequest.expectAndReturn("getServerPort", 80);
315         mockHttpServletRequest.expectAndReturn("getContextPath", "/mywebapp");
316         mockHttpServletRequest.expectAndReturn("getAttribute", "javax.servlet.forward.request_uri", "/mywebapp/product/widget/");
317         mockHttpServletRequest.expectAndReturn("getRequestURI", "/mywebapp/");
318 
319         Mock mockHttpServletResponse = new Mock(HttpServletResponse.class);
320         mockHttpServletResponse.expectAndReturn("encodeURL", expectedString, expectedString);
321 
322         String actionName = "promo.html";
323         Map params = new TreeMap();
324 
325         String urlString = UrlHelper.buildUrl(actionName, (HttpServletRequest) mockHttpServletRequest.proxy(), (HttpServletResponse) mockHttpServletResponse.proxy(), params, "https", true, true);
326         assertEquals(expectedString, urlString);
327     }
328 
329 
330     public void testParseQuery() throws Exception {
331         Map result = UrlHelper.parseQueryString("aaa=aaaval&bbb=bbbval&ccc=");
332 
333         assertEquals(result.get("aaa"), "aaaval");
334         assertEquals(result.get("bbb"), "bbbval");
335         assertEquals(result.get("ccc"), "");
336     }
337 
338     public void testParseEmptyQuery() throws Exception {
339         Map result = UrlHelper.parseQueryString("");
340 
341         assertNotNull(result);
342         assertEquals(result.size(), 0);
343     }
344 
345     public void testParseNullQuery() throws Exception {
346         Map result = UrlHelper.parseQueryString(null);
347 
348         assertNotNull(result);
349         assertEquals(result.size(), 0);
350     }
351 
352     public void testParseMultiQuery() throws Exception {
353         Map result = UrlHelper.parseQueryString("param=1&param=1&param=1");
354         
355         assertNotNull(result);
356         assertEquals(result.size(), 1);
357         String values[] = (String[]) result.get("param");
358         Arrays.sort(values);
359         assertEquals(values.length, 3);
360         assertEquals(values[0], "1");
361         assertEquals(values[1], "1");
362         assertEquals(values[2], "1");
363     }
364 
365     public void testParseDuplicateQuery() throws Exception {
366         Map result = UrlHelper.parseQueryString("param=1&param=2&param=3");
367         
368         assertNotNull(result);
369         assertEquals(result.size(), 1);
370         String values[] = (String[]) result.get("param");
371         Arrays.sort(values);
372         assertEquals(values.length, 3);
373         assertEquals(values[0], "1");
374         assertEquals(values[1], "2");
375         assertEquals(values[2], "3");
376     }
377 
378     public void testTranslateAndEncode() throws Exception {
379         UrlHelper.setCustomEncoding("UTF-8");
380         String result = UrlHelper.translateAndEncode("\u65b0\u805e");
381         String expectedResult = "%E6%96%B0%E8%81%9E";
382 
383         assertEquals(result, expectedResult);
384     }
385 
386     public void testTranslateAndDecode() throws Exception {
387         UrlHelper.setCustomEncoding("UTF-8");
388         String result = UrlHelper.translateAndDecode("%E6%96%B0%E8%81%9E");
389         String expectedResult = "\u65b0\u805e";
390 
391         assertEquals(result, expectedResult);
392     }
393 }