Back to project page masa.
The source code is released under:
Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUC...
If you think the Android project masa listed in this page is inappropriate, such as containing malicious code/tools or violating the copyright, please email info at java2s dot com, thanks.
package org.apache.maven.plugin.surefire.report; //from ww w . ja va2s . c o m import java.io.BufferedWriter; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.io.UnsupportedEncodingException; import java.util.ArrayList; import java.util.Collections; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.StringTokenizer; import org.apache.maven.plugin.surefire.report.PrettyPrintXMLWriter; import org.apache.maven.surefire.report.DescriptionDecoder; import org.apache.maven.surefire.report.ReportEntry; import org.apache.maven.surefire.report.ReporterException; import org.apache.maven.surefire.report.SafeThrowable; import org.codehaus.plexus.util.IOUtil; import org.codehaus.plexus.util.xml.XMLWriter; import org.codehaus.plexus.util.xml.Xpp3Dom; import org.codehaus.plexus.util.xml.Xpp3DomWriter; import com.android.ddmlib.IDevice; /** * XML format reporter writing to <code>TEST-<i>reportName</i>[-<i>suffix</i>].xml</code> file like written and read * by Ant's <a href="http://ant.apache.org/manual/Tasks/junit.html"><code><junit></code></a> and * <a href="http://ant.apache.org/manual/Tasks/junitreport.html"><code><junitreport></code></a> tasks, * then supported by many tools like CI servers. * <p/> * <pre><?xml version="1.0" encoding="UTF-8"?> * <testsuite name="<i>suite name</i>" [group="<i>group</i>"] tests="<i>0</i>" failures="<i>0</i>" errors="<i>0</i>" skipped="<i>0</i>" time="<i>0,###.###</i>"> * <properties> * <property name="<i>name</i>" value="<i>value</i>"/> * [...] * </properties> * <testcase time="<i>0,###.###</i>" name="<i>test name</i> [classname="<i>class name</i>"] [group="<i>group</i>"]"/> * <testcase time="<i>0,###.###</i>" name="<i>test name</i> [classname="<i>class name</i>"] [group="<i>group</i>"]"> * <<b>error</b> message="<i>message</i>" type="<i>exception class name</i>"><i>stacktrace</i></error> * <system-out><i>system out content (present only if not empty)</i></system-out> * <system-err><i>system err content (present only if not empty)</i></system-err> * </testcase> * <testcase time="<i>0,###.###</i>" name="<i>test name</i> [classname="<i>class name</i>"] [group="<i>group</i>"]"> * <<b>failure</b> message="<i>message</i>" type="<i>exception class name</i>"><i>stacktrace</i></failure> * <system-out><i>system out content (present only if not empty)</i></system-out> * <system-err><i>system err content (present only if not empty)</i></system-err> * </testcase> * <testcase time="<i>0,###.###</i>" name="<i>test name</i> [classname="<i>class name</i>"] [group="<i>group</i>"]"> * <<b>skipped</b>/> * </testcase> * [...]</pre> * * @author <a href="mailto:jruiz@exist.com">Johnny R. Ruiz III</a> * @version $Id: XMLReporter.java 1237087 2012-01-28 16:22:34Z krosenvold $ * @see <a href="http://wiki.apache.org/ant/Proposals/EnhancedTestReports">Ant's format enhancement proposal</a> * (not yet implemented by Ant 1.8.2) */ public class AndroidXmlReporter extends XMLReporter { private static final String LS = System.getProperty("line.separator"); private final File reportsDirectory; private final boolean deleteOnStarting; private final String reportNameSuffix; private final List<Xpp3Dom> results = Collections .synchronizedList(new ArrayList<Xpp3Dom>()); private static final DescriptionDecoder decoder = new DescriptionDecoder(); private int elapsed = 0; private IDevice device; public AndroidXmlReporter(boolean trimStackTrace, File reportsDirectory, IDevice device) { this(trimStackTrace, reportsDirectory, null, device); } public AndroidXmlReporter(boolean trimStackTrace, File reportsDirectory, String reportNameSuffix, IDevice device) { super(trimStackTrace, reportsDirectory, reportNameSuffix); this.reportsDirectory = reportsDirectory; this.deleteOnStarting = false; this.reportNameSuffix = reportNameSuffix; this.device = device; } public void writeMessage(String message) { } public void writeMessage(byte[] b, int off, int len) { } public void testSetStarting(ReportEntry report) throws ReporterException { super.testSetStarting(report); if (deleteOnStarting) { final File reportFile = getReportFile(report); deleteIfExisting(reportFile); } } public void testSetCompleted(ReportEntry report) throws ReporterException { super.testSetCompleted(report); long runTime = elapsed > 0 ? elapsed : (System.currentTimeMillis() - testSetStartTime); Xpp3Dom testSuite = createTestSuiteElement(report, runTime); showProperties(testSuite); //TODO: // testSuite.setAttribute("tests", String.valueOf(this.getNumTests())); // testSuite.setAttribute("errors", String.valueOf(this.getNumErrors())); // testSuite.setAttribute("skipped", String.valueOf(this.getNumSkipped())); // testSuite.setAttribute("failures", // String.valueOf(this.getNumFailures())); for (Object result : results) { Xpp3Dom testcase = (Xpp3Dom) result; testSuite.addChild(testcase); } File reportFile = getReportFile(report); File reportDir = reportFile.getParentFile(); // noinspection ResultOfMethodCallIgnored reportDir.mkdirs(); PrintWriter writer = null; try { writer = new PrintWriter(new BufferedWriter(new OutputStreamWriter( new FileOutputStream(reportFile), "UTF-8"))); writer.write("<?xml version=\"1.0\" encoding=\"UTF-8\" ?>" + LS); Xpp3DomWriter.write(writer, testSuite); //Xpp3DomWriter.write((XMLWriter) new PrettyPrintXMLWriter(writer), testSuite); } catch (UnsupportedEncodingException e) { throw new ReporterException("Unable to use UTF-8 encoding", e); } catch (FileNotFoundException e) { throw new ReporterException("Unable to create file: " + e.getMessage(), e); } finally { IOUtil.close(writer); } } private File getReportFile(ReportEntry report) { File reportFile; if (reportNameSuffix != null && reportNameSuffix.length() > 0) { reportFile = new File(reportsDirectory, "TEST-" + report.getName() + "-" + reportNameSuffix + ".xml"); } else { reportFile = new File(reportsDirectory, "TEST-" + report.getName() + ".xml"); } return reportFile; } public void testSucceeded(ReportEntry report) { super.testSucceeded(report); //TODO long runTime = 0;//getActualRunTime(report); Xpp3Dom testCase = createTestElement(report, runTime); results.add(testCase); } private Xpp3Dom createTestElement(ReportEntry report, long runTime) { elapsed += report.getElapsed(); Xpp3Dom testCase = new Xpp3Dom("testcase"); testCase.setAttribute("name", decoder.getReportName(report)); if (report.getGroup() != null) { testCase.setAttribute("group", report.getGroup()); } if (report.getSourceName() != null) { if (reportNameSuffix != null && reportNameSuffix.length() > 0) { testCase.setAttribute("classname", report.getSourceName() + "(" + reportNameSuffix + ")"); } else { testCase.setAttribute("classname", report.getSourceName()); } } testCase.setAttribute("time", "0");//TODO: //testCase.setAttribute("time", elapsedTimeAsString(runTime)); return testCase; } private Xpp3Dom createTestSuiteElement(ReportEntry report, long runTime) { Xpp3Dom testCase = new Xpp3Dom("testsuite"); if (reportNameSuffix != null && reportNameSuffix.length() > 0) { testCase.setAttribute("name", decoder.getReportName(report) + "(" + reportNameSuffix + ")"); } else { testCase.setAttribute("name", decoder.getReportName(report)); } if (report.getGroup() != null) { testCase.setAttribute("group", report.getGroup()); } //TODO: // testCase.setAttribute("time", elapsedTimeAsString(runTime)); return testCase; } public void testError(ReportEntry report, String stdOut, String stdErr) { super.testError(report, stdOut, stdErr); writeTestProblems(report, stdOut, stdErr, "error"); } public void testFailed(ReportEntry report, String stdOut, String stdErr) { super.testFailed(report, stdOut, stdErr); writeTestProblems(report, stdOut, stdErr, "failure"); } public void testSkipped(ReportEntry report) { super.testSkipped(report); writeTestProblems(report, null, null, "skipped"); } private void writeTestProblems(ReportEntry report, String stdOut, String stdErr, String name) { long runTime = 0;;//TODO: getActualRunTime(report); Xpp3Dom testCase = createTestElement(report, runTime); Xpp3Dom element = createElement(testCase, name); //TODO: String stackTrace = "";//getStackTrace(report); if (report.getMessage() != null && report.getMessage().length() > 0) { element.setAttribute("message", report.getMessage()); } if (report.getStackTraceWriter() != null) { // noinspection ThrowableResultOfMethodCallIgnored SafeThrowable t = report.getStackTraceWriter().getThrowable(); if (t != null) { if (t.getMessage() != null) { element.setAttribute( "type", (stackTrace.contains(":") ? stackTrace.substring(0, stackTrace.indexOf(":")) : stackTrace)); } else { element.setAttribute("type", new StringTokenizer(stackTrace).nextToken()); } } } if (stackTrace != null) { element.setValue(stackTrace); } addOutputStreamElement(stdOut, "system-out", testCase); addOutputStreamElement(stdErr, "system-err", testCase); results.add(testCase); } private void addOutputStreamElement(String stdOut, String name, Xpp3Dom testCase) { if (stdOut != null && stdOut.trim().length() > 0) { createElement(testCase, name).setValue(stdOut); } } private Xpp3Dom createElement(Xpp3Dom element, String name) { Xpp3Dom component = new Xpp3Dom(name); element.addChild(component); return component; } /** * Adds system properties to the XML report. * <p/> * * @param testSuite * The test suite to report to */ private void showProperties(Xpp3Dom testSuite) { Xpp3Dom properties = createElement(testSuite, "properties"); //FileReporterFactory Map<String, String> systemProperties = device.getProperties(); if (systemProperties != null) { for(Map.Entry<String, String> entry : systemProperties.entrySet()) { String key = entry.getKey(); String value = entry.getValue(); if (value == null) { value = "null"; } Xpp3Dom property = createElement(properties, "property"); property.setAttribute("name", key); property.setAttribute("value", value); } } } public Iterator getResults() { return results.iterator(); } public void reset() { results.clear(); elapsed = 0; super.reset(); } }