/* * Copyright (C) 2016 Red Hat, inc., and individual contributors * as indicated by the @author tags. See the copyright.txt file in the * distribution for a full listing of individual contributors. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301 USA */ package org.jboss.as.test.integration.deployment; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.HttpClients; import org.apache.http.util.EntityUtils; import org.jboss.arquillian.container.test.api.RunAsClient; import org.jboss.arquillian.junit.Arquillian; import org.jboss.as.arquillian.api.ContainerResource; import org.jboss.as.arquillian.container.ManagementClient; import org.jboss.as.controller.client.Operation; import org.jboss.as.controller.client.helpers.Operations; import org.jboss.as.controller.descriptions.ModelDescriptionConstants; import org.jboss.as.test.integration.deployment.classloading.ear.subdeployments.ejb.EJBBusinessInterface; import org.jboss.as.test.integration.deployment.classloading.ear.subdeployments.ejb.SimpleSLSB; import org.jboss.as.test.integration.deployment.classloading.ear.subdeployments.servlet.EjbInvokingServlet; import org.jboss.as.test.integration.deployment.classloading.ear.subdeployments.servlet.HelloWorldServlet; import org.jboss.as.test.shared.TestSuiteEnvironment; import org.jboss.dmr.ModelNode; import org.jboss.logging.Logger; import org.jboss.shrinkwrap.api.ShrinkWrap; import org.jboss.shrinkwrap.api.exporter.ZipExporter; import org.jboss.shrinkwrap.api.spec.EnterpriseArchive; import org.jboss.shrinkwrap.api.spec.JavaArchive; import org.jboss.shrinkwrap.api.spec.WebArchive; import org.junit.After; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import java.io.InputStream; import java.util.ArrayList; import java.util.List; /** * Tests to check that the subdeployments function properly with other subdeployments after using * the explode operation. * @author <a href="mailto:mjurc@redhat.com">Michal Jurc</a> (c) 2016 Red Hat, Inc. */ @RunWith(Arquillian.class) @RunAsClient public class SubDeploymentOperationsTestCase { private static final Logger logger = Logger.getLogger(SubDeploymentOperationsTestCase.class); private static final String TEST_DEPLOYMENT_NAME = "subdeployment-test.ear"; private static final String JAR_SUBDEPLOYMENT_NAME = "subdeployment-test-ejb.jar"; private static final String WAR_SUBDEPLOYMENT_NAME = "subdeployment-test-web.war"; private static final String ARCHIVED_DEPLOYMENT_ERROR_CODE = "WFLYSRV0258"; @ContainerResource ManagementClient managementClient; @Before public void setUpDeployment() throws Exception { ModelNode op = new ModelNode(); op.get(ModelDescriptionConstants.OP).set(ModelDescriptionConstants.READ_RESOURCE_OPERATION); op.get(ModelDescriptionConstants.OP_ADDR).set(ModelDescriptionConstants.DEPLOYMENT, TEST_DEPLOYMENT_NAME); ModelNode result = managementClient.getControllerClient().execute(op); if (Operations.isSuccessfulOutcome(result)) { undeploy(TEST_DEPLOYMENT_NAME); remove(TEST_DEPLOYMENT_NAME); } result = initialDeploy(); Assert.assertTrue("Failure to set the initial development up: " + result.toString(), Operations.isSuccessfulOutcome(result)); result = undeploy(TEST_DEPLOYMENT_NAME); Assert.assertTrue("Failure to undeploy the initial development: " + result.toString(), Operations.isSuccessfulOutcome(result)); } @After public void cleanUpDeployment() throws Exception { ModelNode op = new ModelNode(); op.get(ModelDescriptionConstants.OP).set(ModelDescriptionConstants.READ_RESOURCE_OPERATION); op.get(ModelDescriptionConstants.OP_ADDR).set(ModelDescriptionConstants.DEPLOYMENT, TEST_DEPLOYMENT_NAME); ModelNode result = managementClient.getControllerClient().execute(op); if (Operations.isSuccessfulOutcome(result)) { undeploy(TEST_DEPLOYMENT_NAME); remove(TEST_DEPLOYMENT_NAME); } } @Test public void testExplodeJarSubDeployment() throws Exception { ModelNode result = explode(TEST_DEPLOYMENT_NAME, ""); Assert.assertTrue("Failure to explode the initial deployment: " + result.toString(), Operations.isSuccessfulOutcome(result)); result = explode(TEST_DEPLOYMENT_NAME, JAR_SUBDEPLOYMENT_NAME); Assert.assertTrue("Failure to explode JAR subdeployment: " + result.toString(), Operations.isSuccessfulOutcome(result)); result = deploy(TEST_DEPLOYMENT_NAME); Assert.assertTrue("Failure to redeploy the deployment: " + result.toString(), Operations.isSuccessfulOutcome(result)); testEjbClassAvailableInServlet(); } @Test public void testExplodeWarSubDeployment() throws Exception { ModelNode result = explode(TEST_DEPLOYMENT_NAME, ""); Assert.assertTrue("Failure to explode the initial deployment: " + result.toString(), Operations.isSuccessfulOutcome(result)); result = explode(TEST_DEPLOYMENT_NAME, WAR_SUBDEPLOYMENT_NAME); Assert.assertTrue("Failure to explode WAR subdeployment: " + result.toString(), Operations.isSuccessfulOutcome(result)); result = deploy(TEST_DEPLOYMENT_NAME); Assert.assertTrue("Failure to redeploy the deployment: " + result.toString(), Operations.isSuccessfulOutcome(result)); testEjbClassAvailableInServlet(); } @Test public void testExplodeJarAndWarSubDeployment() throws Exception { ModelNode result = explode(TEST_DEPLOYMENT_NAME, ""); Assert.assertTrue("Failure to explode the initial deployment: " + result.toString(), Operations.isSuccessfulOutcome(result)); result = explode(TEST_DEPLOYMENT_NAME, JAR_SUBDEPLOYMENT_NAME); Assert.assertTrue("Failure to explode JAR subdeployment: " + result.toString(), Operations.isSuccessfulOutcome(result)); result = explode(TEST_DEPLOYMENT_NAME, WAR_SUBDEPLOYMENT_NAME); Assert.assertTrue("Failure to explode WAR subdeployment: " + result.toString(), Operations.isSuccessfulOutcome(result)); result = deploy(TEST_DEPLOYMENT_NAME); Assert.assertTrue("Failure to redeploy the deployment: " + result.toString(), Operations.isSuccessfulOutcome(result)); testEjbClassAvailableInServlet(); } @Test public void testExplodeJarSubDeploymentArchiveDeployment() throws Exception { ModelNode result = explode(TEST_DEPLOYMENT_NAME, JAR_SUBDEPLOYMENT_NAME); Assert.assertFalse("Exploding JAR subdeployment of archived deployment should fail, but outcome was " + result.toString(), Operations.isSuccessfulOutcome(result)); String failure = Operations.getFailureDescription(result).asString(); Assert.assertTrue("Exploding JAR subdeployment of archived deployment failed with wrong reason: " + failure, failure.contains(ARCHIVED_DEPLOYMENT_ERROR_CODE)); result = deploy(TEST_DEPLOYMENT_NAME); Assert.assertTrue("Failure to redeploy the deployment: " + result.toString(), Operations.isSuccessfulOutcome(result)); testEjbClassAvailableInServlet(); } @Test public void testExplodeWarSubDeploymentArchiveDeployment() throws Exception { ModelNode result = explode(TEST_DEPLOYMENT_NAME, WAR_SUBDEPLOYMENT_NAME); Assert.assertFalse("Exploding WAR subdeployment of archived deployment should fail, but outcome was " + result.toString(), Operations.isSuccessfulOutcome(result)); String failure = Operations.getFailureDescription(result).asString(); Assert.assertTrue("Exploding WAR subdeployment of archived deployment failed with wrong reason: " + failure, failure.contains(ARCHIVED_DEPLOYMENT_ERROR_CODE)); result = deploy(TEST_DEPLOYMENT_NAME); Assert.assertTrue("Failure to redeploy the deployment: " + result.toString(), Operations.isSuccessfulOutcome(result)); testEjbClassAvailableInServlet(); } private ModelNode initialDeploy() throws Exception { ModelNode result; List<InputStream> attachments = new ArrayList<>(); JavaArchive ejbJar = ShrinkWrap.create(JavaArchive.class, JAR_SUBDEPLOYMENT_NAME) .addClasses(EJBBusinessInterface.class, SimpleSLSB.class); WebArchive war = ShrinkWrap.create(WebArchive.class, WAR_SUBDEPLOYMENT_NAME) .addClasses(HelloWorldServlet.class, EjbInvokingServlet.class); EnterpriseArchive ear = ShrinkWrap.create(EnterpriseArchive.class, TEST_DEPLOYMENT_NAME) .addAsModule(ejbJar) .addAsModule(war); try (InputStream is = ear.as(ZipExporter.class).exportAsInputStream()) { ModelNode compositeOp = new ModelNode(); ModelNode addOp = new ModelNode(); addOp.get(ModelDescriptionConstants.OP).set(ModelDescriptionConstants.ADD); addOp.get(ModelDescriptionConstants.OP_ADDR).set(ModelDescriptionConstants.DEPLOYMENT, TEST_DEPLOYMENT_NAME); addOp.get(ModelDescriptionConstants.CONTENT).add(ModelDescriptionConstants.INPUT_STREAM_INDEX, 0); ModelNode content = new ModelNode(); content.get(ModelDescriptionConstants.INPUT_STREAM_INDEX).set(0); ModelNode deployOp = new ModelNode(); deployOp.get(ModelDescriptionConstants.OP).set(ModelDescriptionConstants.DEPLOY); deployOp.get(ModelDescriptionConstants.OP_ADDR).set(ModelDescriptionConstants.DEPLOYMENT, TEST_DEPLOYMENT_NAME); compositeOp.get(ModelDescriptionConstants.OP).set(ModelDescriptionConstants.COMPOSITE); compositeOp.get(ModelDescriptionConstants.STEPS).setEmptyList(); compositeOp.get(ModelDescriptionConstants.STEPS).add(addOp); compositeOp.get(ModelDescriptionConstants.STEPS).add(deployOp); attachments.add(is); result = managementClient.getControllerClient().execute(Operation.Factory.create(compositeOp, attachments)); } return result; } private ModelNode deploy(String deployment) throws Exception { ModelNode deployOp = new ModelNode(); deployOp.get(ModelDescriptionConstants.OP).set(ModelDescriptionConstants.DEPLOY); deployOp.get(ModelDescriptionConstants.OP_ADDR).set(ModelDescriptionConstants.DEPLOYMENT, deployment); return managementClient.getControllerClient().execute(deployOp); } private ModelNode explode(String deployment, String path) throws Exception { ModelNode explodeOp = new ModelNode(); explodeOp.get(ModelDescriptionConstants.OP).set(ModelDescriptionConstants.EXPLODE); explodeOp.get(ModelDescriptionConstants.OP_ADDR).set(ModelDescriptionConstants.DEPLOYMENT, deployment); if (!path.isEmpty()) { explodeOp.get(ModelDescriptionConstants.PATH).set(path); } return managementClient.getControllerClient().execute(explodeOp); } private ModelNode undeploy(String deployment) throws Exception { ModelNode undeployOp = new ModelNode(); undeployOp.get(ModelDescriptionConstants.OP).set(ModelDescriptionConstants.UNDEPLOY); undeployOp.get(ModelDescriptionConstants.OP_ADDR).set(ModelDescriptionConstants.DEPLOYMENT, deployment); return managementClient.getControllerClient().execute(undeployOp); } private ModelNode remove(String deployment) throws Exception { ModelNode removeOp = new ModelNode(); removeOp.get(ModelDescriptionConstants.OP).set(ModelDescriptionConstants.REMOVE); removeOp.get(ModelDescriptionConstants.OP_ADDR).set(ModelDescriptionConstants.DEPLOYMENT, deployment); return managementClient.getControllerClient().execute(removeOp); } private void testEjbClassAvailableInServlet() throws Exception { final HttpClient httpClient = HttpClients.createDefault(); final String message = "JBossEAP"; final String requestURL = TestSuiteEnvironment.getHttpUrl().toString() + "/subdeployment-test-web" + HelloWorldServlet.URL_PATTERN + "?" + HelloWorldServlet.PARAMETER_NAME + "=" + message; final HttpGet request = new HttpGet(requestURL); final HttpResponse response = httpClient.execute(request); final HttpEntity entity = response.getEntity(); Assert.assertNotNull("Response message from servlet was null", entity); final String responseMessage = EntityUtils.toString(entity); Assert.assertEquals("Unexpected echo message from servlet at " + requestURL, message, responseMessage); } }