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.HashSet; import java.util.List; import java.util.function.UnaryOperator; import javax.inject.Inject; import javax.inject.Named; import javax.inject.Singleton; public class AdvisedProviderTest { public static class Bar { final List<String> list; @Inject Bar(@TestQualifier(name="bar") List<String> list) { this.list = list; } } private static final TypeLiteral<List<String>> LIST_TYPE_LITERAL = new TypeLiteral<List<String>>() {}; @Test public void testCombinationOfStringClassAndNoQualifiers() { Injector injector = Guice.createInjector(new AbstractModule() { @Override protected void configure() { install(AdvisableAnnotatedMethodScanner.asModule()); } @ProvidesWithAdvice @Singleton List<String> getListWithNoQualifiers() { return new ArrayList<>(Arrays.asList("")); } @ProvidesWithAdvice @Singleton String getStringBuilder() { return "0"; } @ProvidesWithAdvice @Singleton @Named("foo") List<String> getListWithStringQualifier() { return new ArrayList<>(Arrays.asList("foo")); } @ProvidesWithAdvice @Singleton @TestQualifier(name="bar") List<String> getListWithTestQualifier() { return new ArrayList<>(Arrays.asList("bar")); } @Advises(order=1) UnaryOperator<List<String>> adviseNoQualifier1() { return list -> { list.add("1"); return list; }; } @Advises(order=2) UnaryOperator<List<String>> adviseNoQualifier2() { return list -> { list.add("2"); return list; }; } @Advises(order=1) UnaryOperator<String> adviseNoQualifierStringBuilder1() { return str -> str + "1"; } @Advises(order=2) UnaryOperator<String> adviseNoQualifierStringBuilder2() { return str -> str + "2"; } @Advises(order=1) @Named("foo") UnaryOperator<List<String>> adviseNamedQualifier1() { return list -> { list.add("foo1"); return list; }; } @Advises(order=2) @Named("foo") UnaryOperator<List<String>> adviseNamedQualifier2() { return list -> { list.add("foo2"); return list; }; } @Advises(order=1) @TestQualifier(name="bar") UnaryOperator<List<String>> adviseTestQualifier1() { return list -> { list.add("bar1"); return list; }; } @Advises(order=2) @TestQualifier(name="bar") UnaryOperator<List<String>> adviseTestQualifier2() { return list -> { list.add("bar2"); return list; }; } }); String noQualifierString = injector.getInstance(String.class); List<String> noQualifier = injector.getInstance(Key.get(LIST_TYPE_LITERAL)); List<String> nameQualifier = injector.getInstance(Key.get(LIST_TYPE_LITERAL, Names.named("foo"))); Bar bar = injector.getInstance(Bar.class); Assert.assertEquals("012", noQualifierString); Assert.assertEquals(Arrays.asList("", "1", "2"), noQualifier); Assert.assertEquals(Arrays.asList("foo", "foo1", "foo2"), nameQualifier); Assert.assertEquals(Arrays.asList("bar", "bar1", "bar2"), bar.list); } @Test public void testDuplicateOrder() { Injector injector = Guice.createInjector(new AbstractModule() { @Override protected void configure() { install(AdvisableAnnotatedMethodScanner.asModule()); } @ProvidesWithAdvice @Singleton List<String> getListWithNoQualifiers() { return new ArrayList<>(Arrays.asList("")); } @Advises(order=1) UnaryOperator<List<String>> adviseNoQualifier1() { return list -> { list.add("1"); return list; }; } @Advises(order=1) UnaryOperator<List<String>> adviseNoQualifier2() { return list -> { list.add("2"); return list; }; } }); List<String> noQualifier = injector.getInstance(Key.get(LIST_TYPE_LITERAL)); Assert.assertEquals(new HashSet<>(Arrays.asList("", "1", "2")), new HashSet<>(noQualifier)); } }