package org.jboss.as.test.integration.deployment.dependencies; import java.io.IOException; import java.util.Hashtable; import javax.naming.Context; import javax.naming.InitialContext; import javax.naming.NamingException; import org.jboss.arquillian.container.spi.client.container.DeploymentException; import org.jboss.arquillian.container.test.api.Deployment; import org.jboss.arquillian.container.test.api.RunAsClient; import org.jboss.arquillian.junit.Arquillian; import org.jboss.arquillian.test.api.ArquillianResource; import org.jboss.as.arquillian.container.ArchiveDeployer; import org.jboss.as.arquillian.container.ManagementClient; import org.jboss.as.controller.PathAddress; import org.jboss.as.controller.operations.common.Util; import org.jboss.dmr.ModelNode; import org.jboss.shrinkwrap.api.Archive; import org.jboss.shrinkwrap.api.ShrinkWrap; import org.jboss.shrinkwrap.api.spec.JavaArchive; import org.junit.After; import org.junit.Assert; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; import org.junit.runner.RunWith; /** * Tests inter deployment dependencies */ @RunWith(Arquillian.class) @RunAsClient public class InterDeploymentDependenciesTestCase { private static final String APP_NAME = ""; private static final String DISTINCT_NAME = ""; // Dummy deployment so arq will be able to inject a ManagementClient @Deployment public static Archive<?> getDeployment() { return ShrinkWrap.create(JavaArchive.class, "dummy.jar"); } private static JavaArchive DEPENDEE = ShrinkWrap.create(JavaArchive.class, "dependee.jar") .addClasses(DependeeEjb.class, StringView.class); private static JavaArchive DEPENDENT = ShrinkWrap.create(JavaArchive.class, "dependent.jar") .addClasses(DependentEjb.class, StringView.class) .addAsManifestResource(InterDeploymentDependenciesTestCase.class.getPackage(), "jboss-all.xml", "jboss-all.xml"); private static Context context; @BeforeClass public static void beforeClass() throws Exception { final Hashtable<String, String> props = new Hashtable<>(); props.put(Context.URL_PKG_PREFIXES, "org.jboss.ejb.client.naming"); context = new InitialContext(props); } @ArquillianResource public ManagementClient managementClient; // We don't inject this via @ArquillianResource because ARQ can't fully control // DEPENDEE and DEPENDENT and things go haywire if we try. But we use ArchiveDeployer // because it's a convenient API for handling deploy/undeploy of Shrinkwrap archives private ArchiveDeployer deployer; @Before public void setup() { deployer = new ArchiveDeployer(managementClient); } @After public void cleanUp() { try { deployer.undeploy(DEPENDENT.getName()); } catch (Exception e) { // Ignore } try { deployer.undeploy(DEPENDEE.getName()); } catch (Exception e) { // Ignore } } @Test public void testDeploymentDependencies() throws NamingException, DeploymentException { try { deployer.deploy(DEPENDENT); Assert.fail("Deployment did not fail"); } catch (Exception e) { // expected } deployer.deploy(DEPENDEE); deployer.deploy(DEPENDENT); StringView ejb = lookupStringView(); Assert.assertEquals("hello", ejb.getString()); } @Test public void testDeploymentDependenciesWithRestart() throws NamingException, IOException, DeploymentException { try { deployer.deploy(DEPENDENT); Assert.fail("Deployment did not fail"); } catch (Exception e) { // expected } deployer.deploy(DEPENDEE); deployer.deploy(DEPENDENT); StringView ejb = lookupStringView(); Assert.assertEquals("hello", ejb.getString()); ModelNode response = managementClient.getControllerClient().execute(Util.createEmptyOperation("redeploy", PathAddress.pathAddress("deployment", DEPENDEE.getName()))); Assert.assertEquals(response.toString(), "success", response.get("outcome").asString()); ejb = lookupStringView(); Assert.assertEquals("hello", ejb.getString()); } private static StringView lookupStringView() throws NamingException { return (StringView) context.lookup("ejb:" + APP_NAME + "/dependent/" + DISTINCT_NAME + "/" + DependentEjb.class.getSimpleName() + "!" + StringView.class.getName()); } }