package com.arjuna.qa.junit; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStreamReader; import java.net.UnknownHostException; import java.net.Inet6Address; import java.net.InetAddress; import java.util.Arrays; import java.util.Date; import java.util.List; import java.util.logging.Logger; import com.arjuna.qa.extension.JBossAS7ServerKillProcessor; import org.jboss.arquillian.container.test.api.Config; import org.jboss.arquillian.container.test.api.ContainerController; import org.jboss.arquillian.container.test.api.Deployer; import org.jboss.arquillian.container.test.api.Deployment; import org.jboss.arquillian.container.test.api.TargetsContainer; import org.jboss.arquillian.test.api.ArquillianResource; import org.jboss.shrinkwrap.api.Archive; import org.jboss.shrinkwrap.api.ShrinkWrap; import org.jboss.shrinkwrap.api.asset.StringAsset; import org.jboss.shrinkwrap.api.spec.WebArchive; import org.junit.After; import org.junit.Before; import org.junit.Assert; public class BaseCrashTest { private static final Logger logger = Logger.getLogger(BaseCrashTest.class.getName()); protected String XTSServiceTest = " -Dorg.jboss.jbossts.xts.servicetests.XTSServiceTestName=@TestName@"; protected String javaVmArguments; protected String testName; protected String scriptName; private final static String xtstestWar = "../xtstest/target/xtstest.war"; @ArquillianResource private ContainerController controller; @ArquillianResource private Deployer deployer; @Deployment(name = "xtstest", testable = false, managed = false) @TargetsContainer("jboss-as") public static Archive<?> createTestArchive() { WebArchive archive = ShrinkWrap. createFromZipFile(WebArchive.class, new File(xtstestWar)); final String ManifestMF = "Manifest-Version: 1.0\n" + "Dependencies: org.jboss.modules,org.jboss.msc,org.jboss.jts,org.jboss.xts\n"; archive.setManifest(new StringAsset(ManifestMF)); return archive; } @Before public void setUp() { javaVmArguments = System.getProperty("server.jvm.args") .replaceAll("=listen","=script:target/test-classes/scripts/@BMScript@.btm,listen"); javaVmArguments = javaVmArguments.replace("@BMScript@", scriptName); System.out.println("Starting arquillian with java VM args: " + javaVmArguments + " isIPv6: " + isIPv6()); File file = new File("testlog"); if (file.isFile() && file.exists()) { file.delete(); } //Ensure ObjectStore is empty: String jbossHome = System.getenv("JBOSS_HOME"); if (jbossHome == null) { Assert.fail("$JBOSS_HOME not set"); } else { File objectStore = new File(jbossHome + File.separator + "standalone" + File.separator + "data" + File.separator + "tx-object-store"); System.out.println("Deleting: " + objectStore.getPath()); if (objectStore.exists()) { boolean success = deleteDirectory(objectStore); if (!success) { System.err.println("Failed to remove tx-object-store"); Assert.fail("Failed to remove tx-object-store: " + objectStore.getPath()); } else { System.out.println("remove tx-object-store: " + objectStore.getPath()); } } //Remove the xts deployments under the content File contentDir = new File(jbossHome + File.separator + "standalone" + File.separator + "data" + File.separator + "content"); if(contentDir.exists()) { File[] files = contentDir.listFiles(); if(files != null) { int i = 0; for(i=0;i<files.length;i++) { if(files[i].isDirectory()) { deleteDirectory(files[i]); System.out.println("remove " + files[i].getPath()); } } } } File exampleXTSconfig = new File(jbossHome + File.separator + "docs" + File.separator + "examples" + File.separator + "configs" + File.separator + "standalone-xts.xml"); File XTSconfig = new File(jbossHome + File.separator + "standalone" + File.separator + "configuration" + File.separator + "standalone-xts.xml"); if(exampleXTSconfig.exists()) { //copy example config to configuration directory try { FileInputStream in = new FileInputStream(exampleXTSconfig); FileOutputStream out = new FileOutputStream(XTSconfig); byte[] buffer = new byte[1024]; int length; //copy the file content in bytes while ((length = in.read(buffer)) > 0) { out.write(buffer, 0, length); } in.close(); out.close(); System.out.println("copy " + exampleXTSconfig.getPath() + " to " + XTSconfig.getPath()); } catch(IOException e) { Assert.fail("copy " + exampleXTSconfig.getPath() + " fail with " + e); } } else { Assert.fail(exampleXTSconfig.getPath() + " not exists"); } } } @After public void tearDown() { String log = "target/log"; String jbossHome = System.getenv().get("JBOSS_HOME"); if(jbossHome == null) { Assert.fail("$JBOSS_HOME not set"); } String dir = jbossHome + "/standalone/data/tx-object-store/ShadowNoFileLockStore/defaultStore/XTS/"; File objectStore = new File(dir); boolean ischeck = checkTxObjectStore(objectStore); if(!ischeck) { archiveObjectStore(jbossHome, testName); StringBuffer buffer = exploreDirectory(objectStore, 0); System.out.println(buffer); } Assert.assertTrue(ischeck); if (testName != null && scriptName != null) { String logFileName = scriptName + "." + testName; File file = new File("testlog"); File logDir = new File(log); if (!logDir.exists()) { logDir.mkdirs(); } if (file.isFile() && file.exists()) { file.renameTo(new File(log + "/" + logFileName)); } } } protected void runTest(String testClass) throws Exception { logger.info("Test starting, server should be down: " + scriptName + ":" + testName); Config config = new Config(); config.add("javaVmArguments", javaVmArguments + XTSServiceTest.replace("@TestName@", testClass)); controller.start("jboss-as", config.map()); try { deployer.deploy("xtstest"); } catch (java.lang.RuntimeException e) { //JBTM-1236 it could be ignore this exception because the container might be killed already and JVM.kill() has happened. System.out.println("jboss-as has been killed"); } //Waiting for crashing controller.kill("jboss-as"); //Boot jboss-as after crashing config.add("javaVmArguments", javaVmArguments); controller.start("jboss-as", config.map()); //Waiting for recovery happening controller.kill("jboss-as"); logger.info("Test completed, server should be down: " + scriptName + ":" + testName); } private boolean deleteDirectory(File path) { if (path.exists()) { File[] files = path.listFiles(); for (int i = 0; i < files.length; i++) { if (files[i].isDirectory()) { deleteDirectory(files[i]); } else { files[i].delete(); } } } return (path.delete()); } private boolean checkTxObjectStore(File objectStore) { if(objectStore.exists() && objectStore.isDirectory()) { File[] files = objectStore.listFiles(); if(files != null) { int i = 0; for(i=0;i<files.length;i++) { if(files[i].isDirectory()) { if (checkTxObjectStore(files[i]) == false) return false; } else { return false; } } } } return true; } private static boolean isIPv6() { try { if (InetAddress.getLocalHost() instanceof Inet6Address || System.getenv("IPV6_OPTS") != null) return true; } catch (final UnknownHostException uhe) { } return false; } private StringBuffer exploreDirectory(File directory, int level) { List<File> files = Arrays.asList(directory.listFiles()); StringBuffer result = new StringBuffer(); String NEWLINE = "\n"; String FILE_GRAPHIC = "- "; String DIRECTORY_GRAPHIC = "+- "; StringBuffer spaces = new StringBuffer(); for (int i = 0; i < level; i++) { spaces.append(" "); } for (File cur : files) { if (cur.isDirectory()) { result.append(spaces + DIRECTORY_GRAPHIC + "["+ cur.getName() +"]" + NEWLINE); List<File> afiles = Arrays.asList(cur.listFiles()); for (File acur : afiles) { if (acur.isFile()) { result.append(" " + spaces + FILE_GRAPHIC + acur.getName() + NEWLINE); try { FileInputStream fis = new FileInputStream(acur); InputStreamReader bis = new InputStreamReader(fis); BufferedReader dis = new BufferedReader(bis); String s; do { s = dis.readLine(); result.append(" " + spaces + s + NEWLINE); }while(s != null); fis.close(); bis.close(); dis.close(); } catch (IOException e) { //ignore } } } result.append(exploreDirectory(cur, level + 1)); } else if(level == 0) { result.append(spaces + FILE_GRAPHIC + cur.getName() + NEWLINE); } } return result; } private void archiveObjectStore(final String jbossHome, final String testName) { final String source = jbossHome + "/standalone/data/tx-object-store"; String target = "target/"; if (testName != null) { target += testName + "_tx-object-store.zip"; } else { target += new Date().getTime() + "_tx-object-store.zip"; } final ZipArchiver zipArchiver = new ZipArchiver(); try { zipArchiver.createArchive(source, target); } catch (IOException e) { e.printStackTrace(); } } }