1package com.google.inject.servlet;
2
3import static org.easymock.EasyMock.createMock;
4import static org.easymock.EasyMock.expect;
5import static org.easymock.EasyMock.expectLastCall;
6import static org.easymock.EasyMock.isA;
7import static org.easymock.EasyMock.isNull;
8import static org.easymock.EasyMock.replay;
9import static org.easymock.EasyMock.verify;
10
11import com.google.inject.Guice;
12import com.google.inject.Key;
13import com.google.inject.Singleton;
14
15import junit.framework.TestCase;
16
17import java.io.IOException;
18
19import javax.servlet.Filter;
20import javax.servlet.FilterChain;
21import javax.servlet.FilterConfig;
22import javax.servlet.ServletContext;
23import javax.servlet.ServletException;
24import javax.servlet.ServletRequest;
25import javax.servlet.ServletResponse;
26import 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 */
34public class FilterPipelineTest extends TestCase {
35
36  @Override
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
57  public final void tearDown() {
58    GuiceFilter.reset();
59  }
60
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 {
101    public void init(FilterConfig filterConfig) {
102    }
103
104    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse,
105        FilterChain filterChain) throws IOException, ServletException {
106      filterChain.doFilter(servletRequest, servletResponse);
107    }
108
109    public void destroy() {
110    }
111  }
112
113  @Singleton
114  public static class NeverFilter implements Filter {
115    public void init(FilterConfig filterConfig) {
116    }
117
118    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse,
119        FilterChain filterChain) {
120      fail("This filter should never have fired");
121    }
122
123    public void destroy() {
124    }
125  }
126}
127