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.replay; 6 import static org.easymock.EasyMock.verify; 7 8 import com.google.inject.Guice; 9 import com.google.inject.Injector; 10 import com.google.inject.Key; 11 import com.google.inject.Singleton; 12 import java.io.IOException; 13 import javax.servlet.Filter; 14 import javax.servlet.FilterChain; 15 import javax.servlet.FilterConfig; 16 import javax.servlet.ServletException; 17 import javax.servlet.ServletRequest; 18 import javax.servlet.ServletResponse; 19 import javax.servlet.http.HttpServletRequest; 20 import junit.framework.TestCase; 21 22 /** 23 * This tests that filter stage of the pipeline dispatches correctly to guice-managed filters with 24 * multiple modules. 25 * 26 * <p>WARNING(dhanji): Non-parallelizable test =( 27 * 28 * @author dhanji@gmail.com (Dhanji R. Prasanna) 29 */ 30 public class MultiModuleDispatchIntegrationTest extends TestCase { 31 private static int inits, doFilters, destroys; 32 33 @Override setUp()34 public final void setUp() { 35 inits = 0; 36 doFilters = 0; 37 destroys = 0; 38 39 GuiceFilter.reset(); 40 } 41 testDispatchRequestToManagedPipeline()42 public final void testDispatchRequestToManagedPipeline() throws ServletException, IOException { 43 final Injector injector = 44 Guice.createInjector( 45 new ServletModule() { 46 47 @Override 48 protected void configureServlets() { 49 filter("/*").through(TestFilter.class); 50 51 // These filters should never fire 52 filter("*.jsp").through(Key.get(TestFilter.class)); 53 } 54 }, 55 new ServletModule() { 56 57 @Override 58 protected void configureServlets() { 59 filter("*.html").through(TestFilter.class); 60 filter("/*").through(Key.get(TestFilter.class)); 61 62 // These filters should never fire 63 filter("/index/*").through(Key.get(TestFilter.class)); 64 } 65 }); 66 67 final FilterPipeline pipeline = injector.getInstance(FilterPipeline.class); 68 pipeline.initPipeline(null); 69 70 //create ourselves a mock request with test URI 71 HttpServletRequest requestMock = createMock(HttpServletRequest.class); 72 73 expect(requestMock.getRequestURI()).andReturn("/index.html").anyTimes(); 74 expect(requestMock.getContextPath()).andReturn("").anyTimes(); 75 76 //dispatch request 77 replay(requestMock); 78 pipeline.dispatch(requestMock, null, createMock(FilterChain.class)); 79 pipeline.destroyPipeline(); 80 81 verify(requestMock); 82 83 assertTrue( 84 "lifecycle states did not" 85 + " fire correct number of times-- inits: " 86 + inits 87 + "; dos: " 88 + doFilters 89 + "; destroys: " 90 + destroys, 91 inits == 1 && doFilters == 3 && destroys == 1); 92 } 93 94 @Singleton 95 public static class TestFilter implements Filter { 96 @Override init(FilterConfig filterConfig)97 public void init(FilterConfig filterConfig) throws ServletException { 98 inits++; 99 } 100 101 @Override doFilter( ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)102 public void doFilter( 103 ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) 104 throws IOException, ServletException { 105 doFilters++; 106 filterChain.doFilter(servletRequest, servletResponse); 107 } 108 109 @Override destroy()110 public void destroy() { 111 destroys++; 112 } 113 } 114 } 115