/* * JBoss, Home of Professional Open Source * Copyright 2009, Red Hat Middleware LLC, and individual contributors * as indicated by the @author tags. * See the copyright.txt in the distribution for a * full listing of individual contributors. * This copyrighted material is made available to anyone wishing to use, * modify, copy, or redistribute it subject to the terms and conditions * of the GNU Lesser General Public License, v. 2.1. * This program is distributed in the hope that it will be useful, but WITHOUT A * 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, * v.2.1 along with this distribution; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301, USA. * * (C) 2009, * @author JBoss Inc. */ package org.jboss.jbossts.xts.servicetests.bean; import org.jboss.logging.Logger; import org.jboss.jbossts.xts.servicetests.test.XTSServiceTest; import org.jboss.jbossts.xts.servicetests.service.recovery.TestATRecoveryModule; import org.jboss.jbossts.xts.servicetests.service.recovery.TestBARecoveryModule; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; /** * A service bean used to run XTS service tests at JBoss startup. A specific test is configurerd by setting an * environment variable. It will normally execute in a JVM configured to use the Byteman agent and an appropriately * defined Byteman rule set. */ public class XTSServiceTestRunnerBean implements ServletContextListener // since we ahve toi use a war and web.xml wee // run this as a listener rather than as via jboss-beans.xml { /** * The context has been initialized. * @param servletContextEvent The servlet context event. */ public void contextInitialized(final ServletContextEvent servletContextEvent) { try { start(); } catch (Exception e) { // ignore } } /** * The context is about to be destroyed. * @param servletContextEvent The servlet context event. */ public void contextDestroyed(final ServletContextEvent servletContextEvent) { try { stop(); } catch (Exception e) { // ignore } } public XTSServiceTestRunnerBean() { testName = System.getProperty(TEST_NAME_KEY); testInstance = null; } /** * the service start method which adds a thread to run the current test * @throws Exception */ public void start() throws Exception { log.info("Starting XTSServiceTestRunner"); // ensure that the xts service test AT recovery helper module is registered TestATRecoveryModule.register(); TestBARecoveryModule.register(); if (testName != null) { log.info("Starting XTS Service Test " + testName); Class testClass; ClassLoader cl = XTSServiceTestRunnerBean.class.getClassLoader(); try { testClass = cl.loadClass(testName); } catch (ClassNotFoundException cnfe) { log.warn("XTSServiceTestRunner : cannot find test class " + testName, cnfe); throw new Exception("XTSServiceTestRunner : cannot find test class " + testName, cnfe); } try { testInstance = (XTSServiceTest)testClass.newInstance(); } catch (InstantiationException ie) { log.warn("XTSServiceTestRunner : cannot instantiate test class " + testName, ie); throw new Exception("XTSServiceTestRunner : cannot instantiate test class " + testName, ie); } catch (IllegalAccessException iae) { log.warn("XTSServiceTestRunner : cannot access constructor for test class " + testName, iae); throw new Exception("XTSServiceTestRunner : cannot access constructor for test class " + testName, iae); } // since we are running in the AS startup thread we need a separate thread for the test testThread = new Thread() { private XTSServiceTest test = testInstance; public void run() { testInstance.run(); } }; testThread.start(); } log.info("Started XTSServiceTestRunner"); } /** * teh service stop method which joins the thread running the current test if it exists * @throws Exception */ public void stop() throws Exception { log.info("Stopping XTSServiceTestRunner"); if (testThread != null) { log.info("Joining test thread " + testName); testThread.join(); log.info("Joined test thread " + testName); } // ensure that the xts service test AT recovery helper module is unregistered TestATRecoveryModule.unregister(); TestBARecoveryModule.unregister(); log.info("Stopped XTSServiceTestRunner"); } private final Logger log = org.jboss.logging.Logger.getLogger(XTSServiceTestRunnerBean.class); private final String testName; private XTSServiceTest testInstance; private Thread testThread; private final static String TEST_NAME_KEY = "org.jboss.jbossts.xts.servicetests.XTSServiceTestName"; }