/*
* Copyright 2013 Netflix, 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.netflix.governator.autobind;
import com.google.common.collect.Lists;
import com.google.inject.Binder;
import com.google.inject.Guice;
import com.google.inject.Injector;
import com.google.inject.Module;
import com.google.inject.TypeLiteral;
import com.netflix.governator.LifecycleInjectorBuilderProvider;
import com.netflix.governator.annotations.AutoBind;
import com.netflix.governator.guice.AutoBindProvider;
import com.netflix.governator.guice.AutoBinds;
import com.netflix.governator.guice.BootstrapBinder;
import com.netflix.governator.guice.BootstrapModule;
import com.netflix.governator.guice.LifecycleInjectorBuilder;
import com.tngtech.java.junit.dataprovider.DataProviderRunner;
import com.tngtech.java.junit.dataprovider.UseDataProvider;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import java.util.Collections;
@RunWith(DataProviderRunner.class)
public class TestAutoBind extends LifecycleInjectorBuilderProvider
{
@Test
@UseDataProvider("builders")
public void testSimple(LifecycleInjectorBuilder lifecycleInjectorBuilder)
{
final AutoBindProvider<AutoBind> provider = new AutoBindProvider<AutoBind>()
{
@Override
public void configure(Binder binder, AutoBind autoBindAnnotation)
{
binder.bind(String.class).annotatedWith(autoBindAnnotation).toInstance("a is a");
}
};
Injector injector = lifecycleInjectorBuilder
.ignoringAutoBindClasses(Collections.<Class<?>>singleton(ObjectWithCustomAutoBind.class))
.withBootstrapModule
(
new BootstrapModule()
{
@Override
public void configure(BootstrapBinder binder)
{
binder.bind(new TypeLiteral<AutoBindProvider<AutoBind>>(){}).toInstance(provider);
}
}
)
.usingBasePackages("com.netflix.governator.autobind")
.createInjector();
SimpleAutoBind instance = injector.getInstance(SimpleAutoBind.class);
Assert.assertEquals(instance.getString(), "a is a");
}
@Test
@UseDataProvider("builders")
public void testCustom(LifecycleInjectorBuilder lifecycleInjectorBuilder)
{
@SuppressWarnings("RedundantCast")
Injector injector = lifecycleInjectorBuilder
.ignoringAutoBindClasses(Lists.newArrayList((Class<?>)SimpleAutoBind.class, (Class<?>)SimpleWithMultipleAutoBinds.class, (Class<?>)SimpleWithFieldAutoBind.class, (Class<?>)SimpleWithMethodAutoBind.class))
.withBootstrapModule
(
new BootstrapModule()
{
@Override
public void configure(BootstrapBinder binder)
{
binder.bind(new TypeLiteral<AutoBindProvider<CustomAutoBind>>(){}).to(CustomAutoBindProvider.class).asEagerSingleton();
}
}
)
.usingBasePackages("com.netflix.governator.autobind")
.createInjector();
ObjectWithCustomAutoBind instance = injector.getInstance(ObjectWithCustomAutoBind.class);
Assert.assertEquals(instance.getInjectable().getStr(), "hey");
Assert.assertEquals(instance.getInjectable().getValue(), 1234);
}
@Test
@UseDataProvider("builders")
public void testMultiple(LifecycleInjectorBuilder lifecycleInjectorBuilder)
{
final AutoBindProvider<AutoBind> provider = new AutoBindProvider<AutoBind>()
{
@Override
public void configure(Binder binder, AutoBind autoBindAnnotation)
{
binder.bind(MockWithParameter.class).annotatedWith(autoBindAnnotation).toInstance(new MockWithParameter(autoBindAnnotation.value()));
}
};
Injector injector = lifecycleInjectorBuilder
.ignoringAutoBindClasses(Collections.<Class<?>>singleton(ObjectWithCustomAutoBind.class))
.withBootstrapModule
(
new BootstrapModule()
{
@Override
public void configure(BootstrapBinder binder)
{
binder.bind(new TypeLiteral<AutoBindProvider<AutoBind>>(){}).toInstance(provider);
}
}
)
.usingBasePackages("com.netflix.governator.autobind")
.createInjector();
SimpleWithMultipleAutoBinds instance = injector.getInstance(SimpleWithMultipleAutoBinds.class);
Assert.assertEquals(instance.getArg1().getParameter(), "one");
Assert.assertEquals(instance.getArg2().getParameter(), "two");
Assert.assertEquals(instance.getArg3().getParameter(), "three");
Assert.assertEquals(instance.getArg4().getParameter(), "four");
}
@Test
@UseDataProvider("builders")
public void testField(LifecycleInjectorBuilder lifecycleInjectorBuilder)
{
final AutoBindProvider<AutoBind> provider = new AutoBindProvider<AutoBind>()
{
@Override
public void configure(Binder binder, AutoBind autoBindAnnotation)
{
binder.bind(MockWithParameter.class).annotatedWith(autoBindAnnotation).toInstance(new MockWithParameter(autoBindAnnotation.value()));
}
};
Injector injector = lifecycleInjectorBuilder
.ignoringAutoBindClasses(Collections.<Class<?>>singleton(ObjectWithCustomAutoBind.class))
.withBootstrapModule
(
new BootstrapModule()
{
@Override
public void configure(BootstrapBinder binder)
{
binder.bind(new TypeLiteral<AutoBindProvider<AutoBind>>()
{
}).toInstance(provider);
}
}
)
.usingBasePackages("com.netflix.governator.autobind")
.createInjector();
SimpleWithFieldAutoBind instance = injector.getInstance(SimpleWithFieldAutoBind.class);
Assert.assertEquals(instance.field1.getParameter(), "field1");
Assert.assertEquals(instance.field2.getParameter(), "field2");
}
@Test
@UseDataProvider("builders")
public void testMethod(LifecycleInjectorBuilder lifecycleInjectorBuilder)
{
final AutoBindProvider<AutoBind> provider = new AutoBindProvider<AutoBind>()
{
@Override
public void configure(Binder binder, AutoBind autoBindAnnotation)
{
binder.bind(MockWithParameter.class).annotatedWith(autoBindAnnotation).toInstance(new MockWithParameter(autoBindAnnotation.value()));
}
};
Injector injector = lifecycleInjectorBuilder
.ignoringAutoBindClasses(Collections.<Class<?>>singleton(ObjectWithCustomAutoBind.class))
.withBootstrapModule
(
new BootstrapModule()
{
@Override
public void configure(BootstrapBinder binder)
{
binder.bind(new TypeLiteral<AutoBindProvider<AutoBind>>(){}).toInstance(provider);
}
}
)
.usingBasePackages("com.netflix.governator.autobind")
.createInjector();
SimpleWithMethodAutoBind instance = injector.getInstance(SimpleWithMethodAutoBind.class);
Assert.assertEquals(instance.getF1().getParameter(), "f1");
Assert.assertEquals(instance.getF2().getParameter(), "f2");
}
@Test
public void testNormally()
{
Injector injector = Guice.createInjector
(
new Module()
{
@Override
public void configure(Binder binder)
{
binder.bind(String.class).annotatedWith(AutoBinds.withValue("foo")).toInstance("we are the music makers");
}
}
);
Assert.assertEquals(injector.getInstance(SimpleAutoBind.class).getString(), "we are the music makers");
}
private static class CustomAutoBindProvider implements AutoBindProvider<CustomAutoBind>
{
@Override
public void configure(Binder binder, CustomAutoBind custom)
{
binder.bind(MockInjectable.class).annotatedWith(custom).toInstance(new MockInjectable(custom.str(), custom.value()));
}
}
}