• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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