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