package org.limewire.inject; import java.util.Collection; import junit.framework.Test; import org.limewire.util.BaseTestCase; import com.google.inject.CreationException; import com.google.inject.Guice; import com.google.inject.Injector; import com.google.inject.Provider; import com.google.inject.Stage; import com.google.inject.spi.Message; public class LazyBinderTest extends BaseTestCase { private static int ANNOTATED_CONSTRUCTED; private static int PLAIN_CONSTRUCTED; public LazyBinderTest(String name) { super(name); } public static Test suite() { return buildTestSuite(LazyBinderTest.class); } @Override protected void setUp() throws Exception { ANNOTATED_CONSTRUCTED = 0; PLAIN_CONSTRUCTED = 0; } public void testLazyBinderAnnotated() { assertEquals(0, ANNOTATED_CONSTRUCTED); Injector injector = Guice.createInjector(Stage.DEVELOPMENT, new AbstractModule() { @Override protected void configure() { install(new LimeWireInjectModule()); bind(Foo.class).toProvider(LazyBinder.newLazyProvider(Foo.class, AnnotatedFoo.class)); } }); assertEquals(0, ANNOTATED_CONSTRUCTED); Provider<Foo> pFoo = injector.getProvider(Foo.class); assertEquals(0, ANNOTATED_CONSTRUCTED); Foo foo = injector.getInstance(Foo.class); assertEquals(0, ANNOTATED_CONSTRUCTED); assertSame(foo, pFoo.get()); assertEquals(0, ANNOTATED_CONSTRUCTED); assertSame(foo, injector.getInstance(Foo.class)); assertEquals(0, ANNOTATED_CONSTRUCTED); foo.bar(); assertEquals(1, ANNOTATED_CONSTRUCTED); foo.baz(); assertEquals(1, ANNOTATED_CONSTRUCTED); } public void testLazyBinderBoundToClass() { assertEquals(0, PLAIN_CONSTRUCTED); Injector injector = Guice.createInjector(Stage.DEVELOPMENT, new AbstractModule() { @Override protected void configure() { install(new LimeWireInjectModule()); bind(PlainFoo.class).in(LazySingleton.class); bind(Foo.class).toProvider(LazyBinder.newLazyProvider(Foo.class, PlainFoo.class)); } }); assertEquals(0, PLAIN_CONSTRUCTED); Provider<Foo> pFoo = injector.getProvider(Foo.class); assertEquals(0, PLAIN_CONSTRUCTED); Foo foo = injector.getInstance(Foo.class); assertEquals(0, PLAIN_CONSTRUCTED); assertSame(foo, pFoo.get()); assertEquals(0, PLAIN_CONSTRUCTED); assertSame(foo, injector.getInstance(Foo.class)); assertEquals(0, PLAIN_CONSTRUCTED); foo.bar(); assertEquals(1, PLAIN_CONSTRUCTED); foo.baz(); assertEquals(1, PLAIN_CONSTRUCTED); } public void testLazyBinderBoundToScope() { assertEquals(0, PLAIN_CONSTRUCTED); Injector injector = Guice.createInjector(Stage.DEVELOPMENT, new AbstractModule() { @Override protected void configure() { install(new LimeWireInjectModule()); bind(PlainFoo.class).in(MoreScopes.LAZY_SINGLETON); bind(Foo.class).toProvider(LazyBinder.newLazyProvider(Foo.class, PlainFoo.class)); } }); assertEquals(0, PLAIN_CONSTRUCTED); Provider<Foo> pFoo = injector.getProvider(Foo.class); assertEquals(0, PLAIN_CONSTRUCTED); Foo foo = injector.getInstance(Foo.class); assertEquals(0, PLAIN_CONSTRUCTED); assertSame(foo, pFoo.get()); assertEquals(0, PLAIN_CONSTRUCTED); assertSame(foo, injector.getInstance(Foo.class)); assertEquals(0, PLAIN_CONSTRUCTED); foo.bar(); assertEquals(1, PLAIN_CONSTRUCTED); foo.baz(); assertEquals(1, PLAIN_CONSTRUCTED); } public void testFailsOnNoScope() { try { Guice.createInjector(new AbstractModule() { @Override protected void configure() { bind(Foo.class).toProvider( LazyBinder.newLazyProvider(Foo.class, PlainFoo.class)); } }); } catch (CreationException ce) { Collection<Message> messages = ce.getErrorMessages(); assertEquals(1, messages.size()); Message message = messages.iterator().next(); assertEquals("Class: class org.limewire.inject.LazyBinderTest$PlainFoo must be in scope @Singleton or @LazySingleton or @EagerSingleton", message.getCause().getMessage()); } } private interface Foo { void bar(); void baz(); } @LazySingleton private static class AnnotatedFoo implements Foo { public AnnotatedFoo() { ANNOTATED_CONSTRUCTED++; } @Override public void bar() {} @Override public void baz() {} } private static class PlainFoo implements Foo { public PlainFoo() { PLAIN_CONSTRUCTED++; } @Override public void bar() {} @Override public void baz() {} } }