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
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¶m=1¶m=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¶m=2¶m=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 }