1   /*
2    * Copyright 2004-2010 the Seasar Foundation and the Others.
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,
13   * either express or implied. See the License for the specific language
14   * governing permissions and limitations under the License.
15   */
16  
17  package org.seasar.cubby.filter;
18  
19  import static org.easymock.EasyMock.anyObject;
20  import static org.easymock.EasyMock.createMock;
21  import static org.easymock.EasyMock.expect;
22  import static org.easymock.EasyMock.expectLastCall;
23  import static org.easymock.EasyMock.getCurrentArguments;
24  import static org.easymock.EasyMock.isA;
25  import static org.easymock.EasyMock.replay;
26  import static org.easymock.EasyMock.verify;
27  import static org.junit.Assert.assertEquals;
28  
29  import java.io.IOException;
30  import java.util.HashMap;
31  import java.util.Map;
32  
33  import javax.servlet.FilterChain;
34  import javax.servlet.FilterConfig;
35  import javax.servlet.ServletException;
36  import javax.servlet.ServletRequest;
37  import javax.servlet.ServletResponse;
38  import javax.servlet.http.HttpServletRequest;
39  import javax.servlet.http.HttpServletResponse;
40  
41  import org.easymock.IAnswer;
42  import org.junit.Test;
43  
44  public class EncodingFilterTest {
45  
46  	@Test
47  	public void setEncoding1() throws ServletException, IOException {
48  		FilterConfig config = createMock(FilterConfig.class);
49  		expect(config.getInitParameter("encoding")).andReturn("UTF-8");
50  		expect(config.getInitParameter("forceEncoding")).andReturn(null);
51  		expect(config.getInitParameter("URIEncoding")).andReturn(null);
52  		expect(config.getInitParameter("URIBytesEncoding")).andReturn(null);
53  
54  		HttpServletRequest request = createMockHttpServletRequest();
55  		expect(request.getCharacterEncoding()).andReturn(null);
56  		request.setCharacterEncoding("UTF-8");
57  
58  		HttpServletResponse response = createMock(HttpServletResponse.class);
59  
60  		FilterChain chain = createMock(FilterChain.class);
61  		chain.doFilter(isA(ServletRequest.class), isA(ServletResponse.class));
62  
63  		replay(config, request, response, chain);
64  
65  		EncodingFilter filter = new EncodingFilter();
66  		filter.init(config);
67  		filter.doFilter(request, response, chain);
68  		filter.destroy();
69  
70  		verify(config, request, response, chain);
71  	}
72  
73  	@Test
74  	public void setEncoding2() throws ServletException, IOException {
75  		FilterConfig config = createMock(FilterConfig.class);
76  		expect(config.getInitParameter("encoding")).andReturn("UTF-8");
77  		expect(config.getInitParameter("forceEncoding")).andReturn(null);
78  		expect(config.getInitParameter("URIEncoding")).andReturn(null);
79  		expect(config.getInitParameter("URIBytesEncoding")).andReturn(null);
80  
81  		HttpServletRequest request = createMockHttpServletRequest();
82  		expect(request.getCharacterEncoding()).andReturn("Shift_JIS");
83  
84  		HttpServletResponse response = createMock(HttpServletResponse.class);
85  
86  		FilterChain chain = createMock(FilterChain.class);
87  		chain.doFilter(isA(ServletRequest.class), isA(ServletResponse.class));
88  
89  		replay(config, request, response, chain);
90  
91  		EncodingFilter filter = new EncodingFilter();
92  		filter.init(config);
93  		filter.doFilter(request, response, chain);
94  		filter.destroy();
95  
96  		verify(config, request, response, chain);
97  	}
98  
99  	@Test
100 	public void setForceEncoding1() throws ServletException, IOException {
101 		FilterConfig config = createMock(FilterConfig.class);
102 		expect(config.getInitParameter("encoding")).andReturn("UTF-8");
103 		expect(config.getInitParameter("forceEncoding")).andReturn("true");
104 		expect(config.getInitParameter("URIEncoding")).andReturn(null);
105 		expect(config.getInitParameter("URIBytesEncoding")).andReturn(null);
106 
107 		HttpServletRequest request = createMockHttpServletRequest();
108 		expect(request.getCharacterEncoding()).andReturn("Shift_JIS");
109 		request.setCharacterEncoding("UTF-8");
110 
111 		HttpServletResponse response = createMock(HttpServletResponse.class);
112 
113 		FilterChain chain = createMock(FilterChain.class);
114 		chain.doFilter(isA(ServletRequest.class), isA(ServletResponse.class));
115 
116 		replay(config, request, response, chain);
117 
118 		EncodingFilter filter = new EncodingFilter();
119 		filter.init(config);
120 		filter.doFilter(request, response, chain);
121 		filter.destroy();
122 
123 		verify(config, request, response, chain);
124 	}
125 
126 	@Test
127 	public void setForceEncoding2() throws ServletException, IOException {
128 		FilterConfig config = createMock(FilterConfig.class);
129 		expect(config.getInitParameter("encoding")).andReturn("UTF-8");
130 		expect(config.getInitParameter("forceEncoding")).andReturn("true");
131 		expect(config.getInitParameter("URIEncoding")).andReturn(null);
132 		expect(config.getInitParameter("URIBytesEncoding")).andReturn(null);
133 
134 		HttpServletRequest request = createMockHttpServletRequest();
135 		expect(request.getCharacterEncoding()).andReturn("Shift_JIS");
136 		request.setCharacterEncoding("UTF-8");
137 
138 		HttpServletResponse response = createMock(HttpServletResponse.class);
139 
140 		FilterChain chain = createMock(FilterChain.class);
141 		chain.doFilter(isA(ServletRequest.class), isA(ServletResponse.class));
142 
143 		replay(config, request, response, chain);
144 
145 		EncodingFilter filter = new EncodingFilter();
146 		filter.init(config);
147 		filter.doFilter(request, response, chain);
148 		filter.destroy();
149 
150 		verify(config, request, response, chain);
151 	}
152 
153 	@Test
154 	public void setForceEncoding3() throws ServletException, IOException {
155 		FilterConfig config = createMock(FilterConfig.class);
156 		expect(config.getInitParameter("encoding")).andReturn("UTF-8");
157 		expect(config.getInitParameter("forceEncoding")).andReturn("false");
158 		expect(config.getInitParameter("URIEncoding")).andReturn(null);
159 		expect(config.getInitParameter("URIBytesEncoding")).andReturn(null);
160 
161 		HttpServletRequest request = createMockHttpServletRequest();
162 		expect(request.getCharacterEncoding()).andReturn("Shift_JIS");
163 
164 		HttpServletResponse response = createMock(HttpServletResponse.class);
165 
166 		FilterChain chain = createMock(FilterChain.class);
167 		chain.doFilter(isA(ServletRequest.class), isA(ServletResponse.class));
168 
169 		replay(config, request, response, chain);
170 
171 		EncodingFilter filter = new EncodingFilter();
172 		filter.init(config);
173 		filter.doFilter(request, response, chain);
174 		filter.destroy();
175 
176 		verify(config, request, response, chain);
177 	}
178 
179 	@Test
180 	public void doURIEncoding1() throws ServletException, IOException {
181 		FilterConfig config = createMock(FilterConfig.class);
182 		expect(config.getInitParameter("encoding")).andReturn("UTF-8");
183 		expect(config.getInitParameter("forceEncoding")).andReturn("false");
184 		expect(config.getInitParameter("URIEncoding")).andReturn("UTF-8");
185 		expect(config.getInitParameter("URIBytesEncoding")).andReturn(null);
186 
187 		HttpServletRequest request = createMockHttpServletRequest();
188 		expect(request.getCharacterEncoding()).andReturn(null);
189 		request.setCharacterEncoding("UTF-8");
190 		expect(request.getServletPath()).andReturn(
191 				new String("あいうえおABC123".getBytes("UTF-8"), "ISO-8859-1"));
192 		expect(request.getPathInfo()).andReturn(
193 				new String("かきくけこXYZ987".getBytes("UTF-8"), "ISO-8859-1"));
194 
195 		HttpServletResponse response = createMock(HttpServletResponse.class);
196 
197 		FilterChain chain = createMock(FilterChain.class);
198 		chain.doFilter(isA(ServletRequest.class), isA(ServletResponse.class));
199 		expectLastCall().andAnswer(new IAnswer<Object>() {
200 
201 			public Object answer() throws Throwable {
202 				HttpServletRequest request = (HttpServletRequest) getCurrentArguments()[0];
203 				assertEquals("あいうえおABC123", request.getServletPath());
204 				assertEquals("かきくけこXYZ987", request.getPathInfo());
205 				return null;
206 			}
207 
208 		});
209 
210 		replay(config, request, response, chain);
211 
212 		EncodingFilter filter = new EncodingFilter();
213 		filter.init(config);
214 		filter.doFilter(request, response, chain);
215 		filter.destroy();
216 
217 		verify(config, request, response, chain);
218 	}
219 
220 	@Test
221 	public void doURIEncoding2() throws ServletException, IOException {
222 		FilterConfig config = createMock(FilterConfig.class);
223 		expect(config.getInitParameter("encoding")).andReturn("UTF-8");
224 		expect(config.getInitParameter("forceEncoding")).andReturn("false");
225 		expect(config.getInitParameter("URIEncoding")).andReturn("UTF-8");
226 		expect(config.getInitParameter("URIBytesEncoding")).andReturn(
227 				"ISO-8859-1");
228 
229 		HttpServletRequest request = createMockHttpServletRequest();
230 		expect(request.getCharacterEncoding()).andReturn(null);
231 		request.setCharacterEncoding("UTF-8");
232 		expect(request.getServletPath()).andReturn(
233 				new String("あいうえおABC123".getBytes("UTF-8"), "ISO-8859-1"));
234 		expect(request.getPathInfo()).andReturn(
235 				new String("かきくけこXYZ987".getBytes("UTF-8"), "ISO-8859-1"));
236 
237 		HttpServletResponse response = createMock(HttpServletResponse.class);
238 
239 		FilterChain chain = createMock(FilterChain.class);
240 		chain.doFilter(isA(ServletRequest.class), isA(ServletResponse.class));
241 		expectLastCall().andAnswer(new IAnswer<Object>() {
242 
243 			public Object answer() throws Throwable {
244 				HttpServletRequest request = (HttpServletRequest) getCurrentArguments()[0];
245 				assertEquals("あいうえおABC123", request.getServletPath());
246 				assertEquals("かきくけこXYZ987", request.getPathInfo());
247 				return null;
248 			}
249 
250 		});
251 
252 		replay(config, request, response, chain);
253 
254 		EncodingFilter filter = new EncodingFilter();
255 		filter.init(config);
256 		filter.doFilter(request, response, chain);
257 		filter.destroy();
258 
259 		verify(config, request, response, chain);
260 	}
261 
262 	private HttpServletRequest createMockHttpServletRequest() {
263 		final Map<String, Object> requestAttributes = new HashMap<String, Object>();
264 
265 		HttpServletRequest request = createMock(HttpServletRequest.class);
266 
267 		expect(request.getAttribute((String) anyObject())).andStubAnswer(
268 				new IAnswer<Object>() {
269 
270 					public Object answer() throws Throwable {
271 						return requestAttributes.get(getCurrentArguments()[0]);
272 					}
273 
274 				});
275 
276 		request.setAttribute((String) anyObject(), anyObject());
277 		expectLastCall().andStubAnswer(new IAnswer<Object>() {
278 
279 			public Object answer() throws Throwable {
280 				requestAttributes.put((String) getCurrentArguments()[0],
281 						getCurrentArguments()[1]);
282 				return null;
283 			}
284 
285 		});
286 
287 		request.removeAttribute((String) anyObject());
288 		expectLastCall().andAnswer(new IAnswer<Object>() {
289 
290 			public Object answer() throws Throwable {
291 				requestAttributes.remove((String) getCurrentArguments()[0]);
292 				return null;
293 			}
294 
295 		});
296 
297 		return request;
298 	}
299 
300 }