1 /*
2  * Copyright 2002-2007 the original author or authors.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package org.springframework.web.bind;
18 
19 import static org.junit.Assert.*;
20 
21 import org.junit.Test;
22 import org.springframework.mock.web.MockHttpServletRequest;
23 import org.springframework.util.StopWatch;
24 
25 /**
26  * @author Juergen Hoeller
27  * @author Chris Beams
28  * @since 06.08.2003
29  */
30 public class ServletRequestUtilsTests {
31 
32 	@Test
testIntParameter()33 	public void testIntParameter() throws ServletRequestBindingException {
34 		MockHttpServletRequest request = new MockHttpServletRequest();
35 		request.addParameter("param1", "5");
36 		request.addParameter("param2", "e");
37 		request.addParameter("paramEmpty", "");
38 
39 		assertEquals(ServletRequestUtils.getIntParameter(request, "param1"), new Integer(5));
40 		assertEquals(ServletRequestUtils.getIntParameter(request, "param1", 6), 5);
41 		assertEquals(ServletRequestUtils.getRequiredIntParameter(request, "param1"), 5);
42 
43 		assertEquals(ServletRequestUtils.getIntParameter(request, "param2", 6), 6);
44 		try {
45 			ServletRequestUtils.getRequiredIntParameter(request, "param2");
46 			fail("Should have thrown ServletRequestBindingException");
47 		}
48 		catch (ServletRequestBindingException ex) {
49 			// expected
50 		}
51 
52 		assertEquals(ServletRequestUtils.getIntParameter(request, "param3"), null);
53 		assertEquals(ServletRequestUtils.getIntParameter(request, "param3", 6), 6);
54 		try {
55 			ServletRequestUtils.getRequiredIntParameter(request, "param3");
56 			fail("Should have thrown ServletRequestBindingException");
57 		}
58 		catch (ServletRequestBindingException ex) {
59 			// expected
60 		}
61 
62 		try {
63 			ServletRequestUtils.getRequiredIntParameter(request, "paramEmpty");
64 			fail("Should have thrown ServletRequestBindingException");
65 		}
66 		catch (ServletRequestBindingException ex) {
67 			// expected
68 		}
69 	}
70 
71 	@Test
testIntParameters()72 	public void testIntParameters() throws ServletRequestBindingException {
73 		MockHttpServletRequest request = new MockHttpServletRequest();
74 		request.addParameter("param", new String[] {"1", "2", "3"});
75 
76 		request.addParameter("param2", "1");
77 		request.addParameter("param2", "2");
78 		request.addParameter("param2", "bogus");
79 
80 		int[] array = new int[] {1, 2, 3};
81 		int[] values = ServletRequestUtils.getRequiredIntParameters(request, "param");
82 		assertEquals(3, values.length);
83 		for (int i = 0; i < array.length; i++) {
84 			assertEquals(array[i], values[i]);
85 		}
86 
87 		try {
88 			ServletRequestUtils.getRequiredIntParameters(request, "param2");
89 			fail("Should have thrown ServletRequestBindingException");
90 		}
91 		catch (ServletRequestBindingException ex) {
92 			// expected
93 		}
94 	}
95 
96 	@Test
testLongParameter()97 	public void testLongParameter() throws ServletRequestBindingException {
98 		MockHttpServletRequest request = new MockHttpServletRequest();
99 		request.addParameter("param1", "5");
100 		request.addParameter("param2", "e");
101 		request.addParameter("paramEmpty", "");
102 
103 		assertEquals(ServletRequestUtils.getLongParameter(request, "param1"), new Long(5L));
104 		assertEquals(ServletRequestUtils.getLongParameter(request, "param1", 6L), 5L);
105 		assertEquals(ServletRequestUtils.getRequiredIntParameter(request, "param1"), 5L);
106 
107 		assertEquals(ServletRequestUtils.getLongParameter(request, "param2", 6L), 6L);
108 		try {
109 			ServletRequestUtils.getRequiredLongParameter(request, "param2");
110 			fail("Should have thrown ServletRequestBindingException");
111 		}
112 		catch (ServletRequestBindingException ex) {
113 			// expected
114 		}
115 
116 		assertEquals(ServletRequestUtils.getLongParameter(request, "param3"), null);
117 		assertEquals(ServletRequestUtils.getLongParameter(request, "param3", 6L), 6L);
118 		try {
119 			ServletRequestUtils.getRequiredLongParameter(request, "param3");
120 			fail("Should have thrown ServletRequestBindingException");
121 		}
122 		catch (ServletRequestBindingException ex) {
123 			// expected
124 		}
125 
126 		try {
127 			ServletRequestUtils.getRequiredLongParameter(request, "paramEmpty");
128 			fail("Should have thrown ServletRequestBindingException");
129 		}
130 		catch (ServletRequestBindingException ex) {
131 			// expected
132 		}
133 	}
134 
135 	@Test
testLongParameters()136 	public void testLongParameters() throws ServletRequestBindingException {
137 		MockHttpServletRequest request = new MockHttpServletRequest();
138 		request.setParameter("param", new String[] {"1", "2", "3"});
139 
140 		request.setParameter("param2", "0");
141 		request.setParameter("param2", "1");
142 		request.addParameter("param2", "2");
143 		request.addParameter("param2", "bogus");
144 
145 		long[] array = new long[] {1L, 2L, 3L};
146 		long[] values = ServletRequestUtils.getRequiredLongParameters(request, "param");
147 		assertEquals(3, values.length);
148 		for (int i = 0; i < array.length; i++) {
149 			assertEquals(array[i], values[i]);
150 		}
151 
152 		try {
153 			ServletRequestUtils.getRequiredLongParameters(request, "param2");
154 			fail("Should have thrown ServletRequestBindingException");
155 		}
156 		catch (ServletRequestBindingException ex) {
157 			// expected
158 		}
159 
160 		request.setParameter("param2", new String[] {"1", "2"});
161 		values = ServletRequestUtils.getRequiredLongParameters(request, "param2");
162 		assertEquals(2, values.length);
163 		assertEquals(1, values[0]);
164 		assertEquals(2, values[1]);
165 
166 		request.removeParameter("param2");
167 		try {
168 			ServletRequestUtils.getRequiredLongParameters(request, "param2");
169 			fail("Should have thrown ServletRequestBindingException");
170 		}
171 		catch (ServletRequestBindingException ex) {
172 			// expected
173 		}
174 	}
175 
176 	@Test
testFloatParameter()177 	public void testFloatParameter() throws ServletRequestBindingException {
178 		MockHttpServletRequest request = new MockHttpServletRequest();
179 		request.addParameter("param1", "5.5");
180 		request.addParameter("param2", "e");
181 		request.addParameter("paramEmpty", "");
182 
183 		assertTrue(ServletRequestUtils.getFloatParameter(request, "param1").equals(new Float(5.5f)));
184 		assertTrue(ServletRequestUtils.getFloatParameter(request, "param1", 6.5f) == 5.5f);
185 		assertTrue(ServletRequestUtils.getRequiredFloatParameter(request, "param1") == 5.5f);
186 
187 		assertTrue(ServletRequestUtils.getFloatParameter(request, "param2", 6.5f) == 6.5f);
188 		try {
189 			ServletRequestUtils.getRequiredFloatParameter(request, "param2");
190 			fail("Should have thrown ServletRequestBindingException");
191 		}
192 		catch (ServletRequestBindingException ex) {
193 			// expected
194 		}
195 
196 		assertTrue(ServletRequestUtils.getFloatParameter(request, "param3") == null);
197 		assertTrue(ServletRequestUtils.getFloatParameter(request, "param3", 6.5f) == 6.5f);
198 		try {
199 			ServletRequestUtils.getRequiredFloatParameter(request, "param3");
200 			fail("Should have thrown ServletRequestBindingException");
201 		}
202 		catch (ServletRequestBindingException ex) {
203 			// expected
204 		}
205 
206 		try {
207 			ServletRequestUtils.getRequiredFloatParameter(request, "paramEmpty");
208 			fail("Should have thrown ServletRequestBindingException");
209 		}
210 		catch (ServletRequestBindingException ex) {
211 			// expected
212 		}
213 	}
214 
215 	@Test
testFloatParameters()216 	public void testFloatParameters() throws ServletRequestBindingException {
217 		MockHttpServletRequest request = new MockHttpServletRequest();
218 		request.addParameter("param", new String[] {"1.5", "2.5", "3"});
219 
220 		request.addParameter("param2", "1.5");
221 		request.addParameter("param2", "2");
222 		request.addParameter("param2", "bogus");
223 
224 		float[] array = new float[] {1.5F, 2.5F, 3};
225 		float[] values = ServletRequestUtils.getRequiredFloatParameters(request, "param");
226 		assertEquals(3, values.length);
227 		for (int i = 0; i < array.length; i++) {
228 			assertEquals(array[i], values[i], 0);
229 		}
230 
231 		try {
232 			ServletRequestUtils.getRequiredFloatParameters(request, "param2");
233 			fail("Should have thrown ServletRequestBindingException");
234 		}
235 		catch (ServletRequestBindingException ex) {
236 			// expected
237 		}
238 	}
239 
240 	@Test
testDoubleParameter()241 	public void testDoubleParameter() throws ServletRequestBindingException {
242 		MockHttpServletRequest request = new MockHttpServletRequest();
243 		request.addParameter("param1", "5.5");
244 		request.addParameter("param2", "e");
245 		request.addParameter("paramEmpty", "");
246 
247 		assertTrue(ServletRequestUtils.getDoubleParameter(request, "param1").equals(new Double(5.5)));
248 		assertTrue(ServletRequestUtils.getDoubleParameter(request, "param1", 6.5) == 5.5);
249 		assertTrue(ServletRequestUtils.getRequiredDoubleParameter(request, "param1") == 5.5);
250 
251 		assertTrue(ServletRequestUtils.getDoubleParameter(request, "param2", 6.5) == 6.5);
252 		try {
253 			ServletRequestUtils.getRequiredDoubleParameter(request, "param2");
254 			fail("Should have thrown ServletRequestBindingException");
255 		}
256 		catch (ServletRequestBindingException ex) {
257 			// expected
258 		}
259 
260 		assertTrue(ServletRequestUtils.getDoubleParameter(request, "param3") == null);
261 		assertTrue(ServletRequestUtils.getDoubleParameter(request, "param3", 6.5) == 6.5);
262 		try {
263 			ServletRequestUtils.getRequiredDoubleParameter(request, "param3");
264 			fail("Should have thrown ServletRequestBindingException");
265 		}
266 		catch (ServletRequestBindingException ex) {
267 			// expected
268 		}
269 
270 		try {
271 			ServletRequestUtils.getRequiredDoubleParameter(request, "paramEmpty");
272 			fail("Should have thrown ServletRequestBindingException");
273 		}
274 		catch (ServletRequestBindingException ex) {
275 			// expected
276 		}
277 	}
278 
279 	@Test
testDoubleParameters()280 	public void testDoubleParameters() throws ServletRequestBindingException {
281 		MockHttpServletRequest request = new MockHttpServletRequest();
282 		request.addParameter("param", new String[] {"1.5", "2.5", "3"});
283 
284 		request.addParameter("param2", "1.5");
285 		request.addParameter("param2", "2");
286 		request.addParameter("param2", "bogus");
287 
288 		double[] array = new double[] {1.5, 2.5, 3};
289 		double[] values = ServletRequestUtils.getRequiredDoubleParameters(request, "param");
290 		assertEquals(3, values.length);
291 		for (int i = 0; i < array.length; i++) {
292 			assertEquals(array[i], values[i], 0);
293 		}
294 
295 		try {
296 			ServletRequestUtils.getRequiredDoubleParameters(request, "param2");
297 			fail("Should have thrown ServletRequestBindingException");
298 		}
299 		catch (ServletRequestBindingException ex) {
300 			// expected
301 		}
302 	}
303 
304 	@Test
testBooleanParameter()305 	public void testBooleanParameter() throws ServletRequestBindingException {
306 		MockHttpServletRequest request = new MockHttpServletRequest();
307 		request.addParameter("param1", "true");
308 		request.addParameter("param2", "e");
309 		request.addParameter("param4", "yes");
310 		request.addParameter("param5", "1");
311 		request.addParameter("paramEmpty", "");
312 
313 		assertTrue(ServletRequestUtils.getBooleanParameter(request, "param1").equals(Boolean.TRUE));
314 		assertTrue(ServletRequestUtils.getBooleanParameter(request, "param1", false));
315 		assertTrue(ServletRequestUtils.getRequiredBooleanParameter(request, "param1"));
316 
317 		assertFalse(ServletRequestUtils.getBooleanParameter(request, "param2", true));
318 		assertFalse(ServletRequestUtils.getRequiredBooleanParameter(request, "param2"));
319 
320 		assertTrue(ServletRequestUtils.getBooleanParameter(request, "param3") == null);
321 		assertTrue(ServletRequestUtils.getBooleanParameter(request, "param3", true));
322 		try {
323 			ServletRequestUtils.getRequiredBooleanParameter(request, "param3");
324 			fail("Should have thrown ServletRequestBindingException");
325 		}
326 		catch (ServletRequestBindingException ex) {
327 			// expected
328 		}
329 
330 		assertTrue(ServletRequestUtils.getBooleanParameter(request, "param4", false));
331 		assertTrue(ServletRequestUtils.getRequiredBooleanParameter(request, "param4"));
332 
333 		assertTrue(ServletRequestUtils.getBooleanParameter(request, "param5", false));
334 		assertTrue(ServletRequestUtils.getRequiredBooleanParameter(request, "param5"));
335 		assertFalse(ServletRequestUtils.getRequiredBooleanParameter(request, "paramEmpty"));
336 	}
337 
338 	@Test
testBooleanParameters()339 	public void testBooleanParameters() throws ServletRequestBindingException {
340 		MockHttpServletRequest request = new MockHttpServletRequest();
341 		request.addParameter("param", new String[] {"true", "yes", "off", "1", "bogus"});
342 
343 		request.addParameter("param2", "false");
344 		request.addParameter("param2", "true");
345 		request.addParameter("param2", "");
346 
347 		boolean[] array = new boolean[] {true, true, false, true, false};
348 		boolean[] values = ServletRequestUtils.getRequiredBooleanParameters(request, "param");
349 		assertEquals(array.length, values.length);
350 		for (int i = 0; i < array.length; i++) {
351 			assertEquals(array[i], values[i]);
352 		}
353 
354 		array = new boolean[] {false, true, false};
355 		values = ServletRequestUtils.getRequiredBooleanParameters(request, "param2");
356 		assertEquals(array.length, values.length);
357 		for (int i = 0; i < array.length; i++) {
358 			assertEquals(array[i], values[i]);
359 		}
360 	}
361 
362 	@Test
testStringParameter()363 	public void testStringParameter() throws ServletRequestBindingException {
364 		MockHttpServletRequest request = new MockHttpServletRequest();
365 		request.addParameter("param1", "str");
366 		request.addParameter("paramEmpty", "");
367 
368 		assertEquals("str", ServletRequestUtils.getStringParameter(request, "param1"));
369 		assertEquals("str", ServletRequestUtils.getStringParameter(request, "param1", "string"));
370 		assertEquals("str", ServletRequestUtils.getRequiredStringParameter(request, "param1"));
371 
372 		assertEquals(null, ServletRequestUtils.getStringParameter(request, "param3"));
373 		assertEquals("string", ServletRequestUtils.getStringParameter(request, "param3", "string"));
374 		assertNull(ServletRequestUtils.getStringParameter(request, "param3", null));
375 		try {
376 			ServletRequestUtils.getRequiredStringParameter(request, "param3");
377 			fail("Should have thrown ServletRequestBindingException");
378 		}
379 		catch (ServletRequestBindingException ex) {
380 			// expected
381 		}
382 
383 		assertEquals("", ServletRequestUtils.getStringParameter(request, "paramEmpty"));
384 		assertEquals("", ServletRequestUtils.getRequiredStringParameter(request, "paramEmpty"));
385 	}
386 
387 	@Test
testGetIntParameterWithDefaultValueHandlingIsFastEnough()388 	public void testGetIntParameterWithDefaultValueHandlingIsFastEnough() {
389 		MockHttpServletRequest request = new MockHttpServletRequest();
390 		StopWatch sw = new StopWatch();
391 		sw.start();
392 		for (int i = 0; i < 1000000; i++) {
393 			ServletRequestUtils.getIntParameter(request, "nonExistingParam", 0);
394 		}
395 		sw.stop();
396 		System.out.println(sw.getTotalTimeMillis());
397 		assertTrue("getStringParameter took too long: " + sw.getTotalTimeMillis(), sw.getTotalTimeMillis() < 250);
398 	}
399 
400 	@Test
testGetLongParameterWithDefaultValueHandlingIsFastEnough()401 	public void testGetLongParameterWithDefaultValueHandlingIsFastEnough() {
402 		MockHttpServletRequest request = new MockHttpServletRequest();
403 		StopWatch sw = new StopWatch();
404 		sw.start();
405 		for (int i = 0; i < 1000000; i++) {
406 			ServletRequestUtils.getLongParameter(request, "nonExistingParam", 0);
407 		}
408 		sw.stop();
409 		System.out.println(sw.getTotalTimeMillis());
410 		assertTrue("getStringParameter took too long: " + sw.getTotalTimeMillis(), sw.getTotalTimeMillis() < 250);
411 	}
412 
413 	@Test
testGetFloatParameterWithDefaultValueHandlingIsFastEnough()414 	public void testGetFloatParameterWithDefaultValueHandlingIsFastEnough() {
415 		MockHttpServletRequest request = new MockHttpServletRequest();
416 		StopWatch sw = new StopWatch();
417 		sw.start();
418 		for (int i = 0; i < 1000000; i++) {
419 			ServletRequestUtils.getFloatParameter(request, "nonExistingParam", 0f);
420 		}
421 		sw.stop();
422 		System.out.println(sw.getTotalTimeMillis());
423 		assertTrue("getStringParameter took too long: " + sw.getTotalTimeMillis(), sw.getTotalTimeMillis() < 250);
424 	}
425 
426 	@Test
testGetDoubleParameterWithDefaultValueHandlingIsFastEnough()427 	public void testGetDoubleParameterWithDefaultValueHandlingIsFastEnough() {
428 		MockHttpServletRequest request = new MockHttpServletRequest();
429 		StopWatch sw = new StopWatch();
430 		sw.start();
431 		for (int i = 0; i < 1000000; i++) {
432 			ServletRequestUtils.getDoubleParameter(request, "nonExistingParam", 0d);
433 		}
434 		sw.stop();
435 		System.out.println(sw.getTotalTimeMillis());
436 		assertTrue("getStringParameter took too long: " + sw.getTotalTimeMillis(), sw.getTotalTimeMillis() < 250);
437 	}
438 
439 	@Test
testGetBooleanParameterWithDefaultValueHandlingIsFastEnough()440 	public void testGetBooleanParameterWithDefaultValueHandlingIsFastEnough() {
441 		MockHttpServletRequest request = new MockHttpServletRequest();
442 		StopWatch sw = new StopWatch();
443 		sw.start();
444 		for (int i = 0; i < 1000000; i++) {
445 			ServletRequestUtils.getBooleanParameter(request, "nonExistingParam", false);
446 		}
447 		sw.stop();
448 		System.out.println(sw.getTotalTimeMillis());
449 		assertTrue("getStringParameter took too long: " + sw.getTotalTimeMillis(), sw.getTotalTimeMillis() < 250);
450 	}
451 
452 	@Test
testGetStringParameterWithDefaultValueHandlingIsFastEnough()453 	public void testGetStringParameterWithDefaultValueHandlingIsFastEnough() {
454 		MockHttpServletRequest request = new MockHttpServletRequest();
455 		StopWatch sw = new StopWatch();
456 		sw.start();
457 		for (int i = 0; i < 1000000; i++) {
458 			ServletRequestUtils.getStringParameter(request, "nonExistingParam", "defaultValue");
459 		}
460 		sw.stop();
461 		System.out.println(sw.getTotalTimeMillis());
462 		assertTrue("getStringParameter took too long: " + sw.getTotalTimeMillis(), sw.getTotalTimeMillis() < 250);
463 	}
464 
465 }
466