blob: 8ac63430f1ff29da23b4ad466a8c465f6f769183 [file] [log] [blame]
package com.google.inject.servlet;
import com.google.inject.Guice;
import com.google.inject.Injector;
import com.google.inject.Key;
import com.google.inject.Singleton;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import junit.framework.TestCase;
import static org.easymock.EasyMock.createMock;
import static org.easymock.EasyMock.expect;
import static org.easymock.EasyMock.expectLastCall;
import static org.easymock.EasyMock.isA;
import static org.easymock.EasyMock.isNull;
import static org.easymock.EasyMock.replay;
import static org.easymock.EasyMock.reset;
import static org.easymock.EasyMock.verify;
/**
* Exactly the same as {@linkplain com.google.inject.servlet.FilterPipelineTest} except
* that we test that the static pipeline is not used.
*
* @author dhanji@gmail.com (Dhanji R. Prasanna)
*/
public class InjectedFilterPipelineTest extends TestCase {
private Injector injector1;
private Injector injector2;
@Override
public final void setUp() {
injector1 = Guice.createInjector(new ServletModule() {
@Override
protected void configureServlets() {
filter("/*").through(TestFilter.class);
filter("*.html").through(TestFilter.class);
filter("/*").through(Key.get(TestFilter.class));
filter("*.jsp").through(Key.get(TestFilter.class));
// These filters should never fire
filter("/index/*").through(Key.get(NeverFilter.class));
filter("/public/login/*").through(Key.get(NeverFilter.class));
}
});
// Test second injector with exactly opposite pipeline config
injector2 = Guice.createInjector(new ServletModule() {
@Override
protected void configureServlets() {
// These filters should never fire
filter("*.html").through(NeverFilter.class);
filter("/non-jsp/*").through(Key.get(NeverFilter.class));
// only these filters fire.
filter("/index/*").through(Key.get(TestFilter.class));
filter("/public/login/*").through(Key.get(TestFilter.class));
}
});
}
@Override
public final void tearDown() {
}
public final void testDispatchThruInjectedGuiceFilter() throws ServletException, IOException {
//create mocks
FilterConfig filterConfig = createMock(FilterConfig.class);
ServletContext servletContext = createMock(ServletContext.class);
HttpServletRequest request = createMock(HttpServletRequest.class);
FilterChain proceedingFilterChain = createMock(FilterChain.class);
//begin mock script ***
expect(filterConfig.getServletContext())
.andReturn(servletContext)
.once();
expect(request.getServletPath())
.andReturn("/non-jsp/login.html") // use a path that will fail in injector2
.anyTimes();
//at the end, proceed down webapp's normal filter chain
proceedingFilterChain.doFilter(isA(HttpServletRequest.class), (ServletResponse) isNull());
expectLastCall().once();
//run mock script ***
replay(filterConfig, servletContext, request, proceedingFilterChain);
GuiceFilter webFilter = injector1.getInstance(GuiceFilter.class);
webFilter.init(filterConfig);
webFilter.doFilter(request, null, proceedingFilterChain);
webFilter.destroy();
//assert expectations
verify(filterConfig, servletContext, request, proceedingFilterChain);
// reset mocks and run them against the other injector
reset(filterConfig, servletContext, request, proceedingFilterChain);
// Create a second proceeding filter chain
FilterChain proceedingFilterChain2 = createMock(FilterChain.class);
//begin mock script ***
expect(filterConfig.getServletContext())
.andReturn(servletContext)
.once();
expect(request.getServletPath())
.andReturn("/public/login/login.jsp") // use a path that will fail in injector1
.anyTimes();
//at the end, proceed down webapp's normal filter chain
proceedingFilterChain2.doFilter(isA(HttpServletRequest.class), (ServletResponse) isNull());
expectLastCall().once();
// Never fire on this pipeline
replay(filterConfig, servletContext, request, proceedingFilterChain2, proceedingFilterChain);
webFilter = injector2.getInstance(GuiceFilter.class);
webFilter.init(filterConfig);
webFilter.doFilter(request, null, proceedingFilterChain2);
webFilter.destroy();
// Verify that we have not crossed the streams, Venkman!
verify(filterConfig, servletContext, request, proceedingFilterChain, proceedingFilterChain2);
}
@Singleton
public static class TestFilter implements Filter {
public void init(FilterConfig filterConfig) throws ServletException {
}
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse,
FilterChain filterChain) throws IOException, ServletException {
filterChain.doFilter(servletRequest, servletResponse);
}
public void destroy() {
}
}
@Singleton
public static class NeverFilter implements Filter {
public void init(FilterConfig filterConfig) throws ServletException {
}
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse,
FilterChain filterChain) throws IOException, ServletException {
fail("This filter should never have fired");
}
public void destroy() {
}
}
}