/*
* JBoss, Home of Professional Open Source.
* Copyright 2008, Red Hat Middleware LLC, 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.test.deployment;
import org.jboss.deployment.spi.DeploymentManagerImpl;
import org.jboss.deployment.spi.DeploymentMetaData;
import org.jboss.deployment.spi.JarUtils;
import org.jboss.deployment.spi.TargetModuleIDImpl;
import org.jboss.deployment.spi.factories.DeploymentFactoryImpl;
import org.jboss.test.JBossTestCase;
import org.jboss.util.UnreachableStatementException;
import javax.ejb.CreateException;
import javax.enterprise.deploy.shared.ModuleType;
import javax.enterprise.deploy.shared.StateType;
import javax.enterprise.deploy.shared.factories.DeploymentFactoryManager;
import javax.enterprise.deploy.spi.DeploymentManager;
import javax.enterprise.deploy.spi.Target;
import javax.enterprise.deploy.spi.TargetModuleID;
import javax.enterprise.deploy.spi.factories.DeploymentFactory;
import javax.enterprise.deploy.spi.status.DeploymentStatus;
import javax.enterprise.deploy.spi.status.ProgressObject;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.rmi.PortableRemoteObject;
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URI;
import java.net.URL;
import java.rmi.RemoteException;
import java.util.jar.JarOutputStream;
/**
* Deployment API JSR-88 tests
*
* @author Thomas.Diesler@jboss.org
* @author Fabiano C. de Oliveira (JBAS-1995)
* @author Scott.stark@jboss.org
* @version $Revision: 81036 $
*/
public class BaseDeploymentTestCase extends JBossTestCase
{
private static final String WAR_JBOSS_FILE = "WEB-INF/jboss-web.xml";
private static final String JAR_JBOSS_FILE = "META-INF/jboss.xml";
private static final String EAR_JBOSS_FILE = "META-INF/jboss-app.xml";
private DeploymentFactory factory;
private String targetType;
public BaseDeploymentTestCase(String name, String targetType)
{
super(name);
this.targetType = targetType;
}
protected String getTargetDescription()
{
return "No target specified";
}
/** Get the DeploymentManager
*/
protected void setUp() throws Exception
{
super.setUp();
DeploymentFactoryImpl.register();
DeploymentFactoryManager dfManager = DeploymentFactoryManager.getInstance();
DeploymentFactory[] factories = dfManager.getDeploymentFactories();
assertTrue("No DeploymentFactory available", factories.length > 0);
factory = factories[0];
}
/** Check DeploymentManager
*/
public void testDeploymentManager() throws Exception
{
DeploymentManager manager = getDeploymentManager();
assertNotNull("No deployment manager", manager);
Target target = manager.getTargets()[0];
assertEquals(getTargetDescription(), target.getDescription());
}
/** Distribute a web app
*/
public void testDistributeWebApp() throws Exception
{
ProgressObject progress = jsr88Deployment("deployment-web.war");
try
{
assertServletAccess("custom-context");
}
finally
{
jsr88Undeploy(progress.getResultTargetModuleIDs());
}
try
{
assertServletAccess("custom-context");
fail("Test deployment not undeployed");
}
catch (IOException e)
{
// ignore
}
}
/** Distribute a bad web app
*/
public void testBadWar() throws Exception
{
ProgressObject progress = null;
try
{
progress = jsr88Deployment("baddeployment-web.war");
}
catch (java.lang.Throwable e)
{
return; // Done
}
if (progress != null)
{
DeploymentStatus state = progress.getDeploymentStatus();
jsr88Undeploy(progress.getResultTargetModuleIDs());
if (state.getState() != StateType.FAILED)
fail("Test deployment deployement should have failed");
}
return; // Done
}
/**
* Distribute a EJB app
*/
public void testDistributeEjbApp() throws Exception
{
ProgressObject progress = jsr88Deployment("deployment-ejb.jar");
try
{
assertEjbEchoAccess();
}
finally
{
jsr88Undeploy(progress.getResultTargetModuleIDs());
}
try
{
assertEjbEchoAccess();
fail("Test deployment not undeployed");
}
catch (Exception e)
{
// ignore
}
}
public void testDistributeEARApp() throws Exception
{
ProgressObject progress = jsr88Deployment("deployment-ear.ear");
try
{
assertServletAccess("custom-context");
assertEjbEchoAccess();
}
finally
{
jsr88Undeploy(progress.getResultTargetModuleIDs());
}
try
{
assertServletAccess("custom-context");
fail("Test deployment not undeployed");
}
catch (Exception e)
{
// ignore
}
try
{
assertEjbEchoAccess();
fail("Test deployment not undeployed");
}
catch (Exception e)
{
// ignore
}
}
/**
*
* @throws Exception
*/
public void testListStartStopModules() throws Exception
{
TargetModuleIDImpl child = null;
TargetModuleIDImpl parent = null;
// Get the deployment manager and the distribution targets
DeploymentManager manager = getDeploymentManager();
Target[] targets = manager.getTargets();
assertEquals(1, targets.length);
TargetModuleID[] modules = manager.getRunningModules(ModuleType.EAR, manager.getTargets());
assertNull("no modules Available", modules);
ProgressObject parentProgress = jsr88Deployment("deployment-ear.ear");
assertServletAccess("custom-context");
assertEjbEchoAccess();
modules = manager.getRunningModules(ModuleType.EAR, manager.getTargets());
assertNotNull(modules);
assertEquals("one EAR module in the server", modules.length, 1);
parent = (TargetModuleIDImpl) modules[0];
assertTrue("wrong state", parent.isRunning());
assertEquals("wrong type", parent.getModuleType(), ModuleType.EAR);
assertEquals("EAR module have a jar and a war", parent.getChildTargetModuleID().length, 2);
child = (TargetModuleIDImpl) parent.getChildTargetModuleID()[0];
assertTrue("wrong state", child.isRunning());
assertTrue("wrong type", child.getModuleType().equals(ModuleType.EJB) || child.getModuleType().equals(ModuleType.WAR));
assertEquals("child have no child", child.getChildTargetModuleID().length, 0);
child = (TargetModuleIDImpl) parent.getChildTargetModuleID()[1];
assertTrue("wrong state", child.isRunning());
assertTrue("wrong type " + child.getModuleType(), child.getModuleType().equals(ModuleType.EJB) || child.getModuleType().equals(ModuleType.WAR));
assertEquals("child have no child", child.getChildTargetModuleID().length, 0);
parentProgress = manager.stop(new TargetModuleID[] { parent });
waitForCompletion(parentProgress.getDeploymentStatus());
modules = manager.getNonRunningModules(ModuleType.EAR, manager.getTargets());
assertNotNull(modules);
assertEquals("one EAR module in the server", modules.length, 1);
parent = (TargetModuleIDImpl) modules[0];
assertFalse("wrong state", parent.isRunning());
assertEquals("wrong type", parent.getModuleType(), ModuleType.EAR);
assertEquals("EAR module have a jar and a war", parent.getChildTargetModuleID().length, 2);
parentProgress = manager.start(new TargetModuleID[]{ parent });
waitForCompletion(parentProgress.getDeploymentStatus());
modules = manager.getRunningModules(ModuleType.EAR, manager.getTargets());
assertNotNull(modules);
assertEquals("one EAR module in the server", modules.length, 1);
parent = (TargetModuleIDImpl) modules[0];
assertTrue("wrong state", parent.isRunning());
assertEquals("wrong type", parent.getModuleType(), ModuleType.EAR);
assertEquals("EAR module have a jar and a war", parent.getChildTargetModuleID().length, 2);
parentProgress = manager.undeploy(new TargetModuleID[]{ parent });
waitForCompletion(parentProgress.getDeploymentStatus());
modules = manager.getAvailableModules(ModuleType.EAR, manager.getTargets());
assertNull("EAR must not be available", modules);
try
{
assertServletAccess("custom-context");
fail("Test deployment not undeployed");
}
catch (Exception e)
{
// ignore
}
try
{
assertEjbEchoAccess();
fail("Test deployment not undeployed");
}
catch (Exception e)
{
// ignore
}
}
/**
* Obtain a DeploymentManager using a deployURI of the form
* http://org.jboss.deployment/jsr88?targetType=targetType
* Valid targetType values are:
* jmx - Use the JMXTarget RMIAdaptor based deployment target
* remote - Use the StreamingTarget remoting based deployment target
* @return JSR88 DeploymentManager
* @throws Exception
*/
protected DeploymentManager getDeploymentManager()
throws Exception
{
// Get the deployment manager and the distribution targets
String mgrURI = DeploymentManagerImpl.DEPLOYER_URI+"?targetType="+targetType;
DeploymentManager manager = factory.getDeploymentManager(mgrURI, null, null);
return manager;
}
private void jsr88Undeploy(TargetModuleID[] resultTargetModuleIDs) throws Exception
{
DeploymentManager manager = getDeploymentManager();
Target[] targets = manager.getTargets();
assertEquals(1, targets.length);
ProgressObject progress = manager.stop(resultTargetModuleIDs);
DeploymentStatus status = progress.getDeploymentStatus();
waitForCompletion(status);
// Check the webapp is undeployed
assertEquals(status.getMessage(), StateType.COMPLETED, status.getState());
progress = manager.undeploy(resultTargetModuleIDs);
status = progress.getDeploymentStatus();
waitForCompletion(status);
assertEquals(status.getMessage(), StateType.COMPLETED, status.getState());
}
private ProgressObject jsr88Deployment(String module)
throws Exception
{
// Get the deployment manager and the distribution targets
DeploymentManager manager = getDeploymentManager();
Target[] targets = manager.getTargets();
assertEquals(1, targets.length);
File deploymentPlan = createDeploymentPlan(module);
// Get a pointer to the plain web archive
log.debug("module=" + module);
File moduleArchive = new File(new URI(getDeployURL(module).toString()));
assertTrue(moduleArchive.exists());
// Deploy the test war
ProgressObject progress = manager.distribute(targets, moduleArchive, deploymentPlan);
DeploymentStatus status = progress.getDeploymentStatus();
waitForCompletion(status);
assertEquals(status.getMessage(), StateType.COMPLETED, status.getState());
TargetModuleID[] moduleIDs = progress.getResultTargetModuleIDs();
progress = manager.start(moduleIDs);
status = progress.getDeploymentStatus();
waitForCompletion(status);
return progress;
}
private void assertEjbEchoAccess() throws NamingException, RemoteException, CreateException
{
InitialContext initial = new InitialContext();
Object obj = initial.lookup("deployment/test/Echo");
EchoHome home = (EchoHome) PortableRemoteObject.narrow(obj, EchoHome.class);
Echo echo = home.create();
assertEquals("Wrong EJB return", "Hello!", echo.echo("Hello!"));
}
private void waitForCompletion(DeploymentStatus status) throws InterruptedException
{
// wait for the deployment to finish
while (StateType.RUNNING == status.getState())
Thread.sleep(100);
}
private void assertServletAccess(String context) throws IOException
{
// Check that we can access the servlet
URL servletURL = new URL("http://" + getServerHost() + ":8080/" + context);
BufferedReader br = new BufferedReader(new InputStreamReader(servletURL.openStream()));
String message = br.readLine();
assertEquals("Hello World!", message);
}
private File createDeploymentPlan(String deploymentFile) throws Exception
{
String[] strs = null;
// Create temp file for deployment plan
File deploymentPlan = File.createTempFile("deploymentplan", ".zip");
deploymentPlan.deleteOnExit();
String jbossFile = getJBossFile(deploymentFile);
String resourcedir = getResourceURL("deployment/" + jbossFile);
File jbossDescriptor = new File(new URI(resourcedir));
assertTrue(jbossDescriptor.exists());
JarOutputStream jos = new JarOutputStream(new FileOutputStream(deploymentPlan));
JarUtils.addJarEntry(jos, "!/" + jbossFile, new FileInputStream(jbossDescriptor));
// Setup deployment plan meta data with propriatary descriptor
DeploymentMetaData metaData = new DeploymentMetaData(deploymentFile);
strs = jbossFile.split("/");
metaData.addEntry(deploymentFile, strs[strs.length - 1]);
// Add the meta data to the deployment plan
String metaStr = metaData.toXMLString();
JarUtils.addJarEntry(jos, DeploymentMetaData.ENTRY_NAME, new ByteArrayInputStream(metaStr.getBytes()));
jos.flush();
jos.close();
return deploymentPlan;
}
private String getJBossFile(String deploymentFile)
{
if (deploymentFile.endsWith(".war"))
return WAR_JBOSS_FILE;
else if (deploymentFile.endsWith(".jar"))
return JAR_JBOSS_FILE;
else if (deploymentFile.endsWith(".ear"))
return EAR_JBOSS_FILE;
else
fail("Wrong J2EE Module found...");
throw new UnreachableStatementException();
}
}