/*
* JBoss, Home of Professional Open Source.
* Copyright 2013, 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 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 software 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 software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.jboss.as.test.integration.management.cli;
import org.jboss.as.test.integration.management.base.AbstractCliTestBase;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import java.io.File;
import java.net.URL;
import java.util.concurrent.TimeUnit;
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.test.integration.common.HttpRequest;
import org.jboss.as.test.integration.management.util.SimpleServlet;
import org.jboss.as.test.shared.TestSuiteEnvironment;
import org.jboss.shrinkwrap.api.Archive;
import org.jboss.shrinkwrap.api.GenericArchive;
import org.jboss.shrinkwrap.api.ShrinkWrap;
import org.jboss.shrinkwrap.api.asset.StringAsset;
import org.jboss.shrinkwrap.api.exporter.ZipExporter;
import org.jboss.shrinkwrap.api.spec.JavaArchive;
import org.jboss.shrinkwrap.api.spec.WebArchive;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
import org.junit.runner.RunWith;
/**
* This tests a CLI deployment archive functionality.
* See https://community.jboss.org/wiki/CLIDeploymentArchive
*
* @author Ivo Studensky <istudens@redhat.com>
*/
@RunWith(Arquillian.class)
@RunAsClient
public class DeploymentArchiveTestCase extends AbstractCliTestBase {
private static final String MODULE_NAME = "org.jboss.test.deploymentarchive";
private static final String WEB_ARCHIVE_NAME = "deploymentarchive";
private static final String MODULE_ARCHIVE = "deploymentarchivemodule.jar";
private static final String MODULE_XML_FILE = "module.xml";
private static final String DEPLOY_SCR =
"deploy " + WEB_ARCHIVE_NAME + ".war\n" +
"module add --name=" + MODULE_NAME +
" --resources=" + MODULE_ARCHIVE +
" --module-xml=" + MODULE_XML_FILE;
private static final String UNDEPLOY_SCR =
"undeploy " + WEB_ARCHIVE_NAME + ".war\n" +
"module remove --name=" + MODULE_NAME;
private static final String MODULE_XML =
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +
"<module xmlns=\"urn:jboss:module:1.5\" name=\"" + MODULE_NAME + "\" slot=\"main\">" +
" <resources>" +
" <resource-root path=\"" + MODULE_ARCHIVE + "\"/>" +
" </resources>" +
"</module>";
private static File cliFile;
@ArquillianResource
URL url;
@Deployment
public static Archive<?> getDeployment() {
return ShrinkWrap.create(JavaArchive.class, "dummy.jar")
.addClass(DeploymentArchiveTestCase.class);
}
@BeforeClass
public static void before() throws Exception {
cliFile = createCliArchive();
AbstractCliTestBase.initCLI();
}
@AfterClass
public static void after() throws Exception {
AbstractCliTestBase.closeCLI();
cliFile.delete();
}
@Test
public void testDeployUndeploy() throws Exception {
testDeploy();
testUndeploy();
}
private void testDeploy() throws Exception {
// check whether the module is not deployed
final File testModuleRoot = new File(getModulePath(), MODULE_NAME.replace('.', File.separatorChar));
assertFalse("Module is already deployed at " + testModuleRoot, testModuleRoot.exists());
// deploy to server
cli.sendLine("deploy " + cliFile.getAbsolutePath());
// check war deployment
String response = HttpRequest.get(getBaseURL(url) + WEB_ARCHIVE_NAME + "/SimpleServlet", 1000, 10, TimeUnit.SECONDS);
assertTrue("Invalid response: " + response, response.indexOf("SimpleServlet") >=0);
// check module deployment
assertTrue("Module deployment failed! Module dir does not exist: " + testModuleRoot, testModuleRoot.exists());
}
private void testUndeploy() throws Exception {
//undeploy
cli.sendLine("undeploy --path=" + cliFile.getAbsolutePath());
// check undeployment
assertTrue(checkUndeployed(getBaseURL(url) + WEB_ARCHIVE_NAME + "/SimpleServlet"));
// check module undeployment
final File testModuleRoot = new File(getModulePath(), MODULE_NAME.replace('.', File.separatorChar));
assertFalse("Module undeployment failed.", testModuleRoot.exists());
}
private static File createCliArchive() {
final WebArchive webArchive = ShrinkWrap.create(WebArchive.class, WEB_ARCHIVE_NAME + ".war");
webArchive.addClass(SimpleServlet.class);
final JavaArchive moduleArchive = ShrinkWrap.create(JavaArchive.class, MODULE_ARCHIVE);
moduleArchive.addClass(DeploymentArchiveTestCase.class);
final GenericArchive cliArchive = ShrinkWrap.create(GenericArchive.class, "deploymentarchive.cli");
cliArchive.add(new StringAsset(DEPLOY_SCR), "deploy.scr");
cliArchive.add(new StringAsset(UNDEPLOY_SCR), "undeploy.scr");
cliArchive.add(webArchive, "/", ZipExporter.class);
cliArchive.add(moduleArchive, "/", ZipExporter.class);
cliArchive.add(new StringAsset(MODULE_XML), "/", "module.xml");
final String tempDir = TestSuiteEnvironment.getTmpDir();
final File file = new File(tempDir, "deploymentarchive.cli");
cliArchive.as(ZipExporter.class).exportTo(file, true);
return file;
}
private File getModulePath() {
String modulePath = TestSuiteEnvironment.getSystemProperty("module.path", null);
if (modulePath == null) {
String jbossHome = TestSuiteEnvironment.getSystemProperty("jboss.home", null);
if (jbossHome == null) {
throw new IllegalStateException(
"Neither -Dmodule.path nor -Djboss.home were set");
}
modulePath = jbossHome + File.separatorChar + "modules";
} else {
modulePath = modulePath.split(File.pathSeparator)[0];
}
File moduleDir = new File(modulePath);
if (!moduleDir.exists()) {
throw new IllegalStateException(
"Determined module path does not exist");
}
if (!moduleDir.isDirectory()) {
throw new IllegalStateException(
"Determined module path is not a dir");
}
return moduleDir;
}
}