View Javadoc
1   /*
2    * Copyright 2002-2014 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.context.request;
18  
19  import java.util.Date;
20  import java.util.Locale;
21  import java.util.Map;
22  import javax.servlet.ServletRequest;
23  import javax.servlet.ServletResponse;
24  import javax.servlet.http.HttpServletRequest;
25  import javax.servlet.http.HttpServletRequestWrapper;
26  import javax.servlet.http.HttpServletResponse;
27  import javax.servlet.http.HttpServletResponseWrapper;
28  
29  import org.junit.Before;
30  import org.junit.Test;
31  
32  import org.springframework.mock.web.test.MockHttpServletRequest;
33  import org.springframework.mock.web.test.MockHttpServletResponse;
34  import org.springframework.web.multipart.MultipartRequest;
35  
36  import static org.junit.Assert.*;
37  
38  /**
39   * @author Juergen Hoeller
40   * @author Markus Malkusch
41   * @since 26.07.2006
42   */
43  public class ServletWebRequestTests {
44  
45  	private MockHttpServletRequest servletRequest;
46  
47  	private MockHttpServletResponse servletResponse;
48  
49  	private ServletWebRequest request;
50  
51  	@Before
52  	public void setUp() {
53  		servletRequest = new MockHttpServletRequest();
54  		servletResponse = new MockHttpServletResponse();
55  		request = new ServletWebRequest(servletRequest, servletResponse);
56  	}
57  
58  	@Test
59  	public void parameters() {
60  		servletRequest.addParameter("param1", "value1");
61  		servletRequest.addParameter("param2", "value2");
62  		servletRequest.addParameter("param2", "value2a");
63  
64  		assertEquals("value1", request.getParameter("param1"));
65  		assertEquals(1, request.getParameterValues("param1").length);
66  		assertEquals("value1", request.getParameterValues("param1")[0]);
67  		assertEquals("value2", request.getParameter("param2"));
68  		assertEquals(2, request.getParameterValues("param2").length);
69  		assertEquals("value2", request.getParameterValues("param2")[0]);
70  		assertEquals("value2a", request.getParameterValues("param2")[1]);
71  
72  		Map<String, String[]> paramMap = request.getParameterMap();
73  		assertEquals(2, paramMap.size());
74  		assertEquals(1, paramMap.get("param1").length);
75  		assertEquals("value1", paramMap.get("param1")[0]);
76  		assertEquals(2, paramMap.get("param2").length);
77  		assertEquals("value2", paramMap.get("param2")[0]);
78  		assertEquals("value2a", paramMap.get("param2")[1]);
79  	}
80  
81  	@Test
82  	public void locale() {
83  		servletRequest.addPreferredLocale(Locale.UK);
84  
85  		assertEquals(Locale.UK, request.getLocale());
86  	}
87  
88  	@Test
89  	public void nativeRequest() {
90  		assertSame(servletRequest, request.getNativeRequest());
91  		assertSame(servletRequest, request.getNativeRequest(ServletRequest.class));
92  		assertSame(servletRequest, request.getNativeRequest(HttpServletRequest.class));
93  		assertSame(servletRequest, request.getNativeRequest(MockHttpServletRequest.class));
94  		assertNull(request.getNativeRequest(MultipartRequest.class));
95  		assertSame(servletResponse, request.getNativeResponse());
96  		assertSame(servletResponse, request.getNativeResponse(ServletResponse.class));
97  		assertSame(servletResponse, request.getNativeResponse(HttpServletResponse.class));
98  		assertSame(servletResponse, request.getNativeResponse(MockHttpServletResponse.class));
99  		assertNull(request.getNativeResponse(MultipartRequest.class));
100 	}
101 
102 	@Test
103 	public void decoratedNativeRequest() {
104 		HttpServletRequest decoratedRequest = new HttpServletRequestWrapper(servletRequest);
105 		HttpServletResponse decoratedResponse = new HttpServletResponseWrapper(servletResponse);
106 		ServletWebRequest request = new ServletWebRequest(decoratedRequest, decoratedResponse);
107 		assertSame(decoratedRequest, request.getNativeRequest());
108 		assertSame(decoratedRequest, request.getNativeRequest(ServletRequest.class));
109 		assertSame(decoratedRequest, request.getNativeRequest(HttpServletRequest.class));
110 		assertSame(servletRequest, request.getNativeRequest(MockHttpServletRequest.class));
111 		assertNull(request.getNativeRequest(MultipartRequest.class));
112 		assertSame(decoratedResponse, request.getNativeResponse());
113 		assertSame(decoratedResponse, request.getNativeResponse(ServletResponse.class));
114 		assertSame(decoratedResponse, request.getNativeResponse(HttpServletResponse.class));
115 		assertSame(servletResponse, request.getNativeResponse(MockHttpServletResponse.class));
116 		assertNull(request.getNativeResponse(MultipartRequest.class));
117 	}
118 
119 	@Test
120 	public void checkNotModifiedTimestampForGET() {
121 		long currentTime = new Date().getTime();
122 		servletRequest.setMethod("GET");
123 		servletRequest.addHeader("If-Modified-Since", currentTime);
124 
125 		assertTrue(request.checkNotModified(currentTime));
126 		assertEquals(304, servletResponse.getStatus());
127 	}
128 
129 	@Test
130 	public void checkModifiedTimestampForGET() {
131 		long currentTime = new Date().getTime();
132 		long oneMinuteAgo  = currentTime - (1000 * 60);
133 		servletRequest.setMethod("GET");
134 		servletRequest.addHeader("If-Modified-Since", oneMinuteAgo);
135 
136 		assertFalse(request.checkNotModified(currentTime));
137 		assertEquals(200, servletResponse.getStatus());
138 		assertEquals("" + currentTime, servletResponse.getHeader("Last-Modified"));
139 	}
140 
141 	@Test
142 	public void checkNotModifiedTimestampForHEAD() {
143 		long currentTime = new Date().getTime();
144 		servletRequest.setMethod("HEAD");
145 		servletRequest.addHeader("If-Modified-Since", currentTime);
146 
147 		assertTrue(request.checkNotModified(currentTime));
148 		assertEquals(304, servletResponse.getStatus());
149 	}
150 
151 	@Test
152 	public void checkModifiedTimestampForHEAD() {
153 		long currentTime = new Date().getTime();
154 		long oneMinuteAgo  = currentTime - (1000 * 60);
155 		servletRequest.setMethod("HEAD");
156 		servletRequest.addHeader("If-Modified-Since", oneMinuteAgo);
157 
158 		assertFalse(request.checkNotModified(currentTime));
159 		assertEquals(200, servletResponse.getStatus());
160 		assertEquals(""+currentTime, servletResponse.getHeader("Last-Modified"));
161 	}
162 
163 	@Test
164 	public void checkNotModifiedTimestampWithLengthPart() {
165 		long currentTime = Date.parse("Wed, 09 Apr 2014 09:57:42 GMT");
166 		servletRequest.setMethod("GET");
167 		servletRequest.addHeader("If-Modified-Since", "Wed, 09 Apr 2014 09:57:42 GMT; length=13774");
168 
169 		assertTrue(request.checkNotModified(currentTime));
170 		assertEquals(304, servletResponse.getStatus());
171 	}
172 
173 	@Test
174 	public void checkModifiedTimestampWithLengthPart() {
175 		long currentTime = Date.parse("Wed, 09 Apr 2014 09:57:42 GMT");
176 		servletRequest.setMethod("GET");
177 		servletRequest.addHeader("If-Modified-Since", "Wed, 08 Apr 2014 09:57:42 GMT; length=13774");
178 
179 		assertFalse(request.checkNotModified(currentTime));
180 		assertEquals(200, servletResponse.getStatus());
181 		assertEquals("" + currentTime, servletResponse.getHeader("Last-Modified"));
182 	}
183 
184 	@Test
185 	public void checkNotModifiedETagForGET() {
186 		String eTag = "\"Foo\"";
187 		servletRequest.setMethod("GET");
188 		servletRequest.addHeader("If-None-Match", eTag );
189 
190 		assertTrue(request.checkNotModified(eTag));
191 		assertEquals(304, servletResponse.getStatus());
192 	}
193 
194 	@Test
195 	public void checkModifiedETagForGET() {
196 		String currentETag = "\"Foo\"";
197 		String oldEtag = "Bar";
198 		servletRequest.setMethod("GET");
199 		servletRequest.addHeader("If-None-Match", oldEtag);
200 
201 		assertFalse(request.checkNotModified(currentETag));
202 		assertEquals(200, servletResponse.getStatus());
203 		assertEquals(currentETag, servletResponse.getHeader("ETag"));
204 	}
205 
206 	@Test
207 	public void checkNotModifiedETagForHEAD() {
208 		String eTag = "\"Foo\"";
209 		servletRequest.setMethod("HEAD");
210 		servletRequest.addHeader("If-None-Match", eTag );
211 
212 		assertTrue(request.checkNotModified(eTag));
213 		assertEquals(304, servletResponse.getStatus());
214 	}
215 
216 	@Test
217 	public void checkModifiedETagForHEAD() {
218 		String currentETag = "\"Foo\"";
219 		String oldEtag = "Bar";
220 		servletRequest.setMethod("HEAD");
221 		servletRequest.addHeader("If-None-Match", oldEtag);
222 
223 		assertFalse(request.checkNotModified(currentETag));
224 		assertEquals(200, servletResponse.getStatus());
225 		assertEquals(currentETag, servletResponse.getHeader("ETag"));
226 	}
227 
228 }