blob: 9cea30d9874e3b9707233a985caaeac0cbcbfbbf [file] [log] [blame]
/**
* Copyright (C) 2010 Google Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.google.inject.servlet;
import com.google.inject.Guice;
import com.google.inject.Injector;
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.http.HttpServlet;
import junit.framework.TestCase;
import static com.google.inject.servlet.GuiceServletContextListener.INJECTOR_NAME;
import static org.easymock.EasyMock.createMock;
import static org.easymock.EasyMock.eq;
import static org.easymock.EasyMock.expectLastCall;
import static org.easymock.EasyMock.isA;
import static org.easymock.EasyMock.replay;
import static org.easymock.EasyMock.verify;
/**
* This gorgeous test asserts that multiple servlet pipelines can
* run in the SAME JVM. booya.
*
* @author dhanji@gmail.com (Dhanji R. Prasanna)
*/
public class MultipleServletInjectorsTest extends TestCase {
private Injector injectorOne;
private Injector injectorTwo;
public final void testTwoInjectors() {
ServletContext fakeContextOne = createMock(ServletContext.class);
ServletContext fakeContextTwo = createMock(ServletContext.class);
fakeContextOne.setAttribute(eq(INJECTOR_NAME), isA(Injector.class));
expectLastCall().once();
fakeContextTwo.setAttribute(eq(INJECTOR_NAME), isA(Injector.class));
expectLastCall().once();
replay(fakeContextOne);
// Simulate the start of a servlet container.
new GuiceServletContextListener() {
@Override
protected Injector getInjector() {
// Cache this injector in the test for later testing...
return injectorOne = Guice.createInjector(new ServletModule() {
@Override
protected void configureServlets() {
// This creates a ManagedFilterPipeline internally...
serve("/*").with(DummyServlet.class);
}
});
}
}.contextInitialized(new ServletContextEvent(fakeContextOne));
ServletContext contextOne = injectorOne.getInstance(ServletContext.class);
assertNotNull(contextOne);
// Now simulate a second injector with a slightly different config.
replay(fakeContextTwo);
new GuiceServletContextListener() {
@Override
protected Injector getInjector() {
return injectorTwo = Guice.createInjector(new ServletModule() {
@Override
protected void configureServlets() {
// This creates a ManagedFilterPipeline internally...
filter("/8").through(DummyFilterImpl.class);
serve("/*").with(HttpServlet.class);
}
});
}
}.contextInitialized(new ServletContextEvent(fakeContextTwo));
ServletContext contextTwo = injectorTwo.getInstance(ServletContext.class);
// Make sure they are different.
assertNotNull(contextTwo);
assertNotSame(contextOne, contextTwo);
// Make sure they are as expected
assertSame(fakeContextOne, contextOne);
assertSame(fakeContextTwo, contextTwo);
// Make sure they are consistent.
assertSame(contextOne, injectorOne.getInstance(ServletContext.class));
assertSame(contextTwo, injectorTwo.getInstance(ServletContext.class));
verify(fakeContextOne, fakeContextTwo);
}
}