/** * 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 org.apache.aurora; import java.util.List; import javax.inject.Singleton; import com.google.common.collect.ImmutableList; import com.google.inject.AbstractModule; import com.google.inject.CreationException; import com.google.inject.Guice; import com.google.inject.Injector; import org.apache.aurora.GuiceUtils.AllowUnchecked; import org.junit.Test; import static org.junit.Assert.fail; public class GuiceUtilsTest { interface Flaky { void get(); void append(List<String> strings); void skipped(); } interface AlsoFlaky extends Flaky { void get(int value); void put(String s); } static class NotSoFlakyImpl implements AlsoFlaky { @Override public void put(String s) { throw new RuntimeException("Call failed"); } @Override public void append(List<String> strings) { throw new RuntimeException("Call failed"); } @AllowUnchecked @Override public void skipped() { throw new RuntimeException("Call failed"); } @Override public void get(int value) { throw new RuntimeException("Call failed"); } @Override public void get() { throw new RuntimeException("Call failed"); } } @Test public void testExceptionTrapping() { Injector injector = Guice.createInjector(new AbstractModule() { @Override protected void configure() { GuiceUtils.bindExceptionTrap(binder(), Flaky.class); bind(Flaky.class).to(NotSoFlakyImpl.class); bind(AlsoFlaky.class).to(NotSoFlakyImpl.class); bind(NotSoFlakyImpl.class).in(Singleton.class); } }); AlsoFlaky flaky = injector.getInstance(AlsoFlaky.class); flaky.get(); flaky.append(ImmutableList.of("hi")); try { flaky.put("hello"); fail("Should have thrown"); } catch (RuntimeException e) { // Expected. } try { flaky.get(2); fail("Should have thrown"); } catch (RuntimeException e) { // Expected. } try { flaky.skipped(); fail("Should have thrown"); } catch (RuntimeException e) { // Expected. } } interface NonVoid { int get(); } @Test(expected = CreationException.class) public void testNoTrappingNonVoidMethods() { Guice.createInjector(new AbstractModule() { @Override protected void configure() { GuiceUtils.bindExceptionTrap(binder(), NonVoid.class); fail("Bind should have failed."); } }); } interface NonVoidWhitelisted { @AllowUnchecked int getWhitelisted(); } @Test public void testWhitelistNonVoidMethods() { Guice.createInjector(new AbstractModule() { @Override protected void configure() { GuiceUtils.bindExceptionTrap(binder(), NonVoidWhitelisted.class); } }); } }