/** * Copyright (c) 2013-2016, The SeedStack authors <http://seedstack.org> * * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ package org.seedstack.seed.core; import com.google.inject.Injector; import com.google.inject.Module; import org.assertj.core.api.Assertions; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.seedstack.seed.JndiContext; import org.seedstack.seed.core.fixtures.Service1; import org.seedstack.seed.core.rules.SeedITRule; import javax.annotation.Resource; import javax.inject.Inject; import javax.inject.Named; import javax.naming.Context; import javax.naming.InvalidNameException; import javax.naming.Name; import javax.naming.NamingException; import java.util.Enumeration; import static org.assertj.core.api.Assertions.assertThatExceptionOfType; import static org.assertj.core.api.Assertions.fail; public class JndiIT { @Rule public SeedITRule rule = new SeedITRule(this); private Injector injector; static class Holder { @Inject Context defaultCtx; @Inject @Named("defaultContext") Context defaultCtxViaName; @Inject @Named("test1") Context ctx1; @Inject @Named("test2") Context ctx2; @Resource(name = "org.seedstack.seed.core.fixtures.Service/Service1") Service1 service1Default; @Resource(name = "org.seedstack.seed.core.fixtures.Service1") @JndiContext("test2") Service1 service1Named; } @Before public void before() { injector = rule.getKernel().objectGraph().as(Injector.class).createChildInjector((Module) binder -> binder.bind(Holder.class)); } @Test public void jndi_context_injection_is_working() throws Exception { Holder holder = injector.getInstance(Holder.class); Assertions.assertThat(holder.defaultCtx).isNotNull(); Assertions.assertThat(holder.defaultCtxViaName).isNotNull(); Assertions.assertThat(holder.ctx1).isNotNull(); Assertions.assertThat(holder.ctx2).isNotNull(); Assertions.assertThat(holder.defaultCtx).isSameAs(holder.defaultCtxViaName); } @Test public void jndi_context_lookup_is_working() throws NamingException { Service1 service1 = (Service1) injector.getInstance(Holder.class).ctx1.lookup("org.seedstack.seed.core.fixtures.Service1"); Assertions.assertThat(service1).isNotNull(); } @Test(expected = NamingException.class) public void wrong_class_name_lookup_throws_exception() throws NamingException { injector.getInstance(Holder.class).ctx1.lookup("org.seedstack.seed.core.fixtures.WrongName"); fail("should have failed"); } @Test public void jndi_context_named_lookup_is_working() throws NamingException { Service1 service1ByClassAndName = (Service1) injector.getInstance(Holder.class).ctx1.lookup("org.seedstack.seed.core.fixtures.Service/Service1"); Service1 service1ByClass = (Service1) injector.getInstance(Holder.class).ctx1.lookup("org.seedstack.seed.core.fixtures.Service1"); Assertions.assertThat(service1ByClassAndName).isNotNull(); Assertions.assertThat(service1ByClassAndName).isSameAs(service1ByClass); } @Test public void two_identically_configured_jndi_contexts_are_not_the_same_instance() throws NamingException { Holder holder = injector.getInstance(Holder.class); Assertions.assertThat(holder.ctx1).isNotSameAs(holder.ctx2); } @Test public void explicit_resource_injection_from_default_context_is_working() throws NamingException { Holder holder = injector.getInstance(Holder.class); Assertions.assertThat(holder.service1Default).isNotNull(); Assertions.assertThat(holder.service1Named).isEqualTo(injector.getInstance(Holder.class).ctx1.lookup("org.seedstack.seed.core.fixtures.Service1")); } @Test public void explicit_resource_injection_from_named_context_is_working() throws NamingException { Holder holder = injector.getInstance(Holder.class); Assertions.assertThat(holder.service1Named).isNotNull(); Assertions.assertThat(holder.service1Named).isEqualTo(injector.getInstance(Holder.class).ctx1.lookup("org.seedstack.seed.core.fixtures.Service1")); } @Test public void implicit_resource_injection_is_working() throws NamingException { Holder holder = injector.getInstance(Holder.class); Assertions.assertThat(holder.service1Default).isNotNull(); Assertions.assertThat(holder.service1Named).isEqualTo(injector.getInstance(Holder.class).ctx1.lookup("org.seedstack.seed.core.fixtures.Service1")); } @Test public void jndi_context_is_immutable() throws Exception { Context context = injector.getInstance(Holder.class).ctx1; assertThatExceptionOfType(NamingException.class).isThrownBy(() -> context.bind(new DummyName(), new Object())); assertThatExceptionOfType(NamingException.class).isThrownBy(() -> context.bind("", new Object())); assertThatExceptionOfType(NamingException.class).isThrownBy(() -> context.rebind(new DummyName(), new Object())); assertThatExceptionOfType(NamingException.class).isThrownBy(() -> context.rebind("", new Object())); assertThatExceptionOfType(NamingException.class).isThrownBy(() -> context.unbind(new DummyName())); assertThatExceptionOfType(NamingException.class).isThrownBy(() -> context.unbind("")); assertThatExceptionOfType(NamingException.class).isThrownBy(() -> context.rename(new DummyName(), new DummyName())); assertThatExceptionOfType(NamingException.class).isThrownBy(() -> context.rename("", "")); assertThatExceptionOfType(UnsupportedOperationException.class).isThrownBy(() -> context.list(new DummyName())); assertThatExceptionOfType(UnsupportedOperationException.class).isThrownBy(() -> context.list("")); assertThatExceptionOfType(UnsupportedOperationException.class).isThrownBy(() -> context.listBindings(new DummyName())); assertThatExceptionOfType(UnsupportedOperationException.class).isThrownBy(() -> context.listBindings("")); assertThatExceptionOfType(NamingException.class).isThrownBy(() -> context.destroySubcontext(new DummyName())); assertThatExceptionOfType(NamingException.class).isThrownBy(() -> context.destroySubcontext("")); assertThatExceptionOfType(NamingException.class).isThrownBy(() -> context.createSubcontext(new DummyName())); assertThatExceptionOfType(NamingException.class).isThrownBy(() -> context.createSubcontext("")); assertThatExceptionOfType(UnsupportedOperationException.class).isThrownBy(() -> context.lookupLink(new DummyName())); assertThatExceptionOfType(UnsupportedOperationException.class).isThrownBy(() -> context.lookupLink("")); assertThatExceptionOfType(UnsupportedOperationException.class).isThrownBy(() -> context.getNameParser(new DummyName())); assertThatExceptionOfType(UnsupportedOperationException.class).isThrownBy(() -> context.getNameParser("")); // Cannot test composeName methods (implemented in InitialContext) assertThatExceptionOfType(NamingException.class).isThrownBy(() -> context.addToEnvironment("", new Object())); assertThatExceptionOfType(NamingException.class).isThrownBy(() -> context.removeFromEnvironment("")); assertThatExceptionOfType(NamingException.class).isThrownBy(() -> context.removeFromEnvironment("")); assertThatExceptionOfType(UnsupportedOperationException.class).isThrownBy(context::getNameInNamespace); } private static class DummyName implements Name { @Override public int compareTo(Object obj) { return 0; } @Override public int size() { return 0; } @Override public boolean isEmpty() { return false; } @Override public Enumeration<String> getAll() { return null; } @Override public String get(int posn) { return null; } @Override public Name getPrefix(int posn) { return null; } @Override public Name getSuffix(int posn) { return null; } @Override public boolean startsWith(Name n) { return false; } @Override public boolean endsWith(Name n) { return false; } @Override public Name addAll(Name suffix) throws InvalidNameException { return null; } @Override public Name addAll(int posn, Name n) throws InvalidNameException { return null; } @Override public Name add(String comp) throws InvalidNameException { return null; } @Override public Name add(int posn, String comp) throws InvalidNameException { return null; } @Override public Object remove(int posn) throws InvalidNameException { return null; } @Override public Object clone() { return null; } } }