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