1 31 32 package org.opencms.flex; 33 34 import org.opencms.file.CmsObject; 35 import org.opencms.main.OpenCms; 36 import org.opencms.test.OpenCmsTestCase; 37 import org.opencms.test.OpenCmsTestProperties; 38 import org.opencms.util.CmsRequestUtil; 39 40 import java.lang.reflect.InvocationHandler ; 41 import java.lang.reflect.Method ; 42 import java.lang.reflect.Proxy ; 43 import java.util.ArrayList ; 44 import java.util.HashMap ; 45 import java.util.List ; 46 47 import javax.servlet.http.HttpServletRequest ; 48 import javax.servlet.http.HttpServletResponse ; 49 50 import junit.extensions.TestSetup; 51 import junit.framework.TestSuite; 52 53 66 public class TestCmsFlexResponse extends OpenCmsTestCase { 67 68 74 public static class RecordingMock implements InvocationHandler { 75 76 77 HashMap m_invocations = new HashMap (); 78 79 80 Object m_stub; 81 82 85 public RecordingMock() { 86 } 88 89 94 public RecordingMock(Object stub) { 95 96 m_stub = stub; 97 } 98 99 106 public List getCalls(Method method) { 107 108 ArrayList calls = (ArrayList )m_invocations.get(method); 109 if (calls == null) { 110 calls = new ArrayList (); 111 m_invocations.put(method, calls); 112 } 113 return calls; 114 } 115 116 117 128 public Object invoke(Object proxy, Method method, Object [] args) throws Throwable { 129 130 getCalls(method).add(args); 132 133 if (m_stub != null) { 135 Method stubMethod = null; 136 try { 137 stubMethod = m_stub.getClass().getMethod(method.getName(), method.getParameterTypes()); 138 if (stubMethod != null) { 139 if (stubMethod.getReturnType() == null) { 140 if (method.getReturnType() != null) { 141 stubMethod = null; 142 } 143 } else if (!stubMethod.getReturnType().equals(method.getReturnType())) { 144 stubMethod = null; 145 } 146 } 147 } catch (NoSuchMethodException e) { 148 } catch (SecurityException e) { 150 } 152 153 if (stubMethod != null) { 155 return stubMethod.invoke(m_stub, args); 156 } 157 } 158 159 return null; 160 } 161 } 162 163 166 public static class RequestStub { 167 168 169 HashMap m_attributes = new HashMap (); 170 171 177 public Object getAttribute(String name) { 178 179 return m_attributes.get(name); 180 } 181 182 187 public void removeAttribute(String name) { 188 189 m_attributes.remove(name); 190 } 191 192 198 public void setAttribute(String name, Object value) { 199 200 m_attributes.put(name, value); 201 } 202 } 203 204 205 public static Method SET_CONTENT_TYPE = null; 206 207 208 private CmsFlexController m_controller; 209 210 211 private RecordingMock m_reqMock; 212 213 214 private RecordingMock m_resMock; 215 216 217 private HttpServletRequest m_request; 218 219 220 private HttpServletResponse m_response; 221 222 227 public TestCmsFlexResponse(String arg0) { 228 229 super(arg0); 230 } 231 232 235 static { 236 try { 237 SET_CONTENT_TYPE = HttpServletResponse .class.getMethod("setContentType", new Class [] {String .class}); 238 } catch (NoSuchMethodException e) { 239 throw new RuntimeException ("HttpServletResponse linkage error", e); 240 } 241 } 242 243 248 public static TestSetup suite() { 249 250 OpenCmsTestProperties.initialize(org.opencms.test.AllTests.TEST_PROPERTIES_PATH); 251 252 TestSuite suite = new TestSuite(); 253 suite.setName(TestCmsFlexResponse.class.getName()); 254 255 suite.addTest(new TestCmsFlexResponse("testContentTypeRules")); 256 257 TestSetup wrapper = new TestSetup(suite) { 258 259 protected void setUp() { 260 261 setupOpenCms("simpletest", "/sites/default/"); 262 } 263 264 protected void tearDown() { 265 266 removeOpenCms(); 267 } 268 }; 269 270 return wrapper; 271 } 272 273 276 private static HttpServletRequest createMockRequest(RecordingMock recorder) { 277 278 return (HttpServletRequest )createProxy(HttpServletRequest .class, recorder); 279 } 280 281 284 private static HttpServletResponse createMockResponse(RecordingMock recorder) { 285 286 return (HttpServletResponse )createProxy(HttpServletResponse .class, recorder); 287 } 288 289 private static Object createProxy(Class interfaceClass, InvocationHandler handler) { 290 291 return Proxy.newProxyInstance( 292 Thread.currentThread().getContextClassLoader(), 293 new Class [] {interfaceClass}, 294 handler); 295 } 296 297 303 public void testContentTypeRules() throws Exception { 304 305 CmsFlexResponse f_res = new CmsFlexResponse(m_response, m_controller, false, false); 307 f_res.setHeader(CmsRequestUtil.HEADER_CONTENT_TYPE, "application/borked"); 308 assertTrue("non-top request does not set content type header", m_resMock.m_invocations.isEmpty()); 309 310 f_res.setContentType("application/stillborked"); 311 assertTrue("non-top request does not set content type header", m_resMock.m_invocations.isEmpty()); 312 313 f_res = new CmsFlexResponse(m_response, m_controller, false, true); 316 f_res.setContentType("text/foo"); 317 318 assertEquals("one method has been invoked on the actual response", 1, m_resMock.m_invocations.size()); 319 List setCalls = m_resMock.getCalls(SET_CONTENT_TYPE); 320 assertEquals("top element has called setContentType() on the actual servlet response", 1, setCalls.size()); 321 assertEquals("correct content type value passed", "text/foo", ((Object [])setCalls.get(0))[0]); 322 323 f_res.setContentType("text/bar"); 325 assertEquals("top element did NOT call content type method again", 1, setCalls.size()); 326 327 f_res.setHeader(CmsRequestUtil.HEADER_CONTENT_TYPE, "text/baz"); 328 assertEquals("still no more calls to setContentType() method", 1, setCalls.size()); 329 assertEquals("no other methods called on request", 1, m_resMock.m_invocations.size()); 330 331 f_res = new CmsFlexResponse(m_response, m_controller, false, true); 333 f_res.setHeader(CmsRequestUtil.HEADER_CONTENT_TYPE, "text/qux"); 334 assertEquals("setContentType() was called from setHeader", 2, setCalls.size()); 335 assertEquals("correct content type value passed", "text/qux", ((Object [])setCalls.get(1))[0]); 336 337 f_res.setContentType("text/quux"); 339 assertEquals("no further calls to setContentType", 2, setCalls.size()); 340 assertEquals("no other methods called", 1, m_resMock.m_invocations.size()); 341 342 f_res.setHeader(CmsRequestUtil.HEADER_CONTENT_TYPE, "text/arg"); 343 assertEquals("no further calls to setContentType", 2, setCalls.size()); 344 assertEquals("no other methods called", 1, m_resMock.m_invocations.size()); 345 } 346 347 355 protected void setUp() throws Exception { 356 357 super.setUp(); 358 CmsObject cms = OpenCms.initCmsObject(OpenCms.getDefaultUsers().getUserGuest()); 359 if (!cms.getRequestContext().currentUser().getName().equals(OpenCms.getDefaultUsers().getUserGuest())) { 360 fail("'Guest' user could not be properly initialized!"); 361 } 362 363 m_reqMock = new RecordingMock(new RequestStub()); 364 m_request = createMockRequest(m_reqMock); 365 m_resMock = new RecordingMock(); 366 m_response = createMockResponse(m_resMock); 367 368 m_controller = new CmsFlexController(cms, null, CmsFlexDummyLoader.m_flexCache, m_request, m_response, false, true); 369 CmsFlexController.setController(m_request, m_controller); 370 } 371 372 375 protected void tearDown() throws Exception { 376 377 super.tearDown(); 378 m_reqMock = null; 379 m_resMock = null; 380 m_request = null; 381 m_response = null; 382 m_controller = null; 383 } 384 } | Popular Tags |