[jboss-svn-commits] JBL Code SVN: r25132 - in labs/jbosstm/trunk/XTS: WS-C and 21 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Fri Feb 6 05:57:07 EST 2009


Author: istudens at redhat.com
Date: 2009-02-06 05:57:07 -0500 (Fri, 06 Feb 2009)
New Revision: 25132

Added:
   labs/jbosstm/trunk/XTS/WS-C/tests/src/com/arjuna/qa/junit/TestRunnerXMLServlet.java
   labs/jbosstm/trunk/XTS/WS-T/tests/src/com/arjuna/qa/junit/TestRunnerXMLServlet.java
   labs/jbosstm/trunk/XTS/WSAS/tests/classes/com/arjuna/qa/junit/WSASTestRunnerXMLServlet.java
   labs/jbosstm/trunk/XTS/WSCF/tests/classes/com/arjuna/qa/junit/WSCFTestRunnerXMLServlet.java
   labs/jbosstm/trunk/XTS/WSTX/tests/classes/com/arjuna/qa/junit/WSTXTestRunnerXMLServlet.java
   labs/jbosstm/trunk/XTS/localjunit/
   labs/jbosstm/trunk/XTS/localjunit/build.xml
   labs/jbosstm/trunk/XTS/localjunit/ext/
   labs/jbosstm/trunk/XTS/localjunit/ext/commons-codec.jar
   labs/jbosstm/trunk/XTS/localjunit/ext/commons-httpclient.jar
   labs/jbosstm/trunk/XTS/localjunit/ext/commons-logging.jar
   labs/jbosstm/trunk/XTS/localjunit/run-tests.xml
   labs/jbosstm/trunk/XTS/localjunit/src/
   labs/jbosstm/trunk/XTS/localjunit/src/com/
   labs/jbosstm/trunk/XTS/localjunit/src/com/arjuna/
   labs/jbosstm/trunk/XTS/localjunit/src/com/arjuna/qa/
   labs/jbosstm/trunk/XTS/localjunit/src/com/arjuna/qa/junit/
   labs/jbosstm/trunk/XTS/localjunit/src/com/arjuna/qa/junit/HttpUtils.java
   labs/jbosstm/trunk/XTS/localjunit/src/com/arjuna/qa/junit/LocalJUnitRunner.java
Modified:
   labs/jbosstm/trunk/XTS/WS-C/build.xml
   labs/jbosstm/trunk/XTS/WS-C/tests/dd/ws-c-tests_web-app.xml
   labs/jbosstm/trunk/XTS/WS-C/tests/dd/ws-c11-tests_web-app.xml
   labs/jbosstm/trunk/XTS/WS-C/tests/src/com/arjuna/qa/junit/TestRunnerServlet.java
   labs/jbosstm/trunk/XTS/WS-T/build.xml
   labs/jbosstm/trunk/XTS/WS-T/tests/dd/ws-t-tests_web-app.xml
   labs/jbosstm/trunk/XTS/WS-T/tests/dd/ws-t11-tests_web-app.xml
   labs/jbosstm/trunk/XTS/WS-T/tests/src/com/arjuna/qa/junit/TestRunnerServlet.java
   labs/jbosstm/trunk/XTS/WSAS/build.xml
   labs/jbosstm/trunk/XTS/WSAS/tests/classes/com/arjuna/qa/junit/WSASTestRunnerServlet.java
   labs/jbosstm/trunk/XTS/WSAS/tests/dd/wsas-tests_web-app.xml
   labs/jbosstm/trunk/XTS/WSCF/build.xml
   labs/jbosstm/trunk/XTS/WSCF/tests/classes/com/arjuna/qa/junit/WSCFTestRunnerServlet.java
   labs/jbosstm/trunk/XTS/WSCF/tests/dd/wscf-tests_web-app.xml
   labs/jbosstm/trunk/XTS/WSCF/tests/dd/wscf11-tests_web-app.xml
   labs/jbosstm/trunk/XTS/WSTX/build.xml
   labs/jbosstm/trunk/XTS/WSTX/tests/classes/com/arjuna/qa/junit/WSTXTestRunnerServlet.java
   labs/jbosstm/trunk/XTS/WSTX/tests/dd/wstx-tests_web-app.xml
   labs/jbosstm/trunk/XTS/WSTX/tests/dd/wstx11-tests_web-app.xml
Log:
JBQA-2039, automation of basic XTS testsuites for Hudson

Modified: labs/jbosstm/trunk/XTS/WS-C/build.xml
===================================================================
--- labs/jbosstm/trunk/XTS/WS-C/build.xml	2009-02-06 06:45:54 UTC (rev 25131)
+++ labs/jbosstm/trunk/XTS/WS-C/build.xml	2009-02-06 10:57:07 UTC (rev 25132)
@@ -84,6 +84,7 @@
             jbossws-native-jaxws.jar jbossws-client.jar stax-api.jar jbossws-native-saaj.jar
             jbossws-native-jaxws-ext.jar jbossws-native-core.jar jbossws-common.jar jboss-logging-spi.jar"/>
     <property name="jboss.common.lib.jars" value="servlet-api.jar"/>
+    <property name="jboss.lib.jars" value="dom4j.jar"/>
 
     <property name="tests.libs" value="junit.jar"/>
 
@@ -95,6 +96,7 @@
         <fileset dir="${com.arjuna.jta.install.lib}" includes="${jta.lib.jars}"/>
         <fileset dir="${jboss.client.lib.dir}" includes="${jboss.client.lib.jars}"/>
         <fileset dir="${jboss.common.lib.dir}" includes="${jboss.common.lib.jars}"/>
+        <fileset dir="${jboss.lib.dir}" includes="${jboss.lib.jars}"/>
     </path>
 
     <path id="tests.lib.path">

Modified: labs/jbosstm/trunk/XTS/WS-C/tests/dd/ws-c-tests_web-app.xml
===================================================================
--- labs/jbosstm/trunk/XTS/WS-C/tests/dd/ws-c-tests_web-app.xml	2009-02-06 06:45:54 UTC (rev 25131)
+++ labs/jbosstm/trunk/XTS/WS-C/tests/dd/ws-c-tests_web-app.xml	2009-02-06 10:57:07 UTC (rev 25132)
@@ -42,12 +42,27 @@
         <load-on-startup>4</load-on-startup>
     </servlet>
 
+    <servlet>
+        <servlet-name>JUnit Tests XML Servlet</servlet-name>
+        <servlet-class>com.arjuna.qa.junit.TestRunnerXMLServlet</servlet-class>
+        <init-param>
+            <param-name>TestSuiteClassName</param-name>
+            <param-value>com.arjuna.wsc.tests.junit.TestSuite</param-value>
+        </init-param>
+        <load-on-startup>4</load-on-startup>
+    </servlet>
+
 	<!-- servlet mappings -->
     <servlet-mapping>
         <servlet-name>JUnit Tests Servlet</servlet-name>
         <url-pattern>/index.html</url-pattern>
     </servlet-mapping>
 
+    <servlet-mapping>
+        <servlet-name>JUnit Tests XML Servlet</servlet-name>
+        <url-pattern>/index.xml</url-pattern>
+    </servlet-mapping>
+
     <welcome-file-list>
         <welcome-file>index.html</welcome-file>
     </welcome-file-list>

Modified: labs/jbosstm/trunk/XTS/WS-C/tests/dd/ws-c11-tests_web-app.xml
===================================================================
--- labs/jbosstm/trunk/XTS/WS-C/tests/dd/ws-c11-tests_web-app.xml	2009-02-06 06:45:54 UTC (rev 25131)
+++ labs/jbosstm/trunk/XTS/WS-C/tests/dd/ws-c11-tests_web-app.xml	2009-02-06 10:57:07 UTC (rev 25132)
@@ -42,12 +42,27 @@
         <load-on-startup>4</load-on-startup>
     </servlet>
 
+    <servlet>
+        <servlet-name>JUnit Tests XML Servlet</servlet-name>
+        <servlet-class>com.arjuna.qa.junit.TestRunnerXMLServlet</servlet-class>
+        <init-param>
+            <param-name>TestSuiteClassName</param-name>
+            <param-value>com.arjuna.wsc11.tests.junit.TestSuite</param-value>
+        </init-param>
+        <load-on-startup>4</load-on-startup>
+    </servlet>
+
 	<!-- servlet mappings -->
     <servlet-mapping>
         <servlet-name>JUnit Tests Servlet</servlet-name>
         <url-pattern>/index.html</url-pattern>
     </servlet-mapping>
 
+    <servlet-mapping>
+        <servlet-name>JUnit Tests XML Servlet</servlet-name>
+        <url-pattern>/index.xml</url-pattern>
+    </servlet-mapping>
+
     <welcome-file-list>
         <welcome-file>index.html</welcome-file>
     </welcome-file-list>

Modified: labs/jbosstm/trunk/XTS/WS-C/tests/src/com/arjuna/qa/junit/TestRunnerServlet.java
===================================================================
--- labs/jbosstm/trunk/XTS/WS-C/tests/src/com/arjuna/qa/junit/TestRunnerServlet.java	2009-02-06 06:45:54 UTC (rev 25131)
+++ labs/jbosstm/trunk/XTS/WS-C/tests/src/com/arjuna/qa/junit/TestRunnerServlet.java	2009-02-06 10:57:07 UTC (rev 25132)
@@ -26,13 +26,24 @@
 
 package com.arjuna.qa.junit;
 
-import java.io.*;
-import java.util.*;
-import java.net.*;
-import javax.servlet.*;
-import javax.servlet.http.*;
-import junit.framework.*;
+import junit.framework.AssertionFailedError;
+import junit.framework.Test;
+import junit.framework.TestListener;
+import junit.framework.TestResult;
+import junit.framework.TestSuite;
 
+import javax.servlet.ServletConfig;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.CharArrayWriter;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
+
 public class TestRunnerServlet extends HttpServlet
 {
     public void init(ServletConfig config) throws ServletException
@@ -42,6 +53,11 @@
         _testSuiteClassName = config.getInitParameter("TestSuiteClassName");
     }
 
