package org.jboss.as.test.manualmode.weld.extension;
import org.jboss.arquillian.container.test.api.ContainerController;
import org.jboss.arquillian.container.test.api.Deployment;
import org.jboss.arquillian.container.test.api.RunAsClient;
import org.jboss.arquillian.container.test.api.TargetsContainer;
import org.jboss.arquillian.junit.Arquillian;
import org.jboss.arquillian.test.api.ArquillianResource;
import org.jboss.as.test.shared.integration.ejb.security.PermissionUtils;
import org.jboss.shrinkwrap.api.Archive;
import org.jboss.shrinkwrap.api.ArchivePaths;
import org.jboss.shrinkwrap.api.ShrinkWrap;
import org.jboss.shrinkwrap.api.asset.EmptyAsset;
import org.jboss.shrinkwrap.api.asset.StringAsset;
import org.jboss.shrinkwrap.api.spec.WebArchive;
import org.junit.AfterClass;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import javax.enterprise.inject.spi.Extension;
import java.io.File;
import java.io.FilePermission;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.List;
import static org.junit.Assert.assertEquals;
/**
* A test to ensure that the UserTransaction and TransactionSynchronizationRegistry can be retrieved via JNDI when
* an extensions BeforeShutdown method is invoked.
* <p/>
* See WFLY-5232
*
* @author Ryan Emerson
*/
@RunWith(Arquillian.class)
@RunAsClient
public class BeforeShutdownJNDILookupTestCase {
public static final String TEST_URL = "target" + File.separator + "results.txt";
private static final String CONTAINER = "default-jbossas";
private static final String DEPLOYMENT = "test.war";
private static final Path TEST_PATH = Paths.get("", TEST_URL);
@Deployment(name = DEPLOYMENT, managed = true)
@TargetsContainer(CONTAINER)
public static Archive<?> deploy() throws Exception {
return ShrinkWrap
.create(WebArchive.class, DEPLOYMENT)
.addClasses(BeforeShutdownJNDILookupTestCase.class, BeforeShutdownExtension.class)
.add(EmptyAsset.INSTANCE, ArchivePaths.create("WEB-INF/beans.xml"))
.add(new StringAsset(BeforeShutdownExtension.class.getName()), "META-INF/services/" + Extension.class.getName())
.addAsManifestResource(PermissionUtils.createPermissionsXmlAsset(
new FilePermission(TEST_PATH.getParent().toString(), "read, write"),
new FilePermission(TEST_PATH.toString(), "read, write, delete")
), "permissions.xml");
}
@ArquillianResource
ContainerController controller;
@Test
public void testTransactionJNDILookupDuringShutdownEvent() throws Exception {
controller.start(CONTAINER);
controller.kill(CONTAINER);
List<String> output = Files.readAllLines(TEST_PATH);
if (output.get(0).equals("Exception")) {
String stacktrace = output.get(1).replaceAll(",", System.getProperty("line.separator"));
String msg = "An exception was thrown by the deployment %s during shutdown. The server stacktrace is shown below: %n%s";
Assert.fail(String.format(msg, DEPLOYMENT, stacktrace));
}
assertEquals("Contents of result.txt is not valid!", "UserTransaction", output.get(0));
}
@AfterClass
public static void cleanup() throws Exception {
Files.delete(TEST_PATH);
}
}