package com.netflix.governator.providers; import com.google.inject.AbstractModule; import com.google.inject.Guice; import com.google.inject.Injector; import com.google.inject.Key; import com.google.inject.TypeLiteral; import com.google.inject.name.Names; import org.junit.Assert; import org.junit.Test; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.function.UnaryOperator; import javax.inject.Named; public class AdvisesBinderTest { static class AdviseList implements UnaryOperator<List<String>> { @Override public List<String> apply(List<String> t) { t.add("a"); return t; } } @Test public void adviseWithAdvice() { TypeLiteral<List<String>> LIST_TYPE_LITERAL = new TypeLiteral<List<String>>() {}; Injector injector = Guice.createInjector(new AbstractModule() { @Override protected void configure() { install(AdvisableAnnotatedMethodScanner.asModule()); AdvisesBinder.bind(binder(), LIST_TYPE_LITERAL).toInstance(new ArrayList<>()); AdvisesBinder.bindAdvice(binder(), LIST_TYPE_LITERAL, 0).to(AdviseList.class); } }); List<String> list = injector.getInstance(Key.get(LIST_TYPE_LITERAL)); Assert.assertEquals(Arrays.asList("a"), list); } @Test public void provisionWithoutAdviseDoesntBlowUp() { TypeLiteral<List<String>> LIST_TYPE_LITERAL = new TypeLiteral<List<String>>() {}; Guice.createInjector(new AbstractModule() { @Override protected void configure() { install(AdvisableAnnotatedMethodScanner.asModule()); AdvisesBinder.bindAdvice(binder(), LIST_TYPE_LITERAL, 0).to(AdviseList.class); } }); } @Test public void adviseWithoutQualifier() { TypeLiteral<List<String>> LIST_TYPE_LITERAL = new TypeLiteral<List<String>>() {}; Injector injector = Guice.createInjector(new AbstractModule() { @Override protected void configure() { install(AdvisableAnnotatedMethodScanner.asModule()); AdvisesBinder.bind(binder(), LIST_TYPE_LITERAL).toInstance(new ArrayList<>()); AdvisesBinder.bindAdvice(binder(), LIST_TYPE_LITERAL, 0).to(AdviseList.class); } @Advises UnaryOperator<List<String>> advise() { return list -> { list.add("b"); return list; }; } }); List<String> list = injector.getInstance(Key.get(LIST_TYPE_LITERAL)); Assert.assertEquals(Arrays.asList("a", "b"), list); } @Test public void adviseWithQualifier() { TypeLiteral<List<String>> LIST_TYPE_LITERAL = new TypeLiteral<List<String>>() {}; Injector injector = Guice.createInjector(new AbstractModule() { @Override protected void configure() { install(AdvisableAnnotatedMethodScanner.asModule()); AdvisesBinder.bind(binder(), LIST_TYPE_LITERAL, Names.named("test")).toInstance(new ArrayList<>()); AdvisesBinder.bindAdvice(binder(), LIST_TYPE_LITERAL, Names.named("test"), 0).to(AdviseList.class); } @Advises @Named("test") UnaryOperator<List<String>> advise() { return list -> { list.add("b"); return list; }; } }); List<String> list = injector.getInstance(Key.get(LIST_TYPE_LITERAL, Names.named("test"))); Assert.assertEquals(Arrays.asList("a", "b"), list); } @Test public void adviseNoBleedingBetweenQualifiers() { TypeLiteral<List<String>> LIST_TYPE_LITERAL = new TypeLiteral<List<String>>() {}; Injector injector = Guice.createInjector(new AbstractModule() { @Override protected void configure() { install(AdvisableAnnotatedMethodScanner.asModule()); AdvisesBinder.bind(binder(), LIST_TYPE_LITERAL, Names.named("test")).toInstance(new ArrayList<>()); AdvisesBinder.bindAdvice(binder(), LIST_TYPE_LITERAL, Names.named("test"), 0).to(AdviseList.class); AdvisesBinder.bind(binder(), LIST_TYPE_LITERAL).toInstance(new ArrayList<>()); AdvisesBinder.bindAdvice(binder(), LIST_TYPE_LITERAL, 0).to(AdviseList.class); } @Advises @Named("test") UnaryOperator<List<String>> adviseQualified() { return list -> { list.add("qualified"); return list; }; } @Advises UnaryOperator<List<String>> adviseNotQualified() { return list -> { list.add("not qualified"); return list; }; } }); List<String> list; list = injector.getInstance(Key.get(LIST_TYPE_LITERAL, Names.named("test"))); Assert.assertEquals(Arrays.asList("a", "qualified"), list); list = injector.getInstance(Key.get(LIST_TYPE_LITERAL)); Assert.assertEquals(Arrays.asList("a", "not qualified"), list); } }