package org.jboss.as.test.manualmode.jca.connectionlistener;
import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.ADD;
import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.OP;
import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.OP_ADDR;
import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.SUBSYSTEM;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import javax.naming.Context;
import javax.naming.NamingException;
import org.jboss.arquillian.container.test.api.Deployment;
import org.jboss.as.arquillian.api.ServerSetupTask;
import org.jboss.as.arquillian.container.ManagementClient;
import org.jboss.as.controller.descriptions.ModelDescriptionConstants;
import org.jboss.as.test.integration.management.base.ContainerResourceMgmtTestBase;
import org.jboss.as.test.integration.management.util.CLIWrapper;
import org.jboss.as.test.integration.management.util.MgmtOperationException;
import org.jboss.as.test.manualmode.ejb.Util;
import org.jboss.as.test.shared.ServerReload;
import org.jboss.dmr.ModelNode;
import org.jboss.logging.Logger;
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.xnio.IoUtils;
/**
* @author <a href="mailto:hsvabek@redhat.com">Hynek Svabek</a>
*/
public abstract class AbstractTestsuite {
private static final Logger log = Logger.getLogger(AbstractTestsuite.class);
protected static final String MODULE_NAME = "connlistener";
protected static final String CONTAINER = "default-jbossas";
protected static final String DEP_1 = "connlist_1";
protected static final String DEP_1_XA = "connlist_1_xa";
protected static final String DEP_2 = "connlist_2";
protected static final String DEP_2_XA = "connlist_2_xa";
protected static final String DEP_3 = "connlist_3";
protected static final String DEP_3_XA = "connlist_3_xa";
private static final String CONNECTION_LISTENER_CLASS_IMPL = TestConnectionListener.class.getName();
static final String jndiDs = "java:jboss/datasources/StatDS";
static final String jndiXaDs = "java:jboss/datasources/StatXaDS";
protected Context context;
@Deployment(name = DEP_1, managed = false)
public static JavaArchive createDeployment1() throws Exception {
return createDeployment(DEP_1);
}
@Deployment(name = DEP_1_XA, managed = false)
public static JavaArchive createDeployment1Xa() throws Exception {
return createDeployment(DEP_1_XA);
}
@Deployment(name = DEP_2, managed = false)
public static JavaArchive createDeployment2() throws Exception {
return createDeployment(DEP_2);
}
@Deployment(name = DEP_2_XA, managed = false)
public static JavaArchive createDeployment2Xa() throws Exception {
return createDeployment(DEP_2_XA);
}
@Deployment(name = DEP_3, managed = false)
public static JavaArchive createDeployment3() throws Exception {
return createDeployment(DEP_3);
}
@Deployment(name = DEP_3_XA, managed = false)
public static JavaArchive createDeployment3Xa() throws Exception {
return createDeployment(DEP_3_XA);
}
public static JavaArchive createDeployment(String name) throws Exception {
JavaArchive ja = ShrinkWrap.create(JavaArchive.class, name + ".jar");
ja.addClasses(ConnectionListenerTestCase.class, AbstractTestsuite.class, JpaTestSlsb.class, JpaTestSlsbRemote.class, MgmtOperationException.class, ContainerResourceMgmtTestBase.class)
.addAsManifestResource(
new StringAsset("Dependencies: org.jboss.dmr \n"), "MANIFEST.MF");
return ja;
}
protected static class TestCaseSetup extends ContainerResourceMgmtTestBase implements ServerSetupTask {
public static final TestCaseSetup INSTANCE = new TestCaseSetup();
ModelNode dsAddress;
ModelNode dsXaAddress;
@Override
public void setup(final ManagementClient managementClient, String containerId) throws Exception {
setManagementClient(managementClient);
try {
tryRemoveConnListenerModule();//before test, in tearDown we cannot connect to CLI....
addConnListenerModule();
dsAddress = createDataSource(false, jndiDs);
dsXaAddress = createDataSource(true, jndiXaDs);
} catch (Throwable e) {
removeDss();
throw new Exception(e);
}
}
@Override
public void tearDown(final ManagementClient managementClient, final String containerId) throws Exception {
removeDss();
}
public void removeDss() {
try {
remove(dsAddress);
} catch (Throwable e) {
log.warn(e.getMessage());
}
try {
remove(dsXaAddress);
} catch (Throwable e) {
log.warn(e.getMessage());
}
}
/**
* Creates data source and return its node address
*
* @param xa - should be data source XA?
* @param jndiName of data source
* @return ModelNode - address of data source node
* @throws Exception
*/
private ModelNode createDataSource(boolean xa, String jndiName) throws Exception {
ModelNode address = new ModelNode();
address.add(SUBSYSTEM, "datasources");
address.add((xa ? "xa-" : "") + "data-source", jndiName);
address.protect();
ModelNode operation = new ModelNode();
operation.get(OP).set(ADD);
operation.get(OP_ADDR).set(address);
operation.get("jndi-name").set(jndiName);
operation.get("driver-name").set("h2");
operation.get("prepared-statements-cache-size").set(3);
operation.get("user-name").set("sa");
operation.get("password").set("sa");
if (!xa) {
operation.get("connection-url").set("jdbc:h2:mem:test;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE");
}
operation.get("connection-listener-class").set(CONNECTION_LISTENER_CLASS_IMPL);
operation.get("connection-listener-property").set("testString", "MyTest");
/**
* Uncomment after finishing task https://issues.jboss.org/browse/WFLY-2492
*/
// operation.get("connection-listener-module-name").set(MODULE_NAME);
// operation.get("connection-listener-slot").set("main");
operation.get("enabled").set("false");
executeOperation(operation);
if (xa) {
final ModelNode xaDatasourcePropertiesAddress = address.clone();
xaDatasourcePropertiesAddress.add("xa-datasource-properties", "URL");
xaDatasourcePropertiesAddress.protect();
final ModelNode xaDatasourcePropertyOperation = new ModelNode();
xaDatasourcePropertyOperation.get(OP).set("add");
xaDatasourcePropertyOperation.get(OP_ADDR).set(xaDatasourcePropertiesAddress);
xaDatasourcePropertyOperation.get("value").set("jdbc:h2:mem:test;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE");
executeOperation(xaDatasourcePropertyOperation);
}
operation = new ModelNode();
operation.get(OP).set(ModelDescriptionConstants.WRITE_ATTRIBUTE_OPERATION);
operation.get(OP_ADDR).set(address);
operation.get("name").set("enabled");
operation.get("value").set("true");
executeOperation(operation);
ServerReload.executeReloadAndWaitForCompletion(getModelControllerClient(), 50000);
return address;
}
protected void addConnListenerModule() throws Exception {
JavaArchive jar = ShrinkWrap.create(JavaArchive.class);
jar.addClasses(TestConnectionListener.class)
.addPackage(Logger.class.getPackage());
File moduleJar = File.createTempFile(MODULE_NAME, ".jar");
copyModuleFile(moduleJar, jar.as(ZipExporter.class).exportAsInputStream());
CLIWrapper cli = new CLIWrapper(true);
cli.sendLine("module add --name=" + MODULE_NAME + " --slot=main --dependencies=org.jboss.ironjacamar.jdbcadapters --resources=" + moduleJar.getAbsolutePath());
/*
* Delete global module after finishing this task
* https://issues.jboss.org/browse/WFLY-2492
*/
cli.sendLine("/subsystem=ee:write-attribute(name=global-modules,value=[{name => " + MODULE_NAME + ",slot => main}]");
cli.quit();
}
protected void tryRemoveConnListenerModule() throws Exception {
try {
CLIWrapper cli = new CLIWrapper(true);
cli.sendLine("module remove --name=" + MODULE_NAME + " --slot=main");
cli.quit();
} catch (Throwable e) {
log.warn(e.getMessage());
}
}
}
protected static void copyModuleFile(File target, InputStream src) throws IOException {
final BufferedOutputStream out = new BufferedOutputStream(
new FileOutputStream(target));
try {
int i = src.read();
while (i != -1) {
out.write(i);
i = src.read();
}
} finally {
IoUtils.safeClose(out);
}
}
protected <T> T lookup(final Class<T> remoteClass, final Class<?> beanClass, final String archiveName) throws NamingException {
String myContext = Util.createRemoteEjbJndiContext(
"",
archiveName,
"",
beanClass.getSimpleName(),
remoteClass.getName(),
false);
return remoteClass.cast(context.lookup(myContext));
}
}