Updated Branches: refs/heads/master f7db177c9 -> 06415dee0
o Replaced Xpp3Dom with XmlWriter. First steps toward no memory bindings in xml Project: http://git-wip-us.apache.org/repos/asf/maven-surefire/repo Commit: http://git-wip-us.apache.org/repos/asf/maven-surefire/commit/06415dee Tree: http://git-wip-us.apache.org/repos/asf/maven-surefire/tree/06415dee Diff: http://git-wip-us.apache.org/repos/asf/maven-surefire/diff/06415dee Branch: refs/heads/master Commit: 06415dee0ab1b98523ee0b237066c5aeebac9352 Parents: f7db177 Author: Kristian Rosenvold <krosenv...@apache.org> Authored: Wed Jan 2 16:14:35 2013 +0100 Committer: Kristian Rosenvold <krosenv...@apache.org> Committed: Wed Jan 2 16:14:35 2013 +0100 ---------------------------------------------------------------------- .../surefire/report/StatelessXmlReporter.java | 156 ++++---- .../surefire/report/StatelessXmlReporter2.java | 304 --------------- .../surefire/report/StatelessXMLReporterTest.java | 4 +- 3 files changed, 79 insertions(+), 385 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/06415dee/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/report/StatelessXmlReporter.java ---------------------------------------------------------------------- diff --git a/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/report/StatelessXmlReporter.java b/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/report/StatelessXmlReporter.java index 680a21d..57778bb 100644 --- a/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/report/StatelessXmlReporter.java +++ b/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/report/StatelessXmlReporter.java @@ -19,19 +19,14 @@ package org.apache.maven.plugin.surefire.report; * under the License. */ -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.io.FileWriter; +import java.io.IOException; import java.util.Enumeration; import java.util.Properties; import java.util.StringTokenizer; import org.apache.maven.shared.utils.io.IOUtil; -import org.apache.maven.shared.utils.xml.Xpp3Dom; -import org.apache.maven.shared.utils.xml.Xpp3DomWriter; +import org.apache.maven.shared.utils.xml.XMLWriter; import org.apache.maven.surefire.report.ReportEntry; import org.apache.maven.surefire.report.ReporterException; import org.apache.maven.surefire.report.SafeThrowable; @@ -64,7 +59,6 @@ import org.apache.maven.surefire.report.SafeThrowable; * </testcase> * [...]</pre> * - * @author <a href="mailto:jr...@exist.com">Johnny R. Ruiz III</a> * @author Kristian Rosenvold * @see <a href="http://wiki.apache.org/ant/Proposals/EnhancedTestReports">Ant's format enhancement proposal</a> * (not yet implemented by Ant 1.8.2) @@ -90,61 +84,61 @@ public class StatelessXmlReporter throws ReporterException { - Xpp3Dom testSuite = createTestSuiteElement( testSetReportEntry, testSetStats, reportNameSuffix ); + FileWriter fw = getFileOutputStream( testSetReportEntry ); - showProperties( testSuite ); + org.apache.maven.shared.utils.xml.XMLWriter ppw = + new org.apache.maven.shared.utils.xml.PrettyPrintXMLWriter( fw ); + ppw.setEncoding( "UTF-8" ); - testSuite.setAttribute( "tests", String.valueOf( testSetStats.getCompletedCount() ) ); + createTestSuiteElement( ppw, testSetReportEntry, testSetStats, reportNameSuffix ); - testSuite.setAttribute( "errors", String.valueOf( testSetStats.getErrors() ) ); + showProperties( ppw ); - testSuite.setAttribute( "skipped", String.valueOf( testSetStats.getSkipped() ) ); - - testSuite.setAttribute( "failures", String.valueOf( testSetStats.getFailures() ) ); for ( WrappedReportEntry entry : testSetStats.getReportEntries() ) { if ( ReportEntryType.success.equals( entry.getReportEntryType() ) ) { - testSuite.addChild( createTestElement( entry, reportNameSuffix ) ); + startTestElement( ppw, entry, reportNameSuffix ); + ppw.endElement(); } else { - testSuite.addChild( getTestProblems( entry, trimStackTrace, reportNameSuffix ) ); + getTestProblems( ppw, entry, trimStackTrace, reportNameSuffix ); } } - File reportFile = getReportFile( testSetReportEntry, reportsDirectory, reportNameSuffix ); + ppw.endElement(); // TestSuite - 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( new PrettyPrintXMLWriter( writer ), testSuite ); } - catch ( UnsupportedEncodingException e ) + finally { - throw new ReporterException( "Unable to use UTF-8 encoding", e ); + IOUtil.close( fw ); } - catch ( FileNotFoundException e ) + } + + private FileWriter getFileOutputStream( WrappedReportEntry testSetReportEntry ) + { + File reportFile = getReportFile( testSetReportEntry, reportsDirectory, reportNameSuffix ); + + File reportDir = reportFile.getParentFile(); + + //noinspection ResultOfMethodCallIgnored + reportDir.mkdirs(); + + try { - throw new ReporterException( "Unable to create file: " + e.getMessage(), e ); + return new FileWriter( reportFile ); } - - finally + catch ( IOException e ) { - IOUtil.close( writer ); + throw new ReporterException( "When writing report", e ); } } @@ -164,57 +158,65 @@ public class StatelessXmlReporter return reportFile; } - private static Xpp3Dom createTestElement( WrappedReportEntry report, String reportNameSuffix ) + private static void startTestElement( XMLWriter ppw, WrappedReportEntry report, String reportNameSuffix ) { - Xpp3Dom testCase = new Xpp3Dom( "testcase" ); - testCase.setAttribute( "name", report.getReportName() ); + ppw.startElement( "testcase" ); + ppw.addAttribute( "name", report.getReportName() ); if ( report.getGroup() != null ) { - testCase.setAttribute( "group", report.getGroup() ); + ppw.addAttribute( "group", report.getGroup() ); } if ( report.getSourceName() != null ) { if ( reportNameSuffix != null && reportNameSuffix.length() > 0 ) { - testCase.setAttribute( "classname", report.getSourceName() + "(" + reportNameSuffix + ")" ); + ppw.addAttribute( "classname", report.getSourceName() + "(" + reportNameSuffix + ")" ); } else { - testCase.setAttribute( "classname", report.getSourceName() ); + ppw.addAttribute( "classname", report.getSourceName() ); } } - testCase.setAttribute( "time", report.elapsedTimeAsString() ); - return testCase; + ppw.addAttribute( "time", report.elapsedTimeAsString() ); } - private static Xpp3Dom createTestSuiteElement( WrappedReportEntry report, TestSetStats testSetStats, - String reportNameSuffix1 ) + private static void createTestSuiteElement( XMLWriter ppw, WrappedReportEntry report, TestSetStats testSetStats, + String reportNameSuffix1 ) { - Xpp3Dom testCase = new Xpp3Dom( "testsuite" ); + ppw.startElement( "testsuite" ); - testCase.setAttribute( "name", report.getReportName( reportNameSuffix1 ) ); + ppw.addAttribute( "name", report.getReportName( reportNameSuffix1 ) ); if ( report.getGroup() != null ) { - testCase.setAttribute( "group", report.getGroup() ); + ppw.addAttribute( "group", report.getGroup() ); } - testCase.setAttribute( "time", testSetStats.getElapsedForTestSet() ); - return testCase; + + ppw.addAttribute( "time", testSetStats.getElapsedForTestSet() ); + + ppw.addAttribute( "tests", String.valueOf( testSetStats.getCompletedCount() ) ); + + ppw.addAttribute( "errors", String.valueOf( testSetStats.getErrors() ) ); + + ppw.addAttribute( "skipped", String.valueOf( testSetStats.getSkipped() ) ); + + ppw.addAttribute( "failures", String.valueOf( testSetStats.getFailures() ) ); + } - private Xpp3Dom getTestProblems( WrappedReportEntry report, boolean trimStackTrace, String reportNameSuffix ) + private void getTestProblems( XMLWriter ppw, WrappedReportEntry report, boolean trimStackTrace, String reportNameSuffix ) { - Xpp3Dom testCase = createTestElement( report, reportNameSuffix ); + startTestElement( ppw, report, reportNameSuffix ); - Xpp3Dom element = createElement( testCase, report.getReportEntryType().name() ); + ppw.startElement( report.getReportEntryType().name() ); String stackTrace = report.getStackTrace( trimStackTrace ); if ( report.getMessage() != null && report.getMessage().length() > 0 ) { - element.setAttribute( "message", report.getMessage() ); + ppw.addAttribute( "message", report.getMessage() ); } if ( report.getStackTraceWriter() != null ) @@ -225,55 +227,50 @@ public class StatelessXmlReporter { if ( t.getMessage() != null ) { - element.setAttribute( "type", ( stackTrace.contains( ":" ) + ppw.addAttribute( "type", ( stackTrace.contains( ":" ) ? stackTrace.substring( 0, stackTrace.indexOf( ":" ) ) : stackTrace ) ); } else { - element.setAttribute( "type", new StringTokenizer( stackTrace ).nextToken() ); + ppw.addAttribute( "type", new StringTokenizer( stackTrace ).nextToken() ); } } } if ( stackTrace != null ) { - element.setValue( stackTrace ); + ppw.writeText( stackTrace ); } - addOutputStreamElement( report.getStdout(), "system-out", testCase ); + ppw.endElement(); // entry type + + addOutputStreamElement( ppw, report.getStdout(), "system-out" ); - addOutputStreamElement( report.getStdErr(), "system-err", testCase ); + addOutputStreamElement( ppw, report.getStdErr(), "system-err" ); - return testCase; + ppw.endElement(); // test element } - private void addOutputStreamElement( String stdOut, String name, Xpp3Dom testCase ) + private void addOutputStreamElement( XMLWriter xmlWriter, String stdOut, String name ) { if ( stdOut != null && stdOut.trim().length() > 0 ) { - createElement( testCase, name ).setValue( stdOut ); + xmlWriter.startElement( name ); + xmlWriter.writeText( stdOut ); + xmlWriter.endElement(); } } - 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 + * @param xmlWriter The test suite to report to */ - private void showProperties( Xpp3Dom testSuite ) + private void showProperties( XMLWriter xmlWriter ) { - Xpp3Dom properties = createElement( testSuite, "properties" ); + xmlWriter.startElement( "properties" ); Properties systemProperties = System.getProperties(); @@ -292,13 +289,16 @@ public class StatelessXmlReporter value = "null"; } - Xpp3Dom property = createElement( properties, "property" ); + xmlWriter.startElement( "property" ); + + xmlWriter.addAttribute( "name", key ); - property.setAttribute( "name", key ); + xmlWriter.addAttribute( "value", value ); - property.setAttribute( "value", value ); + xmlWriter.endElement(); } } + xmlWriter.endElement(); } } http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/06415dee/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/report/StatelessXmlReporter2.java ---------------------------------------------------------------------- diff --git a/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/report/StatelessXmlReporter2.java b/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/report/StatelessXmlReporter2.java deleted file mode 100644 index 05ebe2f..0000000 --- a/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/report/StatelessXmlReporter2.java +++ /dev/null @@ -1,304 +0,0 @@ -package org.apache.maven.plugin.surefire.report; - -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -import java.io.File; -import java.io.FileWriter; -import java.io.IOException; -import java.util.Enumeration; -import java.util.Properties; -import java.util.StringTokenizer; -import org.apache.maven.shared.utils.io.IOUtil; -import org.apache.maven.shared.utils.xml.XMLWriter; -import org.apache.maven.surefire.report.ReportEntry; -import org.apache.maven.surefire.report.ReporterException; -import org.apache.maven.surefire.report.SafeThrowable; - -/** - * 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:jr...@exist.com">Johnny R. Ruiz III</a> - * @author Kristian Rosenvold - * @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 StatelessXmlReporter2 -{ - private static final String LS = System.getProperty( "line.separator" ); - - private final File reportsDirectory; - - private final String reportNameSuffix; - - private final boolean trimStackTrace; - - public StatelessXmlReporter2( File reportsDirectory, String reportNameSuffix, boolean trimStackTrace ) - { - this.reportsDirectory = reportsDirectory; - this.reportNameSuffix = reportNameSuffix; - this.trimStackTrace = trimStackTrace; - } - - public void testSetCompleted( WrappedReportEntry testSetReportEntry, TestSetStats testSetStats ) - throws ReporterException - { - - FileWriter fw = getFileOutputStream( testSetReportEntry ); - - org.apache.maven.shared.utils.xml.XMLWriter ppw = - new org.apache.maven.shared.utils.xml.PrettyPrintXMLWriter( fw ); - ppw.setEncoding( "UTF-8" ); - - createTestSuiteElement( ppw, testSetReportEntry, testSetStats, reportNameSuffix ); - - showProperties( ppw ); - - - for ( WrappedReportEntry entry : testSetStats.getReportEntries() ) - { - if ( ReportEntryType.success.equals( entry.getReportEntryType() ) ) - { - startTestElement( ppw, entry, reportNameSuffix ); - ppw.endElement(); - } - else - { - getTestProblems( ppw, entry, trimStackTrace, reportNameSuffix ); - } - - } - - ppw.endElement(); // TestSuite - - - - try - { - - } - finally - { - IOUtil.close( fw ); - } - } - - private FileWriter getFileOutputStream( WrappedReportEntry testSetReportEntry ) - { - File reportFile = getReportFile( testSetReportEntry, reportsDirectory, reportNameSuffix ); - - File reportDir = reportFile.getParentFile(); - - //noinspection ResultOfMethodCallIgnored - reportDir.mkdirs(); - - try - { - return new FileWriter( reportFile ); - } - catch ( IOException e ) - { - throw new ReporterException( "When writing report", e ); - } - } - - private File getReportFile( ReportEntry report, File reportsDirectory, String reportNameSuffix ) - { - 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; - } - - private static void startTestElement( XMLWriter ppw, WrappedReportEntry report, String reportNameSuffix ) - { - ppw.startElement( "testcase" ); - ppw.addAttribute( "name", report.getReportName() ); - if ( report.getGroup() != null ) - { - ppw.addAttribute( "group", report.getGroup() ); - } - if ( report.getSourceName() != null ) - { - if ( reportNameSuffix != null && reportNameSuffix.length() > 0 ) - { - ppw.addAttribute( "classname", report.getSourceName() + "(" + reportNameSuffix + ")" ); - } - else - { - ppw.addAttribute( "classname", report.getSourceName() ); - } - } - ppw.addAttribute( "time", report.elapsedTimeAsString() ); - } - - private static void createTestSuiteElement( XMLWriter ppw, WrappedReportEntry report, TestSetStats testSetStats, - String reportNameSuffix1 ) - { - ppw.startElement( "testsuite" ); - - ppw.addAttribute( "name", report.getReportName( reportNameSuffix1 ) ); - - if ( report.getGroup() != null ) - { - ppw.addAttribute( "group", report.getGroup() ); - } - - ppw.addAttribute( "time", testSetStats.getElapsedForTestSet() ); - - ppw.addAttribute( "tests", String.valueOf( testSetStats.getCompletedCount() ) ); - - ppw.addAttribute( "errors", String.valueOf( testSetStats.getErrors() ) ); - - ppw.addAttribute( "skipped", String.valueOf( testSetStats.getSkipped() ) ); - - ppw.addAttribute( "failures", String.valueOf( testSetStats.getFailures() ) ); - - } - - - private void getTestProblems( XMLWriter ppw, WrappedReportEntry report, boolean trimStackTrace, String reportNameSuffix ) - { - - startTestElement( ppw, report, reportNameSuffix ); - - ppw.startElement( report.getReportEntryType().name() ); - - String stackTrace = report.getStackTrace( trimStackTrace ); - - if ( report.getMessage() != null && report.getMessage().length() > 0 ) - { - ppw.addAttribute( "message", report.getMessage() ); - } - - if ( report.getStackTraceWriter() != null ) - { - //noinspection ThrowableResultOfMethodCallIgnored - SafeThrowable t = report.getStackTraceWriter().getThrowable(); - if ( t != null ) - { - if ( t.getMessage() != null ) - { - ppw.addAttribute( "type", ( stackTrace.contains( ":" ) - ? stackTrace.substring( 0, stackTrace.indexOf( ":" ) ) - : stackTrace ) ); - } - else - { - ppw.addAttribute( "type", new StringTokenizer( stackTrace ).nextToken() ); - } - } - } - - if ( stackTrace != null ) - { - ppw.writeText( stackTrace ); - } - - addOutputStreamElement( ppw, report.getStdout(), "system-out" ); - - addOutputStreamElement( ppw, report.getStdErr(), "system-err" ); - - ppw.endElement(); // entry type - ppw.endElement(); // test element - } - - private void addOutputStreamElement( XMLWriter xmlWriter, String stdOut, String name ) - { - if ( stdOut != null && stdOut.trim().length() > 0 ) - { - xmlWriter.startElement( name ); - xmlWriter.writeText( stdOut ); - xmlWriter.endElement(); - } - } - - /** - * Adds system properties to the XML report. - * <p/> - * - * @param xmlWriter The test suite to report to - */ - private void showProperties( XMLWriter xmlWriter ) - { - xmlWriter.startElement( "properties" ); - - Properties systemProperties = System.getProperties(); - - if ( systemProperties != null ) - { - Enumeration<?> propertyKeys = systemProperties.propertyNames(); - - while ( propertyKeys.hasMoreElements() ) - { - String key = (String) propertyKeys.nextElement(); - - String value = systemProperties.getProperty( key ); - - if ( value == null ) - { - value = "null"; - } - - xmlWriter.startElement( "property" ); - - xmlWriter.addAttribute( "name", key ); - - xmlWriter.addAttribute( "value", value ); - - xmlWriter.endElement(); - - } - } - xmlWriter.endElement(); - } -} http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/06415dee/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/report/StatelessXMLReporterTest.java ---------------------------------------------------------------------- diff --git a/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/report/StatelessXMLReporterTest.java b/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/report/StatelessXMLReporterTest.java index 3bf5da8..ae312ee 100644 --- a/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/report/StatelessXMLReporterTest.java +++ b/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/report/StatelessXMLReporterTest.java @@ -34,6 +34,7 @@ import org.apache.maven.surefire.report.StackTraceWriter; import junit.framework.AssertionFailedError; import junit.framework.TestCase; +@SuppressWarnings( "ResultOfMethodCallIgnored" ) public class StatelessXMLReporterTest extends TestCase { @@ -42,15 +43,12 @@ public class StatelessXMLReporterTest private ReportEntry reportEntry; - private String message; - private TestSetStats stats; protected void setUp() throws Exception { super.setUp(); - message = "junit.framework.AssertionFailedError"; reportEntry = new SimpleReportEntry( this.getClass().getName(), "StatelessXMLReporterTest", new LegacyPojoStackTraceWriter( "", "", new AssertionFailedError() ), 17 ); stats = new TestSetStats( false, true );