1 package com.google.inject.servlet; 2 3 import static org.easymock.EasyMock.createMock; 4 import static org.easymock.EasyMock.expect; 5 import static org.easymock.EasyMock.expectLastCall; 6 import static org.easymock.EasyMock.isA; 7 import static org.easymock.EasyMock.isNull; 8 import static org.easymock.EasyMock.replay; 9 import static org.easymock.EasyMock.verify; 10 11 import com.google.inject.Guice; 12 import com.google.inject.Key; 13 import com.google.inject.Singleton; 14 15 import junit.framework.TestCase; 16 17 import java.io.IOException; 18 19 import javax.servlet.Filter; 20 import javax.servlet.FilterChain; 21 import javax.servlet.FilterConfig; 22 import javax.servlet.ServletContext; 23 import javax.servlet.ServletException; 24 import javax.servlet.ServletRequest; 25 import javax.servlet.ServletResponse; 26 import javax.servlet.http.HttpServletRequest; 27 28 /** 29 * This is a basic whitebox test that verifies the glue between 30 * GuiceFilter and ManagedFilterPipeline is working. 31 * 32 * @author dhanji@gmail.com (Dhanji R. Prasanna) 33 */ 34 public class FilterPipelineTest extends TestCase { 35 36 @Override setUp()37 public final void setUp() { 38 GuiceFilter.reset(); 39 40 Guice.createInjector(new ServletModule() { 41 42 @Override 43 protected void configureServlets() { 44 filter("/*").through(TestFilter.class); 45 filter("*.html").through(TestFilter.class); 46 filter("/*").through(Key.get(TestFilter.class)); 47 filter("*.jsp").through(Key.get(TestFilter.class)); 48 49 // These filters should never fire 50 filter("/index/*").through(Key.get(NeverFilter.class)); 51 filter("/public/login/*").through(Key.get(NeverFilter.class)); 52 } 53 }); 54 } 55 56 @Override tearDown()57 public final void tearDown() { 58 GuiceFilter.reset(); 59 } 60 testDispatchThruGuiceFilter()61 public final void testDispatchThruGuiceFilter() throws ServletException, IOException { 62 63 //create mocks 64 FilterConfig filterConfig = createMock(FilterConfig.class); 65 ServletContext servletContext = createMock(ServletContext.class); 66 HttpServletRequest request = createMock(HttpServletRequest.class); 67 FilterChain proceedingFilterChain = createMock(FilterChain.class); 68 69 //begin mock script *** 70 71 expect(filterConfig.getServletContext()) 72 .andReturn(servletContext) 73 .once(); 74 75 expect(request.getRequestURI()) 76 .andReturn("/public/login.jsp") 77 .anyTimes(); 78 expect(request.getContextPath()) 79 .andReturn("") 80 .anyTimes(); 81 82 //at the end, proceed down webapp's normal filter chain 83 proceedingFilterChain.doFilter(isA(HttpServletRequest.class), (ServletResponse) isNull()); 84 expectLastCall().once(); 85 86 //run mock script *** 87 replay(filterConfig, servletContext, request, proceedingFilterChain); 88 89 final GuiceFilter webFilter = new GuiceFilter(); 90 91 webFilter.init(filterConfig); 92 webFilter.doFilter(request, null, proceedingFilterChain); 93 webFilter.destroy(); 94 95 //assert expectations 96 verify(filterConfig, servletContext, request, proceedingFilterChain); 97 } 98 99 @Singleton 100 public static class TestFilter implements Filter { init(FilterConfig filterConfig)101 public void init(FilterConfig filterConfig) { 102 } 103 doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)104 public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, 105 FilterChain filterChain) throws IOException, ServletException { 106 filterChain.doFilter(servletRequest, servletResponse); 107 } 108 destroy()109 public void destroy() { 110 } 111 } 112 113 @Singleton 114 public static class NeverFilter implements Filter { init(FilterConfig filterConfig)115 public void init(FilterConfig filterConfig) { 116 } 117 doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)118 public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, 119 FilterChain filterChain) { 120 fail("This filter should never have fired"); 121 } 122 destroy()123 public void destroy() { 124 } 125 } 126 } 127