package com.netflix.governator.autobind.scopes; import com.google.inject.Injector; import com.google.inject.Stage; import com.netflix.governator.annotations.AutoBindSingleton; import com.netflix.governator.guice.LifecycleInjector; import com.netflix.governator.guice.LifecycleInjectorMode; import com.netflix.governator.guice.lazy.LazySingleton; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import java.util.concurrent.atomic.AtomicInteger; public class TestAutoBindSingletonScopes { @AutoBindSingleton public static class AutoBindEagerSingleton { public static AtomicInteger counter = new AtomicInteger(); public AutoBindEagerSingleton() { counter.incrementAndGet(); } } @AutoBindSingleton(eager=false) public static class AutoBindNotEagerSingleton { public static AtomicInteger counter = new AtomicInteger(); public AutoBindNotEagerSingleton() { counter.incrementAndGet(); } } @AutoBindSingleton @LazySingleton public static class AutoBindLazySingleton { public static AtomicInteger counter = new AtomicInteger(); public AutoBindLazySingleton() { counter.incrementAndGet(); } } @Before public void before() { AutoBindEagerSingleton.counter.set(0); AutoBindLazySingleton.counter.set(0); AutoBindNotEagerSingleton.counter.set(0); } @Test public void scopesAreHonoredInDevMode() { Injector injector = LifecycleInjector.builder() .inStage(Stage.DEVELOPMENT) .usingBasePackages("com.netflix.governator.autobind.scopes") .build() .createInjector(); injector.getInstance(AutoBindEagerSingleton.class); injector.getInstance(AutoBindEagerSingleton.class); Assert.assertEquals(1, AutoBindEagerSingleton.counter.get()); Assert.assertEquals(0, AutoBindNotEagerSingleton.counter.get()); Assert.assertEquals(0, AutoBindLazySingleton.counter.get()); } @Test public void scopesAreHonoredInProd() { Injector injector = LifecycleInjector.builder() .inStage(Stage.PRODUCTION) .usingBasePackages("com.netflix.governator.autobind.scopes") .build() .createInjector(); injector.getInstance(AutoBindEagerSingleton.class); injector.getInstance(AutoBindEagerSingleton.class); Assert.assertEquals(1, AutoBindEagerSingleton.counter.get()); Assert.assertEquals(0, AutoBindNotEagerSingleton.counter.get()); Assert.assertEquals(0, AutoBindLazySingleton.counter.get()); } @Test public void scopesAreHonoredInDevModeNoChild() { Injector injector = LifecycleInjector.builder() .inStage(Stage.DEVELOPMENT) .withMode(LifecycleInjectorMode.SIMULATED_CHILD_INJECTORS) .usingBasePackages("com.netflix.governator.autobind.scopes") .build() .createInjector(); injector.getInstance(AutoBindEagerSingleton.class); injector.getInstance(AutoBindEagerSingleton.class); Assert.assertEquals(1, AutoBindEagerSingleton.counter.get()); Assert.assertEquals(0, AutoBindNotEagerSingleton.counter.get()); Assert.assertEquals(0, AutoBindLazySingleton.counter.get()); } @Test public void scopesAreHonoredInProdNoChild() { Injector injector = LifecycleInjector.builder() .inStage(Stage.PRODUCTION) .withMode(LifecycleInjectorMode.SIMULATED_CHILD_INJECTORS) .usingBasePackages("com.netflix.governator.autobind.scopes") .build() .createInjector(); injector.getInstance(AutoBindEagerSingleton.class); injector.getInstance(AutoBindEagerSingleton.class); Assert.assertEquals(1, AutoBindEagerSingleton.counter.get()); Assert.assertEquals(0, AutoBindNotEagerSingleton.counter.get()); Assert.assertEquals(0, AutoBindLazySingleton.counter.get()); } }