Android Open Source - masa Android Xml Reporter






From Project

Back to project page masa.

License

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.

Java Source Code

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>&lt;junit&gt;</code></a> and
 * <a href="http://ant.apache.org/manual/Tasks/junitreport.html"><code>&lt;junitreport&gt;</code></a> tasks,
 * then supported by many tools like CI servers.
 * <p/>
 * <pre>&lt;?xml version="1.0" encoding="UTF-8"?>
 * &lt;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>">
 *  &lt;properties>
 *    &lt;property name="<i>name</i>" value="<i>value</i>"/>
 *    [...]
 *  &lt;/properties>
 *  &lt;testcase time="<i>0,###.###</i>" name="<i>test name</i> [classname="<i>class name</i>"] [group="<i>group</i>"]"/>
 *  &lt;testcase time="<i>0,###.###</i>" name="<i>test name</i> [classname="<i>class name</i>"] [group="<i>group</i>"]">
 *    &lt;<b>error</b> message="<i>message</i>" type="<i>exception class name</i>"><i>stacktrace</i>&lt;/error>
 *    &lt;system-out><i>system out content (present only if not empty)</i>&lt;/system-out>
 *    &lt;system-err><i>system err content (present only if not empty)</i>&lt;/system-err>
 *  &lt;/testcase>
 *  &lt;testcase time="<i>0,###.###</i>" name="<i>test name</i> [classname="<i>class name</i>"] [group="<i>group</i>"]">
 *    &lt;<b>failure</b> message="<i>message</i>" type="<i>exception class name</i>"><i>stacktrace</i>&lt;/failure>
 *    &lt;system-out><i>system out content (present only if not empty)</i>&lt;/system-out>
 *    &lt;system-err><i>system err content (present only if not empty)</i>&lt;/system-err>
 *  &lt;/testcase>
 *  &lt;testcase time="<i>0,###.###</i>" name="<i>test name</i> [classname="<i>class name</i>"] [group="<i>group</i>"]">
 *    &lt;<b>skipped</b>/>
 *  &lt;/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();
  }

}




Java Source Code List

org.apache.maven.plugin.surefire.report.AndroidReportConfiguration.java
org.apache.maven.plugin.surefire.report.AndroidXmlReporter.java
org.apache.maven.surefire.android.TestRunnerCoreProvider.java
org.apache.maven.surefire.android.reporting.AndroidReportEntry.java
org.jvending.masa.ApkInstaller.java
org.jvending.masa.ApplicationRequirements.java
org.jvending.masa.CommandExecutor.java
org.jvending.masa.ExecutionException.java
org.jvending.masa.MasaUtil.java
org.jvending.masa.ddmlib.AdbConnector.java
org.jvending.masa.ddmlib.ConnectionException.java
org.jvending.masa.plugin.aapt.AaptCompilerMojo.java
org.jvending.masa.plugin.aapt.AaptPackagerMojo.java
org.jvending.masa.plugin.aapt.LibraryPackagerMojo.java
org.jvending.masa.plugin.aapt.LibraryResourceProcessorMojo.java
org.jvending.masa.plugin.adb.DeviceInstallerMojo.java
org.jvending.masa.plugin.adb.DevicePullerMojo.java
org.jvending.masa.plugin.adb.DevicePusherMojo.java
org.jvending.masa.plugin.aidl.AidlGeneratorMojo.java
org.jvending.masa.plugin.apkbuilder.ApkBuilderMojo.java
org.jvending.masa.plugin.apkbuilder.ApkVerifierMojo.java
org.jvending.masa.plugin.apkbuilder.KeystoreInfo.java
org.jvending.masa.plugin.apkbuilder.NativeLibraries.java
org.jvending.masa.plugin.apkbuilder.PrivateKeyInfo.java
org.jvending.masa.plugin.apkbuilder.X509Cert.java
org.jvending.masa.plugin.dx.DxMojo.java
org.jvending.masa.plugin.jarsigner.JarSignerMojo.java
org.jvending.masa.plugin.lint.LintMojo.java
org.jvending.masa.plugin.localization.CopyResourcesMojo.java
org.jvending.masa.plugin.platformtest.ApkInstallerMojo.java
org.jvending.masa.plugin.platformtest.PlatformTesterMojo.java
org.jvending.masa.plugin.proguard.ProguardMojo.java
org.jvending.masa.plugin.zipalign.ZipAlignMojo.java
org.jvending.masa.plugins.toolchains.Capability.java
org.jvending.masa.plugins.toolchains.Matcher.java
org.jvending.masa.plugins.toolchains.ToolchainMojo.java
org.jvending.masa.plugins.toolchains.Toolchains.java
org.maven.reslinks.plugin.ResourceLinkerMojo.java
${package}.App.java