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 }