+    protected String getContentType()
+    {
+        return "text/html";
+    }
+
     public void doGet(HttpServletRequest request, HttpServletResponse response)
         throws ServletException, IOException
     {
@@ -49,7 +65,7 @@
         {
             PrintWriter writer = response.getWriter();
 
-            response.setContentType("text/html");
+            response.setContentType(getContentType());
             response.setHeader("Cache-Control", "no-cache");
 
             if (request.getParameter("failednumber") != null)
@@ -80,7 +96,7 @@
         {
             PrintWriter writer = response.getWriter();
 
-            response.setContentType("text/html");
+            response.setContentType(getContentType());
             response.setHeader("Cache-Control", "no-cache");
 
 	    if ((_runnerThread == null) || (! _runnerThread.isAlive()))
@@ -111,8 +127,7 @@
     }
 
     public void doStatus(PrintWriter writer, HttpServletRequest request, HttpServletResponse response)
-        throws ServletException
-    {
+            throws ServletException {
         writer.println("<HTML>");
         writer.println("<HEAD>");
         writer.println("<TITLE>Test Runner</TITLE>");
@@ -463,27 +478,27 @@
             doStatus(writer, request, response);
     }
 
-    private class PassedTest
+    protected class PassedTest
     {
         public Test test;
         public long duration;
     }
 
-    private class FailedTest
+    protected class FailedTest
     {
         public Test                 test;
         public long                 duration;
         public AssertionFailedError assertionFailedError;
     }
 
-    private class ErrorTest
+    protected class ErrorTest
     {
         public Test      test;
         public long      duration;
 	public Throwable throwable;
     }
 
-    private class RunnerThread extends Thread
+    protected class RunnerThread extends Thread
     {
         RunnerThread()
         {
@@ -581,7 +596,7 @@
         private Throwable            _throwable            = null;
     }
 
-    private static void encode(PrintWriter writer, String string)
+    protected static void encode(PrintWriter writer, String string)
     {
         if (string != null)
         {
@@ -601,13 +616,13 @@
             writer.print("null");
     }
 
-    private List         _passedTests        = new LinkedList();
-    private List         _failedTests        = new LinkedList();
-    private List         _errorTests         = new LinkedList();
-    private Test         _currentTest        = null;
-    private String       _testSuiteClassName = null;
-    private RunnerThread _runnerThread       = null;
-    private TestResult   _testResult         = null;
-    private TestSuite    _testSuite          = null;
+    protected List         _passedTests        = new LinkedList();
+    protected List         _failedTests        = new LinkedList();
+    protected List         _errorTests         = new LinkedList();
+    protected Test         _currentTest        = null;
+    protected String       _testSuiteClassName = null;
+    protected RunnerThread _runnerThread       = null;
+    protected TestResult   _testResult         = null;
+    protected TestSuite    _testSuite          = null;
 
 }

Added: labs/jbosstm/trunk/XTS/WS-C/tests/src/com/arjuna/qa/junit/TestRunnerXMLServlet.java
===================================================================
--- labs/jbosstm/trunk/XTS/WS-C/tests/src/com/arjuna/qa/junit/TestRunnerXMLServlet.java	                        (rev 0)
+++ labs/jbosstm/trunk/XTS/WS-C/tests/src/com/arjuna/qa/junit/TestRunnerXMLServlet.java	2009-02-06 10:57:07 UTC (rev 25132)
@@ -0,0 +1,209 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2006, 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) 2005-2006,
+ * @author JBoss Inc.
+ */
+package com.arjuna.qa.junit;
+
+import org.dom4j.dom.DOMDocument;
+import org.dom4j.dom.DOMElement;
+import org.dom4j.io.OutputFormat;
+import org.dom4j.io.XMLWriter;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.CharArrayWriter;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.util.Date;
+import java.util.Iterator;
+
+/**
+ * @author <a href="mailto:istudens at redhat.com">Ivo Studensky</a>
+ * @version $Revision$
+ */
+public class TestRunnerXMLServlet extends TestRunnerServlet
+{
+
+    @Override
+    protected String getContentType()
+    {
+        return "text/xml";
+    }
+
+    @Override
+    public void doStatus(PrintWriter writer, HttpServletRequest request, HttpServletResponse response)
+            throws ServletException
+    {
+
+        DOMDocument report = new DOMDocument();
+        DOMElement testsuite = new DOMElement("testsuite");
+        report.setRootElement(testsuite);
+        testsuite.addAttribute("name", _testSuiteClassName);
+        testsuite.addAttribute("errors", Integer.toString(_errorTests.size()));
+        testsuite.addAttribute("failures", Integer.toString(_failedTests.size()));
+        testsuite.addAttribute("hostname", request.getServerName());
+        testsuite.addAttribute("tests", Integer.toString((_testResult != null) ? _testResult.runCount() : 0));
+        testsuite.addAttribute("timestamp", new Date().toString());
+
+        DOMElement properties = new DOMElement("properties");
+        testsuite.add(properties);
+        DOMElement status = newPropertyDOMElement("status");
+        properties.add(status);
+        if ((_runnerThread == null) || (! _runnerThread.isAlive()))
+        {
+            if (_passedTests.isEmpty() && _failedTests.isEmpty() && _errorTests.isEmpty())
+            {
+                status.addAttribute("value", "stopped");
+            }
+            else
+            {
+                status.addAttribute("value", "finished");
+            }
+        }
+        else if (_currentTest != null)
+        {
+            status.addAttribute("value", "running");
+            properties.add(newPropertyDOMElement("current-test", _currentTest.toString()));
+        }
+
+        long totalDuration = 0;
+
+        if (! _passedTests.isEmpty())
+        {
+            Iterator passedTestsIterator = _passedTests.iterator();
+            while (passedTestsIterator.hasNext())
+            {
+                PassedTest passedTest = (PassedTest) passedTestsIterator.next();
+                totalDuration += passedTest.duration;
+
+                testsuite.add(newTestcase(
+                        passedTest.test.getClass().getName(), passedTest.test.toString(), passedTest.duration));
+            }
+        }
+
+        if (! _failedTests.isEmpty())
+        {
+            Iterator failedTestsIterator = _failedTests.iterator();
+            while (failedTestsIterator.hasNext())
+            {
+                FailedTest failedTest = (FailedTest) failedTestsIterator.next();
+                totalDuration += failedTest.duration;
+
+                CharArrayWriter charArrayWriter = new CharArrayWriter();
+                PrintWriter     printWriter     = new PrintWriter(charArrayWriter, true);
+                failedTest.assertionFailedError.printStackTrace(printWriter);
+                printWriter.close();
+                charArrayWriter.close();
+
+                testsuite.add(newFailedTestcase(
+                        failedTest.test.getClass().getName(), failedTest.test.toString(), failedTest.duration,
+                        failedTest.assertionFailedError.getMessage(), charArrayWriter.toString()));
+            }
+        }
+
+        if (! _errorTests.isEmpty())
+        {
+            Iterator errorTestsIterator = _errorTests.iterator();
+            while (errorTestsIterator.hasNext())
+            {
+                ErrorTest errorTest = (ErrorTest) errorTestsIterator.next();
+                totalDuration += errorTest.duration;
+
+                CharArrayWriter charArrayWriter = new CharArrayWriter();
+                PrintWriter     printWriter     = new PrintWriter(charArrayWriter, true);
+                errorTest.throwable.printStackTrace(printWriter);
+                printWriter.close();
+                charArrayWriter.close();
+
+                System.out.println("charArrayWriter.toString()=" + charArrayWriter.toString());
+                testsuite.add(newErrorTestcase(
+                        errorTest.test.getClass().getName(), errorTest.test.toString(), errorTest.duration,
+                        errorTest.throwable.getMessage(), charArrayWriter.toString()));
+            }
+        }
+        testsuite.add(new DOMElement("system-out").addCDATA(""));
+        testsuite.add(new DOMElement("system-err").addCDATA(""));
+        // total time of all tests
+        testsuite.addAttribute("time", Float.toString(totalDuration / 1000f));
+
+        XMLWriter outputter = new XMLWriter(writer, OutputFormat.createPrettyPrint());
+        try {
+            outputter.write(testsuite);
+            outputter.close();
+        } catch (IOException e) {
+            throw new ServletException(e);
+        }
+    }
+
+    private DOMElement newPropertyDOMElement(String name)
+    {
+        return newPropertyDOMElement(name, null);
+    }
+
+    private DOMElement newPropertyDOMElement(String name, String value)
+    {
+        DOMElement property = new DOMElement("property");
+        property.addAttribute("name", name);
+        if (value != null)
+        {
+            property.addAttribute("value", value);
+        }
+        return property;
+    }
+
+    private DOMElement newTestcase(String classname, String name, long duration)
+    {
+        return newTestcase(classname, name, duration, null, null, null);
+    }
+
+    private DOMElement newFailedTestcase(String classname, String name, long duration, String failureMessage, String failureDetail)
+    {
+        return newTestcase(classname, name, duration, "junit.framework.AssertionFailedError", failureMessage, failureDetail);
+    }
+
+    private DOMElement newErrorTestcase(String classname, String name, long duration, String failureMessage, String failureDetail)
+    {
+        return newTestcase(classname, name, duration, "junit.framework.throwable", failureMessage, failureDetail);
+    }
+
+    private DOMElement newTestcase(String classname, String name, long duration, String failureMessage, String failureType, String failureDetail)
+    {
+        DOMElement testcase = new DOMElement("testcase");
+        testcase.addAttribute("classname", classname);
+        testcase.addAttribute("name", name);
+        testcase.addAttribute("time", Float.toString(duration / 1000f));    // converts from miliseconds to seconds
+        if (failureMessage != null)
+        {
+            DOMElement failure = new DOMElement("failure");
+            testcase.add(failure);
+            failure.addAttribute("message", failureMessage);
+            if (failureType != null)
+            {
+                failure.addAttribute("type", failureType);
+            }
+            if (failureDetail != null)
+            {
+                failure.addCDATA(failureDetail);
+            }
+        }
+        return testcase;
+    }
+
+}

Modified: labs/jbosstm/trunk/XTS/WS-T/build.xml
===================================================================
--- labs/jbosstm/trunk/XTS/WS-T/build.xml	2009-02-06 06:45:54 UTC (rev 25131)
+++ labs/jbosstm/trunk/XTS/WS-T/build.xml	2009-02-06 10:57:07 UTC (rev 25132)
@@ -103,6 +103,7 @@
             jbossws-native-jaxws.jar jbossws-client.jar stax-api.jar jbossws-native-saaj.jar
             jbossws-native-jaxws-ext.jar jbossws-native-core.jar jbossws-common.jar jboss-logging-spi.jar"/>
     <property name="jboss.common.lib.jars" value="servlet-api.jar"/>
+    <property name="jboss.lib.jars" value="dom4j.jar"/>
 
     <property name="tests.libs"              value="junit.jar"/>
     <property name="ws-c.libs"               value="ws-c.jar"/>
@@ -141,6 +142,7 @@
     	<fileset dir="${com.arjuna.jta.install.lib}" includes="${jta.lib.jars}"/>
         <fileset dir="${jboss.client.lib.dir}" includes="${jboss.client.lib.jars}"/>
         <fileset dir="${jboss.common.lib.dir}" includes="${jboss.common.lib.jars}"/>
+	<fileset dir="${jboss.lib.dir}" includes="${jboss.lib.jars}"/>
     </path>
 
     <path id="tests.lib.path">

Modified: labs/jbosstm/trunk/XTS/WS-T/tests/dd/ws-t-tests_web-app.xml
===================================================================
--- labs/jbosstm/trunk/XTS/WS-T/tests/dd/ws-t-tests_web-app.xml	2009-02-06 06:45:54 UTC (rev 25131)
+++ labs/jbosstm/trunk/XTS/WS-T/tests/dd/ws-t-tests_web-app.xml	2009-02-06 10:57:07 UTC (rev 25132)
@@ -42,11 +42,26 @@
         <load-on-startup>4</load-on-startup>
     </servlet>
 
+    <servlet>
+        <servlet-name>JUnit Tests XML Servlet</servlet-name>
+        <servlet-class>com.arjuna.qa.junit.TestRunnerXMLServlet</servlet-class>
+        <init-param>
+            <param-name>TestSuiteClassName</param-name>
+            <param-value>com.arjuna.wst.tests.junit.TestSuite</param-value>
+        </init-param>
+        <load-on-startup>4</load-on-startup>
+    </servlet>
+
 	<!-- servlet mappings -->
     <servlet-mapping>
         <servlet-name>JUnit Tests Servlet</servlet-name>
         <url-pattern>/index.html</url-pattern>
     </servlet-mapping>
+
+    <servlet-mapping>
+        <servlet-name>JUnit Tests XML Servlet</servlet-name>
+        <url-pattern>/index.xml</url-pattern>
+    </servlet-mapping>
     
     <welcome-file-list>
         <welcome-file>index.html</welcome-file>

Modified: labs/jbosstm/trunk/XTS/WS-T/tests/dd/ws-t11-tests_web-app.xml
===================================================================
--- labs/jbosstm/trunk/XTS/WS-T/tests/dd/ws-t11-tests_web-app.xml	2009-02-06 06:45:54 UTC (rev 25131)
+++ labs/jbosstm/trunk/XTS/WS-T/tests/dd/ws-t11-tests_web-app.xml	2009-02-06 10:57:07 UTC (rev 25132)
@@ -42,12 +42,27 @@
         <load-on-startup>4</load-on-startup>
     </servlet>
 
+    <servlet>
+        <servlet-name>JUnit Tests XML Servlet</servlet-name>
+        <servlet-class>com.arjuna.qa.junit.TestRunnerXMLServlet</servlet-class>
+        <init-param>
+            <param-name>TestSuiteClassName</param-name>
+            <param-value>com.arjuna.wst11.tests.junit.TestSuite</param-value>
+        </init-param>
+        <load-on-startup>4</load-on-startup>
+    </servlet>
+
 	<!-- servlet mappings -->
     <servlet-mapping>
         <servlet-name>JUnit Tests Servlet</servlet-name>
         <url-pattern>/index.html</url-pattern>
     </servlet-mapping>
-    
+
+    <servlet-mapping>
+        <servlet-name>JUnit Tests XML Servlet</servlet-name>
+        <url-pattern>/index.xml</url-pattern>
+    </servlet-mapping>
+
     <welcome-file-list>
         <welcome-file>index.html</welcome-file>
     </welcome-file-list>

Modified: labs/jbosstm/trunk/XTS/WS-T/tests/src/com/arjuna/qa/junit/TestRunnerServlet.java
===================================================================
--- labs/jbosstm/trunk/XTS/WS-T/tests/src/com/arjuna/qa/junit/TestRunnerServlet.java	2009-02-06 06:45:54 UTC (rev 25131)
+++ labs/jbosstm/trunk/XTS/WS-T/tests/src/com/arjuna/qa/junit/TestRunnerServlet.java	2009-02-06 10:57:07 UTC (rev 25132)
@@ -26,13 +26,24 @@
 
 package com.arjuna.qa.junit;
 
-import java.io.*;
-import java.util.*;
-import java.net.*;
-import javax.servlet.*;
-import javax.servlet.http.*;
-import junit.framework.*;
+import junit.framework.AssertionFailedError;
+import junit.framework.Test;
+import junit.framework.TestListener;
+import junit.framework.TestResult;
+import junit.framework.TestSuite;
 
+import javax.servlet.ServletConfig;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.CharArrayWriter;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
+
 public class TestRunnerServlet extends HttpServlet
 {
     public void init(ServletConfig config) throws ServletException
@@ -42,6 +53,11 @@
         _testSuiteClassName = config.getInitParameter("TestSuiteClassName");
     }
 
+   protected String getContentType()
+   {
+       return "text/html";
+   }
+
     public void doGet(HttpServletRequest request, HttpServletResponse response)
         throws ServletException, IOException
     {
@@ -49,7 +65,7 @@
         {
             PrintWriter writer = response.getWriter();
 
-            response.setContentType("text/html");
+            response.setContentType(getContentType());
             response.setHeader("Cache-Control", "no-cache");
 
             if (request.getParameter("failednumber") != null)
@@ -80,7 +96,7 @@
         {
             PrintWriter writer = response.getWriter();
 
-            response.setContentType("text/html");
+            response.setContentType(getContentType());
             response.setHeader("Cache-Control", "no-cache");
 
 	    if ((_runnerThread == null) || (! _runnerThread.isAlive()))
@@ -463,27 +479,27 @@
             doStatus(writer, request, response);
     }
 
-    private class PassedTest
+    protected class PassedTest
     {
         public Test test;
         public long duration;
     }
 
-    private class FailedTest
+    protected class FailedTest
     {
         public Test                 test;
         public long                 duration;
         public AssertionFailedError assertionFailedError;
     }
 
-    private class ErrorTest
+    protected class ErrorTest
     {
         public Test      test;
         public long      duration;
 	public Throwable throwable;
     }
 
-    private class RunnerThread extends Thread
+    protected class RunnerThread extends Thread
     {
         public void run()
         {
@@ -514,7 +530,7 @@
         }
     }
 
-    private class BasicTestListener implements TestListener
+    protected class BasicTestListener implements TestListener
     {
         public void startTest(Test test)
         {
@@ -596,13 +612,13 @@
             writer.print("null");
     }
 
-    private List         _passedTests        = new LinkedList();
-    private List         _failedTests        = new LinkedList();
-    private List         _errorTests         = new LinkedList();
-    private Test         _currentTest        = null;
-    private String       _testSuiteClassName = null;
-    private RunnerThread _runnerThread       = null;
-    private TestResult   _testResult         = null;
+    protected List         _passedTests        = new LinkedList();
+    protected List         _failedTests        = new LinkedList();
+    protected List         _errorTests         = new LinkedList();
+    protected Test         _currentTest        = null;
+    protected String       _testSuiteClassName = null;
+    protected RunnerThread _runnerThread       = null;
+    protected TestResult   _testResult         = null;
     private TestSuite    _testSuite          = null;
 
 }

Added: labs/jbosstm/trunk/XTS/WS-T/tests/src/com/arjuna/qa/junit/TestRunnerXMLServlet.java
===================================================================
--- labs/jbosstm/trunk/XTS/WS-T/tests/src/com/arjuna/qa/junit/TestRunnerXMLServlet.java	                        (rev 0)
+++ labs/jbosstm/trunk/XTS/WS-T/tests/src/com/arjuna/qa/junit/TestRunnerXMLServlet.java	2009-02-06 10:57:07 UTC (rev 25132)
@@ -0,0 +1,209 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2006, 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) 2005-2006,
+ * @author JBoss Inc.
+ */
+package com.arjuna.qa.junit;
+
+import org.dom4j.dom.DOMDocument;
+import org.dom4j.dom.DOMElement;
+import org.dom4j.io.OutputFormat;
+import org.dom4j.io.XMLWriter;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.CharArrayWriter;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.util.Date;
+import java.util.Iterator;
+
+/**
+ * @author <a href="mailto:istudens at redhat.com">Ivo Studensky</a>
+ * @version $Revision$
+ */
+public class TestRunnerXMLServlet extends TestRunnerServlet
+{
+
+    @Override
+    protected String getContentType()
+    {
+        return "text/xml";
+    }
+
+    @Override
+    public void doStatus(PrintWriter writer, HttpServletRequest request, HttpServletResponse response)
+            throws ServletException
+    {
+
+        DOMDocument report = new DOMDocument();
+        DOMElement testsuite = new DOMElement("testsuite");
+        report.setRootElement(testsuite);
+        testsuite.addAttribute("name", _testSuiteClassName);
+        testsuite.addAttribute("errors", Integer.toString(_errorTests.size()));
+        testsuite.addAttribute("failures", Integer.toString(_failedTests.size()));
+        testsuite.addAttribute("hostname", request.getServerName());
+        testsuite.addAttribute("tests", Integer.toString((_testResult != null) ? _testResult.runCount() : 0));
+        testsuite.addAttribute("timestamp", new Date().toString());
+
+        DOMElement properties = new DOMElement("properties");
+        testsuite.add(properties);
+        DOMElement status = newPropertyDOMElement("status");
+        properties.add(status);
+        if ((_runnerThread == null) || (! _runnerThread.isAlive()))
+        {
+            if (_passedTests.isEmpty() && _failedTests.isEmpty() && _errorTests.isEmpty())
+            {
+                status.addAttribute("value", "stopped");
+            }
+            else
+            {
+                status.addAttribute("value", "finished");
+            }
+        }
+        else if (_currentTest != null)
+        {
+            status.addAttribute("value", "running");
+            properties.add(newPropertyDOMElement("current-test", _currentTest.toString()));
+        }
+
+        long totalDuration = 0;
+
+        if (! _passedTests.isEmpty())
+        {
+            Iterator passedTestsIterator = _passedTests.iterator();
+            while (passedTestsIterator.hasNext())
+            {
+                PassedTest passedTest = (PassedTest) passedTestsIterator.next();
+                totalDuration += passedTest.duration;
+
+                testsuite.add(newTestcase(
+                        passedTest.test.getClass().getName(), passedTest.test.toString(), passedTest.duration));
+            }
+        }
+
+        if (! _failedTests.isEmpty())
+        {
+            Iterator failedTestsIterator = _failedTests.iterator();
+            while (failedTestsIterator.hasNext())
+            {
+                FailedTest failedTest = (FailedTest) failedTestsIterator.next();
+                totalDuration += failedTest.duration;
+
+                CharArrayWriter charArrayWriter = new CharArrayWriter();
+                PrintWriter     printWriter     = new PrintWriter(charArrayWriter, true);
+                failedTest.assertionFailedError.printStackTrace(printWriter);
+                printWriter.close();
+                charArrayWriter.close();
+
+                testsuite.add(newFailedTestcase(
+                        failedTest.test.getClass().getName(), failedTest.test.toString(), failedTest.duration,
+                        failedTest.assertionFailedError.getMessage(), charArrayWriter.toString()));
+            }
+        }
+
+        if (! _errorTests.isEmpty())
+        {
+            Iterator errorTestsIterator = _errorTests.iterator();
+            while (errorTestsIterator.hasNext())
+            {
+                ErrorTest errorTest = (ErrorTest) errorTestsIterator.next();
+                totalDuration += errorTest.duration;
+
+                CharArrayWriter charArrayWriter = new CharArrayWriter();
+                PrintWriter     printWriter     = new PrintWriter(charArrayWriter, true);
+                errorTest.throwable.printStackTrace(printWriter);
+                printWriter.close();
+                charArrayWriter.close();
+
+                System.out.println("charArrayWriter.toString()=" + charArrayWriter.toString());
+                testsuite.add(newErrorTestcase(
+                        errorTest.test.getClass().getName(), errorTest.test.toString(), errorTest.duration,
+                        errorTest.throwable.getMessage(), charArrayWriter.toString()));
+            }
+        }
+        testsuite.add(new DOMElement("system-out").addCDATA(""));
+        testsuite.add(new DOMElement("system-err").addCDATA(""));
+        // total time of all tests
+        testsuite.addAttribute("time", Float.toString(totalDuration / 1000f));
+
+        XMLWriter outputter = new XMLWriter(writer, OutputFormat.createPrettyPrint());
+        try {
+            outputter.write(testsuite);
+            outputter.close();
+        } catch (IOException e) {
+            throw new ServletException(e);
+        }
+    }
+
+    private DOMElement newPropertyDOMElement(String name)
+    {
+        return newPropertyDOMElement(name, null);
+    }
+
+    private DOMElement newPropertyDOMElement(String name, String value)
+    {
+        DOMElement property = new DOMElement("property");
+        property.addAttribute("name", name);
+        if (value != null)
+        {
+            property.addAttribute("value", value);
+        }
+        return property;
+    }
+
+    private DOMElement newTestcase(String classname, String name, long duration)
+    {
+        return newTestcase(classname, name, duration, null, null, null);
+    }
+
+    private DOMElement newFailedTestcase(String classname, String name, long duration, String failureMessage, String failureDetail)
+    {
+        return newTestcase(classname, name, duration, "junit.framework.AssertionFailedError", failureMessage, failureDetail);
+    }
+
+    private DOMElement newErrorTestcase(String classname, String name, long duration, String failureMessage, String failureDetail)
+    {
+        return newTestcase(classname, name, duration, "junit.framework.throwable", failureMessage, failureDetail);
+    }
+
+    private DOMElement newTestcase(String classname, String name, long duration, String failureMessage, String failureType, String failureDetail)
+    {
+        DOMElement testcase = new DOMElement("testcase");
+        testcase.addAttribute("classname", classname);
+        testcase.addAttribute("name", name);
+        testcase.addAttribute("time", Float.toString(duration / 1000f));    // converts from miliseconds to seconds
+        if (failureMessage != null)
+        {
+            DOMElement failure = new DOMElement("failure");
+            testcase.add(failure);
+            failure.addAttribute("message", failureMessage);
+            if (failureType != null)
+            {
+                failure.addAttribute("type", failureType);
+            }
+            if (failureDetail != null)
+            {
+                failure.addCDATA(failureDetail);
+            }
+        }
+        return testcase;
+    }
+
+}
\ No newline at end of file

Modified: labs/jbosstm/trunk/XTS/WSAS/build.xml
===================================================================
--- labs/jbosstm/trunk/XTS/WSAS/build.xml	2009-02-06 06:45:54 UTC (rev 25131)
+++ labs/jbosstm/trunk/XTS/WSAS/build.xml	2009-02-06 10:57:07 UTC (rev 25132)
@@ -34,6 +34,7 @@
 	<property name="jboss.dir" value="${env.JBOSS_HOME}"/>
 	<property name="deploy.dir" value="${jboss.dir}/server/default/deploy"/>
 
+    <property name="jboss.lib.dir" location="${jboss.dir}/lib"/>
     <property name="jboss.client.lib.dir" location="${jboss.dir}/client"/>
 
     <property name="com.arjuna.buildsystem.dir" location="../../antbuildsystem"/>
@@ -51,6 +52,7 @@
     <property name="jboss.client.lib.jars" value="jaxb-api.jar jboss-javaee.jar jbossws-native-jaxrpc.jar
             jbossws-native-jaxws.jar jbossws-client.jar stax-api.jar jbossws-native-saaj.jar
             jbossws-native-jaxws-ext.jar jbossws-native-core.jar jbossws-common.jar jboss-logging-spi.jar"/>
+    <property name="jboss.lib.jars" value="dom4j.jar"/>
 
     <property name="com.arjuna.mwlabs.wsas.resourcebundle" value="wsas_msg_en_US.properties"/>
 
@@ -91,6 +93,7 @@
 	<path id="com.arjuna.mwlabs.wsas.tests.lib.path">
 	  <fileset dir="${com.arjuna.xts.ext}" includes="${tests.libs}"/>
 	  <fileset dir="${jboss.client.lib.dir}" includes="${jboss.client.lib.jars}"/>
+	  <fileset dir="${jboss.lib.dir}" includes="${jboss.lib.jars}"/>
 	</path>
 
 	<!-- Initialisation -->

Modified: labs/jbosstm/trunk/XTS/WSAS/tests/classes/com/arjuna/qa/junit/WSASTestRunnerServlet.java
===================================================================
--- labs/jbosstm/trunk/XTS/WSAS/tests/classes/com/arjuna/qa/junit/WSASTestRunnerServlet.java	2009-02-06 06:45:54 UTC (rev 25131)
+++ labs/jbosstm/trunk/XTS/WSAS/tests/classes/com/arjuna/qa/junit/WSASTestRunnerServlet.java	2009-02-06 10:57:07 UTC (rev 25132)
@@ -26,12 +26,24 @@
 
 package com.arjuna.qa.junit;
 
-import java.io.*;
-import java.util.*;
-import javax.servlet.*;
-import javax.servlet.http.*;
-import junit.framework.*;
+import junit.framework.AssertionFailedError;
+import junit.framework.Test;
+import junit.framework.TestListener;
+import junit.framework.TestResult;
+import junit.framework.TestSuite;
 
+import javax.servlet.ServletConfig;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.CharArrayWriter;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
+
 public class WSASTestRunnerServlet extends HttpServlet
 {
     public void init(ServletConfig config) throws ServletException
@@ -41,6 +53,11 @@
         _testSuiteClassName = config.getInitParameter("TestSuiteClassName");
     }
 
+   protected String getContentType()
+   {
+       return "text/html";
+   }
+
     public void doGet(HttpServletRequest request, HttpServletResponse response)
         throws ServletException, IOException
     {
@@ -48,7 +65,7 @@
         {
             PrintWriter writer = response.getWriter();
 
-            response.setContentType("text/html");
+            response.setContentType(getContentType());
             response.setHeader("Cache-Control", "no-cache");
 
             if (request.getParameter("failednumber") != null)
@@ -79,7 +96,7 @@
         {
             PrintWriter writer = response.getWriter();
 
-            response.setContentType("text/html");
+            response.setContentType(getContentType());
             response.setHeader("Cache-Control", "no-cache");
 
 	    if ((_runnerThread == null) || (! _runnerThread.isAlive()))
@@ -462,27 +479,27 @@
             doStatus(writer, request, response);
     }
 
-    private class PassedTest
+    protected class PassedTest
     {
         public Test test;
         public long duration;
     }
 
-    private class FailedTest
+    protected class FailedTest
     {
         public Test                 test;
         public long                 duration;
         public AssertionFailedError assertionFailedError;
     }
 
-    private class ErrorTest
+    protected class ErrorTest
     {
         public Test      test;
         public long      duration;
 	public Throwable throwable;
     }
 
-    private class RunnerThread extends Thread
+    protected class RunnerThread extends Thread
     {
         public void run()
         {
@@ -513,7 +530,7 @@
         }
     }
 
-    private class BasicTestListener implements TestListener
+    protected class BasicTestListener implements TestListener
     {
         public void startTest(Test test)
         {
@@ -595,13 +612,13 @@
             writer.print("null");
     }
 
-    private List         _passedTests        = new LinkedList();
-    private List         _failedTests        = new LinkedList();
-    private List         _errorTests         = new LinkedList();
-    private Test         _currentTest        = null;
-    private String       _testSuiteClassName = null;
-    private RunnerThread _runnerThread       = null;
-    private TestResult   _testResult         = null;
+    protected List         _passedTests        = new LinkedList();
+    protected List         _failedTests        = new LinkedList();
+    protected List         _errorTests         = new LinkedList();
+    protected Test         _currentTest        = null;
+    protected String       _testSuiteClassName = null;
+    protected RunnerThread _runnerThread       = null;
+    protected TestResult   _testResult         = null;
     private TestSuite    _testSuite          = null;
 
 }
\ No newline at end of file

Added: labs/jbosstm/trunk/XTS/WSAS/tests/classes/com/arjuna/qa/junit/WSASTestRunnerXMLServlet.java
===================================================================
--- labs/jbosstm/trunk/XTS/WSAS/tests/classes/com/arjuna/qa/junit/WSASTestRunnerXMLServlet.java	                        (rev 0)
+++ labs/jbosstm/trunk/XTS/WSAS/tests/classes/com/arjuna/qa/junit/WSASTestRunnerXMLServlet.java	2009-02-06 10:57:07 UTC (rev 25132)
@@ -0,0 +1,209 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2006, 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) 2005-2006,
+ * @author JBoss Inc.
+ */
+package com.arjuna.qa.junit;
+
+import org.dom4j.dom.DOMDocument;
+import org.dom4j.dom.DOMElement;
+import org.dom4j.io.OutputFormat;
+import org.dom4j.io.XMLWriter;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.CharArrayWriter;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.util.Date;
+import java.util.Iterator;
+
+/**
+ * @author <a href="mailto:istudens at redhat.com">Ivo Studensky</a>
+ * @version $Revision$
+ */
+public class WSASTestRunnerXMLServlet extends WSASTestRunnerServlet
+{
+
+    @Override
+    protected String getContentType()
+    {
+        return "text/xml";
+    }
+
+    @Override
+    public void doStatus(PrintWriter writer, HttpServletRequest request, HttpServletResponse response)
+            throws ServletException
+    {
+
+        DOMDocument report = new DOMDocument();
+        DOMElement testsuite = new DOMElement("testsuite");
+        report.setRootElement(testsuite);
+        testsuite.addAttribute("name", _testSuiteClassName);
+        testsuite.addAttribute("errors", Integer.toString(_errorTests.size()));
+        testsuite.addAttribute("failures", Integer.toString(_failedTests.size()));
+        testsuite.addAttribute("hostname", request.getServerName());
+        testsuite.addAttribute("tests", Integer.toString((_testResult != null) ? _testResult.runCount() : 0));
+        testsuite.addAttribute("timestamp", new Date().toString());
+
+        DOMElement properties = new DOMElement("properties");
+        testsuite.add(properties);
+        DOMElement status = newPropertyDOMElement("status");
+        properties.add(status);
+        if ((_runnerThread == null) || (! _runnerThread.isAlive()))
+        {
+            if (_passedTests.isEmpty() && _failedTests.isEmpty() && _errorTests.isEmpty())
+            {
+                status.addAttribute("value", "stopped");
+            }
+            else
+            {
+                status.addAttribute("value", "finished");
+            }
+        }
+        else if (_currentTest != null)
+        {
+            status.addAttribute("value", "running");
+            properties.add(newPropertyDOMElement("current-test", _currentTest.toString()));
+        }
+
+        long totalDuration = 0;
+
+        if (! _passedTests.isEmpty())
+        {
+            Iterator passedTestsIterator = _passedTests.iterator();
+            while (passedTestsIterator.hasNext())
+            {
+                PassedTest passedTest = (PassedTest) passedTestsIterator.next();
+                totalDuration += passedTest.duration;
+
+                testsuite.add(newTestcase(
+                        passedTest.test.getClass().getName(), passedTest.test.toString(), passedTest.duration));
+            }
+        }
+
+        if (! _failedTests.isEmpty())
+        {
+            Iterator failedTestsIterator = _failedTests.iterator();
+            while (failedTestsIterator.hasNext())
+            {
+                FailedTest failedTest = (FailedTest) failedTestsIterator.next();
+                totalDuration += failedTest.duration;
+
+                CharArrayWriter charArrayWriter = new CharArrayWriter();
+                PrintWriter     printWriter     = new PrintWriter(charArrayWriter, true);
+                failedTest.assertionFailedError.printStackTrace(printWriter);
+                printWriter.close();
+                charArrayWriter.close();
+
+                testsuite.add(newFailedTestcase(
+                        failedTest.test.getClass().getName(), failedTest.test.toString(), failedTest.duration,
+                        failedTest.assertionFailedError.getMessage(), charArrayWriter.toString()));
+            }
+        }
+
+        if (! _errorTests.isEmpty())
+        {
+            Iterator errorTestsIterator = _errorTests.iterator();
+            while (errorTestsIterator.hasNext())
+            {
+                ErrorTest errorTest = (ErrorTest) errorTestsIterator.next();
+                totalDuration += errorTest.duration;
+
+                CharArrayWriter charArrayWriter = new CharArrayWriter();
+                PrintWriter     printWriter     = new PrintWriter(charArrayWriter, true);
+                errorTest.throwable.printStackTrace(printWriter);
+                printWriter.close();
+                charArrayWriter.close();
+
+                System.out.println("charArrayWriter.toString()=" + charArrayWriter.toString());
+                testsuite.add(newErrorTestcase(
+                        errorTest.test.getClass().getName(), errorTest.test.toString(), errorTest.duration,
+                        errorTest.throwable.getMessage(), charArrayWriter.toString()));
+            }
+        }
+        testsuite.add(new DOMElement("system-out").addCDATA(""));
+        testsuite.add(new DOMElement("system-err").addCDATA(""));
+        // total time of all tests
+        testsuite.addAttribute("time", Float.toString(totalDuration / 1000f));
+
+        XMLWriter outputter = new XMLWriter(writer, OutputFormat.createPrettyPrint());
+        try {
+            outputter.write(testsuite);
+            outputter.close();
+        } catch (IOException e) {
+            throw new ServletException(e);
+        }
+    }
+
+    private DOMElement newPropertyDOMElement(String name)
+    {
+        return newPropertyDOMElement(name, null);
+    }
+
+    private DOMElement newPropertyDOMElement(String name, String value)
+    {
+        DOMElement property = new DOMElement("property");
+        property.addAttribute("name", name);
+        if (value != null)
+        {
+            property.addAttribute("value", value);
+        }
+        return property;
+    }
+
+    private DOMElement newTestcase(String classname, String name, long duration)
+    {
+        return newTestcase(classname, name, duration, null, null, null);
+    }
+
+    private DOMElement newFailedTestcase(String classname, String name, long duration, String failureMessage, String failureDetail)
+    {
+        return newTestcase(classname, name, duration, "junit.framework.AssertionFailedError", failureMessage, failureDetail);
+    }
+
+    private DOMElement newErrorTestcase(String classname, String name, long duration, String failureMessage, String failureDetail)
+    {
+        return newTestcase(classname, name, duration, "junit.framework.throwable", failureMessage, failureDetail);
+    }
+
+    private DOMElement newTestcase(String classname, String name, long duration, String failureMessage, String failureType, String failureDetail)
+    {
+        DOMElement testcase = new DOMElement("testcase");
+        testcase.addAttribute("classname", classname);
+        testcase.addAttribute("name", name);
+        testcase.addAttribute("time", Float.toString(duration / 1000f));    // converts from miliseconds to seconds
+        if (failureMessage != null)
+        {
+            DOMElement failure = new DOMElement("failure");
+            testcase.add(failure);
+            failure.addAttribute("message", failureMessage);
+            if (failureType != null)
+            {
+                failure.addAttribute("type", failureType);
+            }
+            if (failureDetail != null)
+            {
+                failure.addCDATA(failureDetail);
+            }
+        }
+        return testcase;
+    }
+
+}
\ No newline at end of file

Modified: labs/jbosstm/trunk/XTS/WSAS/tests/dd/wsas-tests_web-app.xml
===================================================================
--- labs/jbosstm/trunk/XTS/WSAS/tests/dd/wsas-tests_web-app.xml	2009-02-06 06:45:54 UTC (rev 25131)
+++ labs/jbosstm/trunk/XTS/WSAS/tests/dd/wsas-tests_web-app.xml	2009-02-06 10:57:07 UTC (rev 25132)
@@ -32,7 +32,7 @@
         <listener-class>com.arjuna.wsas.tests.TestInitialisation</listener-class>
     </listener>
     
- <servlet>
+    <servlet>
         <servlet-name>JUnit Tests Servlet</servlet-name>
         <servlet-class>com.arjuna.qa.junit.WSASTestRunnerServlet</servlet-class>
         <init-param>
@@ -42,11 +42,26 @@
         <load-on-startup>4</load-on-startup>
     </servlet>
 
+        <servlet>
+        <servlet-name>JUnit Tests XML Servlet</servlet-name>
+        <servlet-class>com.arjuna.qa.junit.WSASTestRunnerXMLServlet</servlet-class>
+        <init-param>
+            <param-name>TestSuiteClassName</param-name>
+            <param-value>com.arjuna.wsas.tests.WSASTestSuite</param-value>
+        </init-param>
+        <load-on-startup>4</load-on-startup>
+    </servlet>
+    
 	<!-- servlet mappings -->
     <servlet-mapping>
         <servlet-name>JUnit Tests Servlet</servlet-name>
         <url-pattern>/index.html</url-pattern>
     </servlet-mapping>
+
+    <servlet-mapping>
+        <servlet-name>JUnit Tests XML Servlet</servlet-name>
+        <url-pattern>/index.xml</url-pattern>
+    </servlet-mapping>
     
     <welcome-file-list>
         <welcome-file>index.html</welcome-file>

Modified: labs/jbosstm/trunk/XTS/WSCF/build.xml
===================================================================
--- labs/jbosstm/trunk/XTS/WSCF/build.xml	2009-02-06 06:45:54 UTC (rev 25131)
+++ labs/jbosstm/trunk/XTS/WSCF/build.xml	2009-02-06 10:57:07 UTC (rev 25132)
@@ -80,6 +80,7 @@
             jbossws-native-jaxws.jar jbossws-client.jar stax-api.jar jbossws-native-saaj.jar
             jbossws-native-jaxws-ext.jar jbossws-native-core.jar jbossws-common.jar jboss-logging-spi.jar"/>
     <property name="jboss.common.lib.jars" value="servlet-api.jar"/>
+    <property name="jboss.lib.jars" value="dom4j.jar"/>
 
     <property name="wsas.libs" value="wsas.jar"/>
     <property name="wsc.libs" value="ws-c.jar"/>
@@ -121,6 +122,7 @@
 
 	<path id="com.arjuna.mwlabs.wscf.tests.lib.path">
 	  <fileset dir="${com.arjuna.xts.ext}" includes="${tests.libs}"/>
+	  <fileset dir="${jboss.lib.dir}" includes="${jboss.lib.jars}"/>
 	</path>
 
 	<!-- Initialisation -->

Modified: labs/jbosstm/trunk/XTS/WSCF/tests/classes/com/arjuna/qa/junit/WSCFTestRunnerServlet.java
===================================================================
--- labs/jbosstm/trunk/XTS/WSCF/tests/classes/com/arjuna/qa/junit/WSCFTestRunnerServlet.java	2009-02-06 06:45:54 UTC (rev 25131)
+++ labs/jbosstm/trunk/XTS/WSCF/tests/classes/com/arjuna/qa/junit/WSCFTestRunnerServlet.java	2009-02-06 10:57:07 UTC (rev 25132)
@@ -26,12 +26,24 @@
 
 package com.arjuna.qa.junit;
 
-import java.io.*;
-import java.util.*;
-import javax.servlet.*;
-import javax.servlet.http.*;
-import junit.framework.*;
+import junit.framework.AssertionFailedError;
+import junit.framework.Test;
+import junit.framework.TestListener;
+import junit.framework.TestResult;
+import junit.framework.TestSuite;
 
+import javax.servlet.ServletConfig;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.CharArrayWriter;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
+
 public class WSCFTestRunnerServlet extends HttpServlet
 {
     public void init(ServletConfig config) throws ServletException
@@ -41,6 +53,11 @@
         _testSuiteClassName = config.getInitParameter("TestSuiteClassName");
     }
 
+   protected String getContentType()
+   {
+       return "text/html";
+   }
+
     public void doGet(HttpServletRequest request, HttpServletResponse response)
         throws ServletException, IOException
     {
@@ -48,7 +65,7 @@
         {
             PrintWriter writer = response.getWriter();
 
-            response.setContentType("text/html");
+            response.setContentType(getContentType());
             response.setHeader("Cache-Control", "no-cache");
 
             if (request.getParameter("failednumber") != null)
@@ -79,7 +96,7 @@
         {
             PrintWriter writer = response.getWriter();
 
-            response.setContentType("text/html");
+            response.setContentType(getContentType());
             response.setHeader("Cache-Control", "no-cache");
 
 	    if ((_runnerThread == null) || (! _runnerThread.isAlive()))
@@ -462,27 +479,27 @@
             doStatus(writer, request, response);
     }
 
-    private class PassedTest
+    protected class PassedTest
     {
         public Test test;
         public long duration;
     }
 
-    private class FailedTest
+    protected class FailedTest
     {
         public Test                 test;
         public long                 duration;
         public AssertionFailedError assertionFailedError;
     }
 
-    private class ErrorTest
+    protected class ErrorTest
     {
         public Test      test;
         public long      duration;
 	public Throwable throwable;
     }
 
-    private class RunnerThread extends Thread
+    protected class RunnerThread extends Thread
     {
         public void run()
         {
@@ -513,7 +530,7 @@
         }
     }
 
-    private class BasicTestListener implements TestListener
+    protected class BasicTestListener implements TestListener
     {
         public void startTest(Test test)
         {
@@ -595,13 +612,13 @@
             writer.print("null");
     }
 
-    private List         _passedTests        = new LinkedList();
-    private List         _failedTests        = new LinkedList();
-    private List         _errorTests         = new LinkedList();
-    private Test         _currentTest        = null;
-    private String       _testSuiteClassName = null;
-    private RunnerThread _runnerThread       = null;
-    private TestResult   _testResult         = null;
+    protected List         _passedTests        = new LinkedList();
+    protected List         _failedTests        = new LinkedList();
+    protected List         _errorTests         = new LinkedList();
+    protected Test         _currentTest        = null;
+    protected String       _testSuiteClassName = null;
+    protected RunnerThread _runnerThread       = null;
+    protected TestResult   _testResult         = null;
     private TestSuite    _testSuite          = null;
 
 }
\ No newline at end of file

Added: labs/jbosstm/trunk/XTS/WSCF/tests/classes/com/arjuna/qa/junit/WSCFTestRunnerXMLServlet.java
===================================================================
--- labs/jbosstm/trunk/XTS/WSCF/tests/classes/com/arjuna/qa/junit/WSCFTestRunnerXMLServlet.java	                        (rev 0)
+++ labs/jbosstm/trunk/XTS/WSCF/tests/classes/com/arjuna/qa/junit/WSCFTestRunnerXMLServlet.java	2009-02-06 10:57:07 UTC (rev 25132)
@@ -0,0 +1,209 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2006, 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) 2005-2006,
+ * @author JBoss Inc.
+ */
+package com.arjuna.qa.junit;
+
+import org.dom4j.dom.DOMDocument;
+import org.dom4j.dom.DOMElement;
+import org.dom4j.io.OutputFormat;
+import org.dom4j.io.XMLWriter;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.CharArrayWriter;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.util.Date;
+import java.util.Iterator;
+
+/**
+ * @author <a href="mailto:istudens at redhat.com">Ivo Studensky</a>
+ * @version $Revision$
+ */
+public class WSCFTestRunnerXMLServlet extends WSCFTestRunnerServlet
+{
+
+    @Override
+    protected String getContentType()
+    {
+        return "text/xml";
+    }
+
+    @Override
+    public void doStatus(PrintWriter writer, HttpServletRequest request, HttpServletResponse response)
+            throws ServletException
+    {
+
+        DOMDocument report = new DOMDocument();
+        DOMElement testsuite = new DOMElement("testsuite");
+        report.setRootElement(testsuite);
+        testsuite.addAttribute("name", _testSuiteClassName);
+        testsuite.addAttribute("errors", Integer.toString(_errorTests.size()));
+        testsuite.addAttribute("failures", Integer.toString(_failedTests.size()));
+        testsuite.addAttribute("hostname", request.getServerName());
+        testsuite.addAttribute("tests", Integer.toString((_testResult != null) ? _testResult.runCount() : 0));
+        testsuite.addAttribute("timestamp", new Date().toString());
+
+        DOMElement properties = new DOMElement("properties");
+        testsuite.add(properties);
+        DOMElement status = newPropertyDOMElement("status");
+        properties.add(status);
+        if ((_runnerThread == null) || (! _runnerThread.isAlive()))
+        {
+            if (_passedTests.isEmpty() && _failedTests.isEmpty() && _errorTests.isEmpty())
+            {
+                status.addAttribute("value", "stopped");
+            }
+            else
+            {
+                status.addAttribute("value", "finished");
+            }
+        }
+        else if (_currentTest != null)
+        {
+            status.addAttribute("value", "running");
+            properties.add(newPropertyDOMElement("current-test", _currentTest.toString()));
+        }
+
+        long totalDuration = 0;
+
+        if (! _passedTests.isEmpty())
+        {
+            Iterator passedTestsIterator = _passedTests.iterator();
+            while (passedTestsIterator.hasNext())
+            {
+                PassedTest passedTest = (PassedTest) passedTestsIterator.next();
+                totalDuration += passedTest.duration;
+
+                testsuite.add(newTestcase(
+                        passedTest.test.getClass().getName(), passedTest.test.toString(), passedTest.duration));
+            }
+        }
+
+        if (! _failedTests.isEmpty())
+        {
+            Iterator failedTestsIterator = _failedTests.iterator();
+            while (failedTestsIterator.hasNext())
+            {
+                FailedTest failedTest = (FailedTest) failedTestsIterator.next();
+                totalDuration += failedTest.duration;
+
+                CharArrayWriter charArrayWriter = new CharArrayWriter();
+                PrintWriter     printWriter     = new PrintWriter(charArrayWriter, true);
+                failedTest.assertionFailedError.printStackTrace(printWriter);
+                printWriter.close();
+                charArrayWriter.close();
+
+                testsuite.add(newFailedTestcase(
+                        failedTest.test.getClass().getName(), failedTest.test.toString(), failedTest.duration,
+                        failedTest.assertionFailedError.getMessage(), charArrayWriter.toString()));
+            }
+        }
+
+        if (! _errorTests.isEmpty())
+        {
+            Iterator errorTestsIterator = _errorTests.iterator();
+            while (errorTestsIterator.hasNext())
+            {
+                ErrorTest errorTest = (ErrorTest) errorTestsIterator.next();
+                totalDuration += errorTest.duration;
+
+                CharArrayWriter charArrayWriter = new CharArrayWriter();
+                PrintWriter     printWriter     = new PrintWriter(charArrayWriter, true);
+                errorTest.throwable.printStackTrace(printWriter);
+                printWriter.close();
+                charArrayWriter.close();
+
+                System.out.println("charArrayWriter.toString()=" + charArrayWriter.toString());
+                testsuite.add(newErrorTestcase(
+                        errorTest.test.getClass().getName(), errorTest.test.toString(), errorTest.duration,
+                        errorTest.throwable.getMessage(), charArrayWriter.toString()));
+            }
+        }
+        testsuite.add(new DOMElement("system-out").addCDATA(""));
+        testsuite.add(new DOMElement("system-err").addCDATA(""));
+        // total time of all tests
+        testsuite.addAttribute("time", Float.toString(totalDuration / 1000f));
+
+        XMLWriter outputter = new XMLWriter(writer, OutputFormat.createPrettyPrint());
+        try {
+            outputter.write(testsuite);
+            outputter.close();
+        } catch (IOException e) {
+            throw new ServletException(e);
+        }
+    }
+
+    private DOMElement newPropertyDOMElement(String name)
+    {
+        return newPropertyDOMElement(name, null);
+    }
+
+    private DOMElement newPropertyDOMElement(String name, String value)
+    {
+        DOMElement property = new DOMElement("property");
+        property.addAttribute("name", name);
+        if (value != null)
+        {
+            property.addAttribute("value", value);
+        }
+        return property;
+    }
+
+    private DOMElement newTestcase(String classname, String name, long duration)
+    {
+        return newTestcase(classname, name, duration, null, null, null);
+    }
+
+    private DOMElement newFailedTestcase(String classname, String name, long duration, String failureMessage, String failureDetail)
+    {
+        return newTestcase(classname, name, duration, "junit.framework.AssertionFailedError", failureMessage, failureDetail);
+    }
+
+    private DOMElement newErrorTestcase(String classname, String name, long duration, String failureMessage, String failureDetail)
+    {
+        return newTestcase(classname, name, duration, "junit.framework.throwable", failureMessage, failureDetail);
+    }
+
+    private DOMElement newTestcase(String classname, String name, long duration, String failureMessage, String failureType, String failureDetail)
+    {
+        DOMElement testcase = new DOMElement("testcase");
+        testcase.addAttribute("classname", classname);
+        testcase.addAttribute("name", name);
+        testcase.addAttribute("time", Float.toString(duration / 1000f));    // converts from miliseconds to seconds
+        if (failureMessage != null)
+        {
+            DOMElement failure = new DOMElement("failure");
+            testcase.add(failure);
+            failure.addAttribute("message", failureMessage);
+            if (failureType != null)
+            {
+                failure.addAttribute("type", failureType);
+            }
+            if (failureDetail != null)
+            {
+                failure.addCDATA(failureDetail);
+            }
+        }
+        return testcase;
+    }
+
+}
\ No newline at end of file

Modified: labs/jbosstm/trunk/XTS/WSCF/tests/dd/wscf-tests_web-app.xml
===================================================================
--- labs/jbosstm/trunk/XTS/WSCF/tests/dd/wscf-tests_web-app.xml	2009-02-06 06:45:54 UTC (rev 25131)
+++ labs/jbosstm/trunk/XTS/WSCF/tests/dd/wscf-tests_web-app.xml	2009-02-06 10:57:07 UTC (rev 25132)
@@ -32,7 +32,7 @@
         <listener-class>com.arjuna.wscf.tests.TestInitialisation</listener-class>
     </listener>
     
- <servlet>
+    <servlet>
         <servlet-name>JUnit Tests Servlet</servlet-name>
         <servlet-class>com.arjuna.qa.junit.WSCFTestRunnerServlet</servlet-class>
         <init-param>
@@ -42,11 +42,26 @@
         <load-on-startup>4</load-on-startup>
     </servlet>
 
+    <servlet>
+        <servlet-name>JUnit Tests XML Servlet</servlet-name>
+        <servlet-class>com.arjuna.qa.junit.WSCFTestRunnerXMLServlet</servlet-class>
+        <init-param>
+            <param-name>TestSuiteClassName</param-name>
+            <param-value>com.arjuna.wscf.tests.WSCFTestSuite</param-value>
+        </init-param>
+        <load-on-startup>4</load-on-startup>
+    </servlet>
+
 	<!-- servlet mappings -->
     <servlet-mapping>
         <servlet-name>JUnit Tests Servlet</servlet-name>
         <url-pattern>/index.html</url-pattern>
     </servlet-mapping>
+
+    <servlet-mapping>
+        <servlet-name>JUnit Tests XML Servlet</servlet-name>
+        <url-pattern>/index.xml</url-pattern>
+    </servlet-mapping>
     
     <welcome-file-list>
         <welcome-file>index.html</welcome-file>

Modified: labs/jbosstm/trunk/XTS/WSCF/tests/dd/wscf11-tests_web-app.xml
===================================================================
--- labs/jbosstm/trunk/XTS/WSCF/tests/dd/wscf11-tests_web-app.xml	2009-02-06 06:45:54 UTC (rev 25131)
+++ labs/jbosstm/trunk/XTS/WSCF/tests/dd/wscf11-tests_web-app.xml	2009-02-06 10:57:07 UTC (rev 25132)
@@ -42,11 +42,26 @@
         <load-on-startup>4</load-on-startup>
     </servlet>
 
+    <servlet>
+        <servlet-name>JUnit Tests XML Servlet</servlet-name>
+        <servlet-class>com.arjuna.qa.junit.WSCFTestRunnerXMLServlet</servlet-class>
+        <init-param>
+            <param-name>TestSuiteClassName</param-name>
+            <param-value>com.arjuna.wscf11.tests.WSCF11TestSuite</param-value>
+        </init-param>
+        <load-on-startup>4</load-on-startup>
+    </servlet>
+    
 	<!-- servlet mappings -->
     <servlet-mapping>
         <servlet-name>JUnit Tests Servlet</servlet-name>
         <url-pattern>/index.html</url-pattern>
     </servlet-mapping>
+
+    <servlet-mapping>
+        <servlet-name>JUnit Tests XML Servlet</servlet-name>
+        <url-pattern>/index.xml</url-pattern>
+    </servlet-mapping>
     
     <welcome-file-list>
         <welcome-file>index.html</welcome-file>

Modified: labs/jbosstm/trunk/XTS/WSTX/build.xml
===================================================================
--- labs/jbosstm/trunk/XTS/WSTX/build.xml	2009-02-06 06:45:54 UTC (rev 25131)
+++ labs/jbosstm/trunk/XTS/WSTX/build.xml	2009-02-06 10:57:07 UTC (rev 25132)
@@ -101,6 +101,7 @@
             jbossws-native-jaxws.jar jbossws-client.jar stax-api.jar jbossws-native-saaj.jar
             jbossws-native-jaxws-ext.jar jbossws-native-core.jar jbossws-common.jar jboss-logging-spi.jar"/>
     <property name="jboss.common.lib.jars" value="servlet-api.jar"/>
+    <property name="jboss.lib.jars" value="dom4j.jar"/>
 
     <property name="wsas.libs" value="wsas.jar"/>
     <property name="wsc.libs" value="ws-c.jar"/>
@@ -132,6 +133,7 @@
 
     <path id="com.arjuna.mwlabs.wstx.tests.lib.path">
         <fileset dir="${com.arjuna.xts.ext}" includes="${tests.libs}"/>
+	<fileset dir="${jboss.lib.dir}" includes="${jboss.lib.jars}"/>
     </path>
 
     <!-- Define classpath builder task -->

Modified: labs/jbosstm/trunk/XTS/WSTX/tests/classes/com/arjuna/qa/junit/WSTXTestRunnerServlet.java
===================================================================
--- labs/jbosstm/trunk/XTS/WSTX/tests/classes/com/arjuna/qa/junit/WSTXTestRunnerServlet.java	2009-02-06 06:45:54 UTC (rev 25131)
+++ labs/jbosstm/trunk/XTS/WSTX/tests/classes/com/arjuna/qa/junit/WSTXTestRunnerServlet.java	2009-02-06 10:57:07 UTC (rev 25132)
@@ -26,12 +26,24 @@
 
 package com.arjuna.qa.junit;
 
-import java.io.*;
-import java.util.*;
-import javax.servlet.*;
-import javax.servlet.http.*;
-import junit.framework.*;
+import junit.framework.AssertionFailedError;
+import junit.framework.Test;
+import junit.framework.TestListener;
+import junit.framework.TestResult;
+import junit.framework.TestSuite;
 
+import javax.servlet.ServletConfig;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.CharArrayWriter;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
+
 public class WSTXTestRunnerServlet extends HttpServlet
 {
     public void init(ServletConfig config) throws ServletException
@@ -41,6 +53,11 @@
         _testSuiteClassName = config.getInitParameter("TestSuiteClassName");
     }
 
+   protected String getContentType()
+   {
+       return "text/html";
+   }
+
     public void doGet(HttpServletRequest request, HttpServletResponse response)
         throws ServletException, IOException
     {
@@ -48,7 +65,7 @@
         {
             PrintWriter writer = response.getWriter();
 
-            response.setContentType("text/html");
+            response.setContentType(getContentType());
             response.setHeader("Cache-Control", "no-cache");
 
             if (request.getParameter("failednumber") != null)
@@ -79,7 +96,7 @@
         {
             PrintWriter writer = response.getWriter();
 
-            response.setContentType("text/html");
+            response.setContentType(getContentType());
             response.setHeader("Cache-Control", "no-cache");
 
 	    if ((_runnerThread == null) || (! _runnerThread.isAlive()))
@@ -462,27 +479,27 @@
             doStatus(writer, request, response);
     }
 
-    private class PassedTest
+    protected class PassedTest
     {
         public Test test;
         public long duration;
     }
 
-    private class FailedTest
+    protected class FailedTest
     {
         public Test                 test;
         public long                 duration;
         public AssertionFailedError assertionFailedError;
     }
 
-    private class ErrorTest
+    protected class ErrorTest
     {
         public Test      test;
         public long      duration;
 	public Throwable throwable;
     }
 
-    private class RunnerThread extends Thread
+    protected class RunnerThread extends Thread
     {
         public void run()
         {
@@ -513,7 +530,7 @@
         }
     }
 
-    private class BasicTestListener implements TestListener
+    protected class BasicTestListener implements TestListener
     {
         public void startTest(Test test)
         {
@@ -595,13 +612,13 @@
             writer.print("null");
     }
 
-    private List         _passedTests        = new LinkedList();
-    private List         _failedTests        = new LinkedList();
-    private List         _errorTests         = new LinkedList();
-    private Test         _currentTest        = null;
-    private String       _testSuiteClassName = null;
-    private RunnerThread _runnerThread       = null;
-    private TestResult   _testResult         = null;
+    protected List         _passedTests        = new LinkedList();
+    protected List         _failedTests        = new LinkedList();
+    protected List         _errorTests         = new LinkedList();
+    protected Test         _currentTest        = null;
+    protected String       _testSuiteClassName = null;
+    protected RunnerThread _runnerThread       = null;
+    protected TestResult   _testResult         = null;
     private TestSuite    _testSuite          = null;
 
 }
\ No newline at end of file

Added: labs/jbosstm/trunk/XTS/WSTX/tests/classes/com/arjuna/qa/junit/WSTXTestRunnerXMLServlet.java
===================================================================
--- labs/jbosstm/trunk/XTS/WSTX/tests/classes/com/arjuna/qa/junit/WSTXTestRunnerXMLServlet.java	                        (rev 0)
+++ labs/jbosstm/trunk/XTS/WSTX/tests/classes/com/arjuna/qa/junit/WSTXTestRunnerXMLServlet.java	2009-02-06 10:57:07 UTC (rev 25132)
@@ -0,0 +1,209 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2006, 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) 2005-2006,
+ * @author JBoss Inc.
+ */
+package com.arjuna.qa.junit;
+
+import org.dom4j.dom.DOMDocument;
+import org.dom4j.dom.DOMElement;
+import org.dom4j.io.OutputFormat;
+import org.dom4j.io.XMLWriter;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.CharArrayWriter;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.util.Date;
+import java.util.Iterator;
+
+/**
+ * @author <a href="mailto:istudens at redhat.com">Ivo Studensky</a>
+ * @version $Revision$
+ */
+public class WSTXTestRunnerXMLServlet extends WSTXTestRunnerServlet
+{
+
+    @Override
+    protected String getContentType()
+    {
+        return "text/xml";
+    }
+
+    @Override
+    public void doStatus(PrintWriter writer, HttpServletRequest request, HttpServletResponse response)
+            throws ServletException
+    {
+
+        DOMDocument report = new DOMDocument();
+        DOMElement testsuite = new DOMElement("testsuite");
+        report.setRootElement(testsuite);
+        testsuite.addAttribute("name", _testSuiteClassName);
+        testsuite.addAttribute("errors", Integer.toString(_errorTests.size()));
+        testsuite.addAttribute("failures", Integer.toString(_failedTests.size()));
+        testsuite.addAttribute("hostname", request.getServerName());
+        testsuite.addAttribute("tests", Integer.toString((_testResult != null) ? _testResult.runCount() : 0));
+        testsuite.addAttribute("timestamp", new Date().toString());
+
+        DOMElement properties = new DOMElement("properties");
+        testsuite.add(properties);
+        DOMElement status = newPropertyDOMElement("status");
+        properties.add(status);
+        if ((_runnerThread == null) || (! _runnerThread.isAlive()))
+        {
+            if (_passedTests.isEmpty() && _failedTests.isEmpty() && _errorTests.isEmpty())
+            {
+                status.addAttribute("value", "stopped");
+            }
+            else
+            {
+                status.addAttribute("value", "finished");
+            }
+        }
+        else if (_currentTest != null)
+        {
+            status.addAttribute("value", "running");
+            properties.add(newPropertyDOMElement("current-test", _currentTest.toString()));
+        }
+
+        long totalDuration = 0;
+
+        if (! _passedTests.isEmpty())
+        {
+            Iterator passedTestsIterator = _passedTests.iterator();
+            while (passedTestsIterator.hasNext())
+            {
+                PassedTest passedTest = (PassedTest) passedTestsIterator.next();
+                totalDuration += passedTest.duration;
+
+                testsuite.add(newTestcase(
+                        passedTest.test.getClass().getName(), passedTest.test.toString(), passedTest.duration));
+            }
+        }
+
+        if (! _failedTests.isEmpty())
+        {
+            Iterator failedTestsIterator = _failedTests.iterator();
+            while (failedTestsIterator.hasNext())
+            {
+                FailedTest failedTest = (FailedTest) failedTestsIterator.next();
+                totalDuration += failedTest.duration;
+
+                CharArrayWriter charArrayWriter = new CharArrayWriter();
+                PrintWriter     printWriter     = new PrintWriter(charArrayWriter, true);
+                failedTest.assertionFailedError.printStackTrace(printWriter);
+                printWriter.close();
+                charArrayWriter.close();
+
+                testsuite.add(newFailedTestcase(
+                        failedTest.test.getClass().getName(), failedTest.test.toString(), failedTest.duration,
+                        failedTest.assertionFailedError.getMessage(), charArrayWriter.toString()));
+            }
+        }
+
+        if (! _errorTests.isEmpty())
+        {
+            Iterator errorTestsIterator = _errorTests.iterator();
+            while (errorTestsIterator.hasNext())
+            {
+                ErrorTest errorTest = (ErrorTest) errorTestsIterator.next();
+                totalDuration += errorTest.duration;
+
+                CharArrayWriter charArrayWriter = new CharArrayWriter();
+                PrintWriter     printWriter     = new PrintWriter(charArrayWriter, true);
+                errorTest.throwable.printStackTrace(printWriter);
+                printWriter.close();
+                charArrayWriter.close();
+
+                System.out.println("charArrayWriter.toString()=" + charArrayWriter.toString());
+                testsuite.add(newErrorTestcase(
+                        errorTest.test.getClass().getName(), errorTest.test.toString(), errorTest.duration,
+                        errorTest.throwable.getMessage(), charArrayWriter.toString()));
+            }
+        }
+        testsuite.add(new DOMElement("system-out").addCDATA(""));
+        testsuite.add(new DOMElement("system-err").addCDATA(""));
+        // total time of all tests
+        testsuite.addAttribute("time", Float.toString(totalDuration / 1000f));
+
+        XMLWriter outputter = new XMLWriter(writer, OutputFormat.createPrettyPrint());
+        try {
+            outputter.write(testsuite);
+            outputter.close();
+        } catch (IOException e) {
+            throw new ServletException(e);
+        }
+    }
+
+    private DOMElement newPropertyDOMElement(String name)
+    {
+        return newPropertyDOMElement(name, null);
+    }
+
+    private DOMElement newPropertyDOMElement(String name, String value)
+    {
+        DOMElement property = new DOMElement("property");
+        property.addAttribute("name", name);
+        if (value != null)
+        {
+            property.addAttribute("value", value);
+        }
+        return property;
+    }
+
+    private DOMElement newTestcase(String classname, String name, long duration)
+    {
+        return newTestcase(classname, name, duration, null, null, null);
+    }
+
+    private DOMElement newFailedTestcase(String classname, String name, long duration, String failureMessage, String failureDetail)
+    {
+        return newTestcase(classname, name, duration, "junit.framework.AssertionFailedError", failureMessage, failureDetail);
+    }
+
+    private DOMElement newErrorTestcase(String classname, String name, long duration, String failureMessage, String failureDetail)
+    {
+        return newTestcase(classname, name, duration, "junit.framework.throwable", failureMessage, failureDetail);
+    }
+
+    private DOMElement newTestcase(String classname, String name, long duration, String failureMessage, String failureType, String failureDetail)
+    {
+        DOMElement testcase = new DOMElement("testcase");
+        testcase.addAttribute("classname", classname);
+        testcase.addAttribute("name", name);
+        testcase.addAttribute("time", Float.toString(duration / 1000f));    // converts from miliseconds to seconds
+        if (failureMessage != null)
+        {
+            DOMElement failure = new DOMElement("failure");
+            testcase.add(failure);
+            failure.addAttribute("message", failureMessage);
+            if (failureType != null)
+            {
+                failure.addAttribute("type", failureType);
+            }
+            if (failureDetail != null)
+            {
+                failure.addCDATA(failureDetail);
+            }
+        }
+        return testcase;
+    }
+
+}
\ No newline at end of file

Modified: labs/jbosstm/trunk/XTS/WSTX/tests/dd/wstx-tests_web-app.xml
===================================================================
--- labs/jbosstm/trunk/XTS/WSTX/tests/dd/wstx-tests_web-app.xml	2009-02-06 06:45:54 UTC (rev 25131)
+++ labs/jbosstm/trunk/XTS/WSTX/tests/dd/wstx-tests_web-app.xml	2009-02-06 10:57:07 UTC (rev 25132)
@@ -42,11 +42,26 @@
         <load-on-startup>4</load-on-startup>
     </servlet>
 
+    <servlet>
+        <servlet-name>JUnit Tests XML Servlet</servlet-name>
+        <servlet-class>com.arjuna.qa.junit.WSTXTestRunnerXMLServlet</servlet-class>
+        <init-param>
+            <param-name>TestSuiteClassName</param-name>
+            <param-value>com.arjuna.wst.tests.WSTXTestSuite</param-value>
+        </init-param>
+        <load-on-startup>4</load-on-startup>
+    </servlet>
+
 	<!-- servlet mappings -->
     <servlet-mapping>
         <servlet-name>JUnit Tests Servlet</servlet-name>
         <url-pattern>/index.html</url-pattern>
     </servlet-mapping>
+
+    <servlet-mapping>
+        <servlet-name>JUnit Tests XML Servlet</servlet-name>
+        <url-pattern>/index.xml</url-pattern>
+    </servlet-mapping>
     
     <welcome-file-list>
         <welcome-file>index.html</welcome-file>

Modified: labs/jbosstm/trunk/XTS/WSTX/tests/dd/wstx11-tests_web-app.xml
===================================================================
--- labs/jbosstm/trunk/XTS/WSTX/tests/dd/wstx11-tests_web-app.xml	2009-02-06 06:45:54 UTC (rev 25131)
+++ labs/jbosstm/trunk/XTS/WSTX/tests/dd/wstx11-tests_web-app.xml	2009-02-06 10:57:07 UTC (rev 25132)
@@ -42,11 +42,26 @@
         <load-on-startup>4</load-on-startup>
     </servlet>
 
+    <servlet>
+        <servlet-name>JUnit Tests XML Servlet</servlet-name>
+        <servlet-class>com.arjuna.qa.junit.WSTXTestRunnerXMLServlet</servlet-class>
+        <init-param>
+            <param-name>TestSuiteClassName</param-name>
+            <param-value>com.arjuna.wst11.tests.WSTX11TestSuite</param-value>
+        </init-param>
+        <load-on-startup>4</load-on-startup>
+    </servlet>
+
 	<!-- servlet mappings -->
     <servlet-mapping>
         <servlet-name>JUnit Tests Servlet</servlet-name>
         <url-pattern>/index.html</url-pattern>
     </servlet-mapping>
+
+    <servlet-mapping>
+        <servlet-name>JUnit Tests XML Servlet</servlet-name>
+        <url-pattern>/index.xml</url-pattern>
+    </servlet-mapping>
     
     <welcome-file-list>
         <welcome-file>index.html</welcome-file>

Added: labs/jbosstm/trunk/XTS/localjunit/build.xml
===================================================================
--- labs/jbosstm/trunk/XTS/localjunit/build.xml	                        (rev 0)
+++ labs/jbosstm/trunk/XTS/localjunit/build.xml	2009-02-06 10:57:07 UTC (rev 25132)
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project name="localjunit" default="all">
+
+	<property name="build.dir"               value="build"/>
+	<property name="build.dir.classes"       value="${build.dir}/classes"/>
+	<property name="src.dir"	         value="src"/>
+	<property name="reports.dir"	         value="reports"/>
+	<property name="javac.debug"             value="on"/>
+	<property name="javac.optimize"          value="off"/>
+
+	<path id="tests.classpath">
+		<pathelement location="ext/commons-httpclient.jar"/>
+		<pathelement location="ext/commons-logging.jar"/>
+		<pathelement location="ext/commons-codec.jar"/>
+		<pathelement location="../ext/junit.jar"/>
+	</path>
+
+	<target name="all" depends="init,jar">
+	</target>
+
+    <target name="clean">
+        <delete dir="${build.dir}"/>
+        <delete dir="${reports.dir}"/>
+    </target>
+
+    <target name="init" depends="clean,init-dir"/>
+
+    <target name="init-dir">
+        <mkdir dir="${build.dir}"/>
+        <mkdir dir="${build.dir.classes}"/>
+        <mkdir dir="${reports.dir}"/>
+    </target>
+
+	<target name="compile">
+		<javac destdir="${build.dir.classes}" debug="${javac.debug}" optimize="${javac.optimize}">
+			<classpath>
+				<path refid="tests.classpath" />
+			</classpath>
+			<src path="${src.dir}" />
+		</javac>
+	</target>
+
+	<target name="jar" depends="compile">
+		<jar jarfile="${build.dir}/localjunit.jar">
+			<fileset dir="${build.dir.classes}" />
+		</jar>
+	</target>
+
+</project>

Added: labs/jbosstm/trunk/XTS/localjunit/ext/commons-codec.jar
===================================================================
(Binary files differ)


Property changes on: labs/jbosstm/trunk/XTS/localjunit/ext/commons-codec.jar
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: labs/jbosstm/trunk/XTS/localjunit/ext/commons-httpclient.jar
===================================================================
(Binary files differ)


Property changes on: labs/jbosstm/trunk/XTS/localjunit/ext/commons-httpclient.jar
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: labs/jbosstm/trunk/XTS/localjunit/ext/commons-logging.jar
===================================================================
(Binary files differ)


Property changes on: labs/jbosstm/trunk/XTS/localjunit/ext/commons-logging.jar
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: labs/jbosstm/trunk/XTS/localjunit/run-tests.xml
===================================================================
--- labs/jbosstm/trunk/XTS/localjunit/run-tests.xml	                        (rev 0)
+++ labs/jbosstm/trunk/XTS/localjunit/run-tests.xml	2009-02-06 10:57:07 UTC (rev 25132)
@@ -0,0 +1,72 @@
+<!--
+  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 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) 2008,
+  @author JBoss Inc.
+-->
+
+<project name="Local JUnit Test for basic XTS testsuite" default="run" basedir=".">
+
+    <property environment="env"/>
+    <!--property name="server.hostname" value="${env.MYTESTIP_1}"/-->
+    <property name="server.hostname" value="localhost"/>
+    <property name="base.url" value="http://${server.hostname}:8080"/>
+    <property name="reports.dir" value="reports"/>
+
+    <path id="tests.classpath">
+        <pathelement location="build/localjunit.jar"/>
+        <pathelement location="ext/commons-httpclient.jar"/>
+        <pathelement location="ext/commons-logging.jar"/>
+        <pathelement location="ext/commons-codec.jar"/>
+        <pathelement location="../ext/junit.jar"/>
+    </path>
+
+
+    <target name="run">
+        <run-localjunit-test serverUrl="${base.url}/wsas-tests/index.xml" outfile="TEST-wsas-test.xml" />
+        <run-localjunit-test serverUrl="${base.url}/wscf-tests/index.xml" outfile="TEST-wscf-test.xml" />
+        <run-localjunit-test serverUrl="${base.url}/ws-c-tests/index.xml" outfile="TEST-ws-c-test.xml" />
+        <run-localjunit-test serverUrl="${base.url}/ws-c11-tests/index.xml" outfile="TEST-ws-c11-test.xml" />
+        <run-localjunit-test serverUrl="${base.url}/ws-t-tests/index.xml" outfile="TEST-ws-t-test.xml" />
+        <run-localjunit-test serverUrl="${base.url}/ws-t11-tests/index.xml" outfile="TEST-ws-t11-test.xml" />
+        <run-localjunit-test serverUrl="${base.url}/wstx-tests/index.xml" outfile="TEST-wstx-test.xml" />
+    </target>
+
+    
+    <macrodef name="run-localjunit-test">
+        <attribute name="serverUrl" />
+        <attribute name="outfile" />
+        <sequential>
+            <junit printsummary="yes" haltonfailure="yes" fork="true" dir="." maxmemory="256m" showoutput="yes">
+                <classpath>
+                    <path refid="tests.classpath"/>
+                </classpath>
+
+                <formatter type="xml"/>
+
+                <sysproperty key="serverUrl" value="@{serverUrl}" />
+                <sysproperty key="outfile" value="${reports.dir}/@{outfile}" />
+
+                <test name="com.arjuna.qa.junit.LocalJUnitRunner" />
+
+                <!--jvmarg value="-Xdebug"/>
+                <jvmarg value="-Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=5005"/-->
+            </junit>
+        </sequential>
+     </macrodef>
+
+</project>

Added: labs/jbosstm/trunk/XTS/localjunit/src/com/arjuna/qa/junit/HttpUtils.java
===================================================================
--- labs/jbosstm/trunk/XTS/localjunit/src/com/arjuna/qa/junit/HttpUtils.java	                        (rev 0)
+++ labs/jbosstm/trunk/XTS/localjunit/src/com/arjuna/qa/junit/HttpUtils.java	2009-02-06 10:57:07 UTC (rev 25132)
@@ -0,0 +1,162 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2006, 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 com.arjuna.qa.junit;
+
+import org.apache.commons.httpclient.Header;
+import org.apache.commons.httpclient.HttpClient;
+import org.apache.commons.httpclient.HttpMethodBase;
+import org.apache.commons.httpclient.UsernamePasswordCredentials;
+import org.apache.commons.httpclient.methods.DeleteMethod;
+import org.apache.commons.httpclient.methods.GetMethod;
+import org.apache.commons.httpclient.methods.HeadMethod;
+import org.apache.commons.httpclient.methods.OptionsMethod;
+import org.apache.commons.httpclient.methods.PostMethod;
+import org.apache.commons.httpclient.methods.PutMethod;
+import org.apache.commons.httpclient.methods.TraceMethod;
+
+import java.io.IOException;
+import java.net.HttpURLConnection;
+import java.net.URL;
+
+/** Utilities for client http requests
+ *
+ * @author Scott.Stark at jboss.org
+ * @version $Revision: 82338 $
+ */
+public class HttpUtils
+{
+//   private static Logger log = Logger.getLogger(HttpUtils.class);
+
+   public static final int GET = 1;
+   public static final int POST = 2;
+   public static final int HEAD = 3;
+   public static final int OPTIONS = 4;
+   public static final int PUT = 5;
+   public static final int DELETE = 6;
+   public static final int TRACE = 7;
+
+   /** Perform a get on the indicated URL and assert an HTTP_OK response code
+    *
+    * @param url
+    * @return The commons HttpClient used to perform the get
+    * @throws Exception on any failure
+    */
+   public static HttpMethodBase accessURL(URL url) throws Exception
+   {
+      return accessURL(url, null, HttpURLConnection.HTTP_OK);
+   }
+   /** Perform a get on the indicated URL and assert that the response code
+    * matches the expectedHttpCode argument.
+    *
+    * @param url
+    * @param expectedHttpCode the http response code expected
+    * @return The commons HttpClient used to perform the get
+    * @throws Exception on any failure
+    */
+   public static HttpMethodBase accessURL(URL url, String realm,
+      int expectedHttpCode)
+      throws Exception
+   {
+      return accessURL(url, realm, expectedHttpCode, null);
+   }
+   public static HttpMethodBase accessURL(URL url, String realm,
+      int expectedHttpCode, int type)
+      throws Exception
+   {
+      return accessURL(url, realm, expectedHttpCode, null, type);
+   }
+   public static HttpMethodBase accessURL(URL url, String realm,
+      int expectedHttpCode, Header[] hdrs)
+      throws Exception
+   {
+      return accessURL(url, realm, expectedHttpCode, hdrs, GET);
+   }
+   public static HttpMethodBase accessURL(URL url, String realm,
+      int expectedHttpCode, Header[] hdrs, int type)
+      throws Exception
+   {
+      HttpClient httpConn = new HttpClient();
+      HttpMethodBase request = createMethod(url, type);
+
+      int hdrCount = hdrs != null ? hdrs.length : 0;
+      for(int n = 0; n < hdrCount; n ++)
+         request.addRequestHeader(hdrs[n]);
+      try
+      {
+         System.err.println("Connecting to: "+url);
+         String userInfo = url.getUserInfo();
+
+         if( userInfo != null )
+         {
+            UsernamePasswordCredentials auth = new UsernamePasswordCredentials(userInfo);
+            httpConn.getState().setCredentials(realm, url.getHost(), auth);
+         }
+         System.err.println("RequestURI: "+request.getURI());
+         int responseCode = httpConn.executeMethod(request);
+         String response = request.getStatusText();
+         System.err.println("responseCode="+responseCode+", response="+response);
+         String content = request.getResponseBodyAsString();
+         System.err.println(content);
+         // Validate that we are seeing the requested response code
+         if( responseCode != expectedHttpCode )
+         {
+            throw new IOException("Expected reply code:"+expectedHttpCode
+               +", actual="+responseCode);
+         }
+      }
+      catch(IOException e)
+      {
+         throw e;
+      }
+      return request;
+   }
+
+   public static HttpMethodBase createMethod(URL url, int type)
+   {
+      HttpMethodBase request = null;
+      switch( type )
+      {
+         case GET:
+            request = new GetMethod(url.toString());
+            break;
+         case POST:
+            request = new PostMethod(url.toString());
+            break;
+         case HEAD:
+            request = new HeadMethod(url.toString());
+            break;
+         case OPTIONS:
+            request = new OptionsMethod(url.toString());
+            break;
+         case PUT:
+            request = new PutMethod(url.toString());
+            break;
+         case DELETE:
+            request = new DeleteMethod(url.toString());
+            break;
+         case TRACE:
+            request = new TraceMethod(url.toString());
+            break;
+      }
+      return request;
+   }
+}

Added: labs/jbosstm/trunk/XTS/localjunit/src/com/arjuna/qa/junit/LocalJUnitRunner.java
===================================================================
--- labs/jbosstm/trunk/XTS/localjunit/src/com/arjuna/qa/junit/LocalJUnitRunner.java	                        (rev 0)
+++ labs/jbosstm/trunk/XTS/localjunit/src/com/arjuna/qa/junit/LocalJUnitRunner.java	2009-02-06 10:57:07 UTC (rev 25132)
@@ -0,0 +1,82 @@
+package com.arjuna.qa.junit;
+
+import junit.framework.TestCase;
+import org.apache.commons.httpclient.HttpMethodBase;
+import org.apache.commons.httpclient.Header;
+
+import java.net.HttpURLConnection;
+import java.net.URL;
+import java.io.FileWriter;
+import java.io.BufferedWriter;
+
+/**
+ * Created by IntelliJ IDEA.
+ * User: studensky
+ * Date: 30.1.2009
+ * Time: 14:09:23
+ * To change this template use File | Settings | File Templates.
+ */
+public class LocalJUnitRunner extends TestCase
+{
+    private String serverUrl    = null;
+    private String outfile      = null;
+
+    protected void setUp() throws Exception
+    {
+        serverUrl   = System.getProperty("serverUrl");
+        outfile     = System.getProperty("outfile");
+        System.err.println("serverUrl=" + serverUrl);
+        System.err.println("outfile=" + outfile);
+    }
+
+    public void testCallServlet()
+    {
+        boolean result = true;
+        try
+        {
+            // run tests by calling a servlet
+            Header runParam = new Header("run", "run");
+            HttpMethodBase request = HttpUtils.accessURL(
+                    new URL(serverUrl), null,
+                    HttpURLConnection.HTTP_OK,
+                    new Header[] {runParam},
+                    HttpUtils.POST);
+
+            String response = null;
+            int index = 0;
+            do
+            {
+                System.err.println("_____________ " +( index++) + "th round");
+                // we have to give some time to the tests to finish
+                Thread.sleep(10000);     // 10 secs
+
+                // tries to get results
+                request = HttpUtils.accessURL(
+                        new URL(serverUrl), null,
+                        HttpURLConnection.HTTP_OK,
+                        HttpUtils.GET);
+
+                response = request.getResponseBodyAsString();
+            }
+            while (response != null && response.indexOf("finished") == -1);
+
+            System.err.println("======================================================");
+            System.err.println("====================   RESULT    =====================");
+            System.err.println("======================================================");
+            System.err.println(response);
+
+            // writes response to the outfile
+            BufferedWriter writer = new BufferedWriter(new FileWriter(outfile));
+            writer.write(response);
+            writer.close();
+        }
+        catch (Exception e)
+        {
+            e.printStackTrace();
+            result = false;
+        }
+        
+        assertTrue(result);
+    }
+    
+}




More information about the jboss-svn-commits mailing list