/* * JBoss, Home of Professional Open Source * Copyright 2007, 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.jboss.transaction.txinterop.test; 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.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import java.io.CharArrayWriter; import java.io.IOException; import java.io.PrintWriter; import java.util.Date; import java.util.Iterator; import java.util.List; /** * Formats test results to the JUnit XML format. * @author <a href="mailto:istudens@redhat.com">Ivo Studensky</a> * @version $Revision$ */ public class XMLResultsServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doStatus(request, response); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doStatus(request, response); } public void doStatus(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/xml"); response.setHeader("Cache-Control", "no-cache"); HttpSession session = request.getSession(); final FullTestResult testResult = (FullTestResult) session.getAttribute(TestConstants.ATTRIBUTE_TEST_RESULT); DOMDocument report = new DOMDocument(); DOMElement testsuite = new DOMElement("testsuite"); report.setRootElement(testsuite); if (testResult == null) { // No JUnit test results generated. } else { List passedTests = testResult.getPassedTests(); List failedTests = testResult.getFailedTests(); List errorTests = testResult.getErrorTests(); final int runCount = testResult.runCount() ; final int errorCount = testResult.errorCount() ; final int failureCount = testResult.failureCount() ; testsuite.addAttribute("name", "com.jboss.transaction.txinterop.interop.InteropTestSuite"); testsuite.addAttribute("errors", Integer.toString(errorCount)); testsuite.addAttribute("failures", Integer.toString(failureCount)); testsuite.addAttribute("hostname", request.getServerName()); testsuite.addAttribute("tests", Integer.toString(runCount)); testsuite.addAttribute("timestamp", new Date().toString()); DOMElement properties = new DOMElement("properties"); testsuite.add(properties); DOMElement status = newPropertyDOMElement("status"); properties.add(status); status.addAttribute("value", "finished"); long totalDuration = 0; if (! passedTests.isEmpty()) { Iterator passedTestsIterator = passedTests.iterator(); while (passedTestsIterator.hasNext()) { FullTestResult.PassedTest passedTest = (FullTestResult.PassedTest) passedTestsIterator.next(); totalDuration += passedTest.duration; final String name = passedTest.test.toString(); final String description = (String)TestConstants.DESCRIPTIONS.get(name) ; testsuite.add(newTestcase( passedTest.test.getClass().getName(), name + ": " + description, passedTest.duration)); } } if (! failedTests.isEmpty()) { Iterator failedTestsIterator = failedTests.iterator(); while (failedTestsIterator.hasNext()) { FullTestResult.FailedTest failedTest = (FullTestResult.FailedTest) failedTestsIterator.next(); totalDuration += failedTest.duration; final String name = failedTest.test.toString(); final String description = (String)TestConstants.DESCRIPTIONS.get(name) ; 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(), name + ": " + description, failedTest.duration, failedTest.assertionFailedError.getMessage(), charArrayWriter.toString())); } } if (! errorTests.isEmpty()) { Iterator errorTestsIterator = errorTests.iterator(); while (errorTestsIterator.hasNext()) { FullTestResult.ErrorTest errorTest = (FullTestResult.ErrorTest) errorTestsIterator.next(); totalDuration += errorTest.duration; final String name = errorTest.test.toString(); final String description = (String)TestConstants.DESCRIPTIONS.get(name) ; 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(), name + ": " + description, errorTest.duration, errorTest.throwable.getMessage(), charArrayWriter.toString())); } } // total time of all tests testsuite.addAttribute("time", Float.toString(totalDuration / 1000f)); } String logContent = null; final String logName = (String)session.getAttribute(TestConstants.ATTRIBUTE_LOG_NAME) ; if (logName != null) { try { logContent = TestLogController.readLog(logName) ; } catch (final Throwable th) { log("Error reading log file", th) ; } } testsuite.add(new DOMElement("system-out").addCDATA((logContent != null) ? logContent : "")); testsuite.add(new DOMElement("system-err").addCDATA("")); XMLWriter outputter = new XMLWriter(response.getWriter(), 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; } }