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.HashMap;
24 import java.util.LinkedHashMap;
25 import java.util.Map;
26 import java.util.TreeMap;
27
28 import javax.servlet.http.HttpServletRequest;
29 import javax.servlet.http.HttpServletResponse;
30
31 import org.apache.struts2.StrutsConstants;
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
114
115 public void testBuildWithRootContext() {
116 String expectedUrl = "/MyAction.action";
117
118 Mock mockHttpServletRequest = new Mock(HttpServletRequest.class);
119 mockHttpServletRequest.expectAndReturn("getContextPath", "/");
120 mockHttpServletRequest.expectAndReturn("getScheme", "http");
121
122 Mock mockHttpServletResponse = new Mock(HttpServletResponse.class);
123 mockHttpServletResponse.expectAndReturn("encodeURL", expectedUrl, expectedUrl);
124
125 String actualUrl = UrlHelper.buildUrl(expectedUrl, (HttpServletRequest) mockHttpServletRequest.proxy(),
126 (HttpServletResponse) mockHttpServletResponse.proxy(), new HashMap());
127 assertEquals(expectedUrl, actualUrl);
128 }
129
130 /***
131 * just one &, not &
132 */
133 public void testBuildUrlCorrectlyAddsAmp() {
134 String expectedString = "my.actionName?foo=bar&hello=world";
135 Mock mockHttpServletRequest = new Mock(HttpServletRequest.class);
136 mockHttpServletRequest.expectAndReturn("getScheme", "http");
137 Mock mockHttpServletResponse = new Mock(HttpServletResponse.class);
138 mockHttpServletResponse.expectAndReturn("encodeURL", expectedString, expectedString);
139
140 String actionName = "my.actionName";
141 TreeMap params = new TreeMap();
142 params.put("hello", "world");
143 params.put("foo", "bar");
144
145 String urlString = UrlHelper.buildUrl(actionName, (HttpServletRequest) mockHttpServletRequest.proxy(), (HttpServletResponse) mockHttpServletResponse.proxy(), params);
146 assertEquals(expectedString, urlString);
147 }
148
149 public void testBuildUrlWithStringArray() {
150 String expectedString = "my.actionName?foo=bar&hello=earth&hello=mars";
151 Mock mockHttpServletRequest = new Mock(HttpServletRequest.class);
152 mockHttpServletRequest.expectAndReturn("getScheme", "http");
153 Mock mockHttpServletResponse = new Mock(HttpServletResponse.class);
154 mockHttpServletResponse.expectAndReturn("encodeURL", expectedString, expectedString);
155
156 String actionName = "my.actionName";
157 TreeMap params = new TreeMap();
158 params.put("hello", new String[]{"earth", "mars"});
159 params.put("foo", "bar");
160
161 String urlString = UrlHelper.buildUrl(actionName, (HttpServletRequest) mockHttpServletRequest.proxy(), (HttpServletResponse) mockHttpServletResponse.proxy(), params);
162 assertEquals(expectedString, urlString);
163 }
164
165 /***
166 * The UrlHelper should build a URL that starts with "https" followed by the server name when the scheme of the
167 * current request is "http" and the port for the "https" scheme is 443.
168 */
169 public void testSwitchToHttpsScheme() {
170 String expectedString = "https://www.mydomain.com/mywebapp/MyAction.action?foo=bar&hello=earth&hello=mars";
171
172 Mock mockHttpServletRequest = new Mock(HttpServletRequest.class);
173 mockHttpServletRequest.expectAndReturn("getServerName", "www.mydomain.com");
174 mockHttpServletRequest.expectAndReturn("getScheme", "http");
175 mockHttpServletRequest.expectAndReturn("getServerPort", 80);
176 mockHttpServletRequest.expectAndReturn("getContextPath", "/mywebapp");
177
178 Mock mockHttpServletResponse = new Mock(HttpServletResponse.class);
179 mockHttpServletResponse.expectAndReturn("encodeURL", expectedString, expectedString);
180
181 String actionName = "/MyAction.action";
182 TreeMap params = new TreeMap();
183 params.put("hello", new String[]{"earth", "mars"});
184 params.put("foo", "bar");
185
186 String urlString = UrlHelper.buildUrl(actionName, (HttpServletRequest) mockHttpServletRequest.proxy(), (HttpServletResponse) mockHttpServletResponse.proxy(), params, "https", true, true);
187 assertEquals(expectedString, urlString);
188 }
189
190 /***
191 * The UrlHelper should build a URL that starts with "http" followed by the server name when the scheme of the
192 * current request is "https" and the port for the "http" scheme is 80.
193 */
194 public void testSwitchToHttpScheme() {
195 String expectedString = "http://www.mydomain.com/mywebapp/MyAction.action?foo=bar&hello=earth&hello=mars";
196
197 Mock mockHttpServletRequest = new Mock(HttpServletRequest.class);
198 mockHttpServletRequest.expectAndReturn("getServerName", "www.mydomain.com");
199 mockHttpServletRequest.expectAndReturn("getScheme", "https");
200 mockHttpServletRequest.expectAndReturn("getServerPort", 443);
201 mockHttpServletRequest.expectAndReturn("getContextPath", "/mywebapp");
202
203 Mock mockHttpServletResponse = new Mock(HttpServletResponse.class);
204 mockHttpServletResponse.expectAndReturn("encodeURL", expectedString, expectedString);
205
206 String actionName = "/MyAction.action";
207 TreeMap params = new TreeMap();
208 params.put("hello", new String[]{"earth", "mars"});
209 params.put("foo", "bar");
210
211 String urlString = UrlHelper.buildUrl(actionName, (HttpServletRequest) mockHttpServletRequest.proxy(), (HttpServletResponse) mockHttpServletResponse.proxy(), params, "http", true, true);
212 assertEquals(expectedString, urlString);
213 }
214
215 /***
216 * This test is similar to {@link #testSwitchToHttpsScheme()} with the HTTP port equal to 7001 and the HTTPS port
217 * equal to 7002.
218 */
219 public void testSwitchToHttpsNonDefaultPort() {
220
221 String expectedString = "https://www.mydomain.com:7002/mywebapp/MyAction.action?foo=bar&hello=earth&hello=mars";
222
223 UrlHelper.setHttpPort("7001");
224 UrlHelper.setHttpsPort("7002");
225
226 Mock mockHttpServletRequest = new Mock(HttpServletRequest.class);
227 mockHttpServletRequest.expectAndReturn("getServerName", "www.mydomain.com");
228 mockHttpServletRequest.expectAndReturn("getScheme", "http");
229 mockHttpServletRequest.expectAndReturn("getServerPort", 7001);
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, "https", true, true);
241 assertEquals(expectedString, urlString);
242 }
243
244 /***
245 * This test is similar to {@link #testSwitchToHttpScheme()} with the HTTP port equal to 7001 and the HTTPS port
246 * equal to port 7002.
247 */
248 public void testSwitchToHttpNonDefaultPort() {
249
250 String expectedString = "http://www.mydomain.com:7001/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", "https");
258 mockHttpServletRequest.expectAndReturn("getServerPort", 7002);
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, "http", true, true);
270 assertEquals(expectedString, urlString);
271 }
272
273 /***
274 * The UrlHelper should build a URL that starts with "https" followed by the server name when the scheme of the
275 * current request is "http" and the port for the "https" scheme is 443. When the request has been forwarded
276 * in a Servlet 2.4 container, the UrlHelper should use the javax.servlet.forward.request_uri request attribute
277 * instead of a call to HttpServletRequest#getRequestURI().
278 */
279 public void testForwardedRequest() {
280 String expectedString = "https://www.example.com/mywebapp/product/widget/promo.html";
281
282 Mock mockHttpServletRequest = new Mock(HttpServletRequest.class);
283 mockHttpServletRequest.expectAndReturn("getServerName", "www.example.com");
284 mockHttpServletRequest.expectAndReturn("getScheme", "http");
285 mockHttpServletRequest.expectAndReturn("getServerPort", 80);
286 mockHttpServletRequest.expectAndReturn("getContextPath", "/mywebapp");
287 mockHttpServletRequest.expectAndReturn("getAttribute", "javax.servlet.forward.request_uri", "/mywebapp/product/widget/");
288 mockHttpServletRequest.expectAndReturn("getRequestURI", "/mywebapp/");
289
290 Mock mockHttpServletResponse = new Mock(HttpServletResponse.class);
291 mockHttpServletResponse.expectAndReturn("encodeURL", expectedString, expectedString);
292
293 String actionName = "promo.html";
294 Map params = new TreeMap();
295
296 String urlString = UrlHelper.buildUrl(actionName, (HttpServletRequest) mockHttpServletRequest.proxy(), (HttpServletResponse) mockHttpServletResponse.proxy(), params, "https", true, true);
297 assertEquals(expectedString, urlString);
298 }
299
300
301 public void testParseQuery() throws Exception {
302 Map result = UrlHelper.parseQueryString("aaa=aaaval&bbb=bbbval&ccc=");
303
304 assertEquals(result.get("aaa"), "aaaval");
305 assertEquals(result.get("bbb"), "bbbval");
306 assertEquals(result.get("ccc"), "");
307 }
308
309 public void testParseEmptyQuery() throws Exception {
310 Map result = UrlHelper.parseQueryString("");
311
312 assertNotNull(result);
313 assertEquals(result.size(), 0);
314 }
315
316 public void testParseNullQuery() throws Exception {
317 Map result = UrlHelper.parseQueryString(null);
318
319 assertNotNull(result);
320 assertEquals(result.size(), 0);
321 }
322
323
324 public void testTranslateAndEncode() throws Exception {
325 UrlHelper.setCustomEncoding("UTF-8");
326 String result = UrlHelper.translateAndEncode("\u65b0\u805e");
327 String expectedResult = "%E6%96%B0%E8%81%9E";
328
329 assertEquals(result, expectedResult);
330 }
331
332 public void testTranslateAndDecode() throws Exception {
333 UrlHelper.setCustomEncoding("UTF-8");
334 String result = UrlHelper.translateAndDecode("%E6%96%B0%E8%81%9E");
335 String expectedResult = "\u65b0\u805e";
336
337 assertEquals(result, expectedResult);
338 }
339 }