1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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¶m=1¶m=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¶m=2¶m=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 }