blob: ea6e18ffd7400155cbaa65807ff6c363bc9db22c [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2010, 2011 Tasktop Technologies and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Tasktop Technologies - initial API and implementation
*******************************************************************************/
package org.eclipse.mylyn.builds.internal.core.util;
import org.eclipse.mylyn.builds.core.ITestCase;
import org.eclipse.mylyn.builds.core.ITestResult;
import org.eclipse.mylyn.builds.core.ITestSuite;
import org.eclipse.mylyn.builds.core.TestCaseResult;
import org.xml.sax.ContentHandler;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.AttributesImpl;
/**
* @author Steffen Pingel
*/
public class JUnitResultGenerator {
private static final String CLASS_NAME = "classname"; //$NON-NLS-1$
private static final String ERROR = "error"; //$NON-NLS-1$
private static final String ERRORS = "errors"; //$NON-NLS-1$
private static final String FAILURE = "failure"; //$NON-NLS-1$
private static final String FAILURES = "failures"; //$NON-NLS-1$
private static final String IGNORED = "ignored"; //$NON-NLS-1$
private static final String MESSAGE = "message"; //$NON-NLS-1$
private static final String NAME = "name"; //$NON-NLS-1$
private static final String PROJECT = "project"; //$NON-NLS-1$
private static final String SKIPPED = "skipped"; //$NON-NLS-1$
private static final String STARTED = "started"; //$NON-NLS-1$
private static final String TESTCASE = "testcase"; //$NON-NLS-1$
private static final String TESTRUN = "testrun"; //$NON-NLS-1$
private static final String TESTS = "tests"; //$NON-NLS-1$
private static final String TESTSUITE = "testsuite"; //$NON-NLS-1$
private static final String TIME = "time"; //$NON-NLS-1$
private final ITestResult result;
/**
* True, if ignored test cases should be included (supported by Eclipse 3.6 and later).
*/
private boolean includeIgnored;
public JUnitResultGenerator(ITestResult result) {
this.result = result;
}
public boolean includeIgnored() {
return includeIgnored;
}
public void setIncludeIgnored(boolean includeIgnored) {
this.includeIgnored = includeIgnored;
}
public void write(ContentHandler handler) throws SAXException {
AttributesImpl attributes = new AttributesImpl();
handler.startDocument();
attributes.clear();
attributes.addAttribute(null, null, NAME, null, result.getBuild().getLabel());
attributes.addAttribute(null, null, PROJECT, null, result.getBuild().getLabel());
attributes.addAttribute(null, null, TESTS, null,
Integer.toString(result.getFailCount() + result.getPassCount()));
attributes.addAttribute(null, null, STARTED, null,
Integer.toString(result.getFailCount() + result.getPassCount()));
attributes.addAttribute(null, null, FAILURES, null, Integer.toString(result.getFailCount()));
attributes.addAttribute(null, null, ERRORS, null, Integer.toString(result.getErrorCount()));
attributes.addAttribute(null, null, IGNORED, null, Integer.toString(result.getIgnoredCount()));
handler.startElement(null, null, TESTRUN, attributes);
for (ITestSuite testsuite : result.getSuites()) {
attributes.clear();
attributes.addAttribute(null, null, NAME, null, testsuite.getLabel());
attributes.addAttribute(null, null, TIME, null, Double.toString(testsuite.getDuration() / 1000.0d));
handler.startElement(null, null, TESTSUITE, attributes);
// group tests by class name
String childSuite = null;
for (ITestCase test : testsuite.getCases()) {
// only use group if tests are not already grouped
if (test.getClassName() != null && !test.getClassName().equals(testsuite.getLabel())) {
if (childSuite == null) {
attributes.clear();
attributes.addAttribute(null, null, NAME, null, test.getClassName());
handler.startElement(null, null, TESTSUITE, attributes);
} else if (!childSuite.equals(test.getClassName())) {
handler.endElement(null, null, TESTSUITE);
attributes.clear();
attributes.addAttribute(null, null, NAME, null, test.getClassName());
handler.startElement(null, null, TESTSUITE, attributes);
}
childSuite = test.getClassName();
}
if (!test.isSkipped() || includeIgnored()) {
attributes.clear();
attributes.addAttribute(null, null, NAME, null, test.getLabel());
attributes.addAttribute(null, null, CLASS_NAME, null, test.getClassName());
attributes.addAttribute(null, null, TIME, null, Double.toString(test.getDuration() / 1000.0d));
handler.startElement(null, null, TESTCASE, attributes);
if (test.getStatus() == TestCaseResult.FAILED || test.getStatus() == TestCaseResult.REGRESSION) {
attributes.clear();
//attributes.addAttribute(null, TYPE, TYPE, null, test.getFailureType());
attributes.addAttribute(null, null, MESSAGE, null, test.getMessage());
String element = (test.getMessage() != null) ? FAILURE : ERROR;
handler.startElement(null, null, element, attributes);
if (test.getStackTrace() != null) {
char[] charArray = test.getStackTrace().toCharArray();
handler.characters(charArray, 0, charArray.length);
}
handler.endElement(null, null, element);
}
if (test.isSkipped()) {
attributes.clear();
handler.startElement(null, null, SKIPPED, attributes);
handler.endElement(null, null, SKIPPED);
}
handler.endElement(null, null, TESTCASE);
}
}
if (childSuite != null) {
handler.endElement(null, null, TESTSUITE);
}
handler.endElement(null, null, TESTSUITE);
}
handler.endElement(null, null, TESTRUN);
handler.endDocument();
}
}