/*
* Copyright 2012 the original author or authors.
*
* Licensed 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.
*/
package org.gradle.api.internal.tasks.testing.junit.result;
import org.apache.tools.ant.util.DateUtils;
import org.gradle.internal.xml.SimpleXmlWriter;
import org.gradle.api.tasks.testing.TestOutputEvent;
import org.gradle.api.tasks.testing.TestResult;
import org.gradle.internal.UncheckedException;
import java.io.IOException;
import java.io.OutputStream;
public class JUnitXmlResultWriter {
private final String hostName;
private final TestResultsProvider testResultsProvider;
private final TestOutputAssociation outputAssociation;
public JUnitXmlResultWriter(String hostName, TestResultsProvider testResultsProvider, TestOutputAssociation outputAssociation) {
this.hostName = hostName;
this.testResultsProvider = testResultsProvider;
this.outputAssociation = outputAssociation;
}
/**
* @param output The destination, unbuffered
*/
public void write(TestClassResult result, OutputStream output) {
String className = result.getClassName();
long classId = result.getId();
try {
SimpleXmlWriter writer = new SimpleXmlWriter(output, " ");
writer.startElement("testsuite")
.attribute("name", className)
.attribute("tests", String.valueOf(result.getTestsCount()))
.attribute("skipped", String.valueOf(result.getSkippedCount()))
.attribute("failures", String.valueOf(result.getFailuresCount()))
.attribute("errors", "0")
.attribute("timestamp", DateUtils.format(result.getStartTime(), DateUtils.ISO8601_DATETIME_PATTERN))
.attribute("hostname", hostName)
.attribute("time", String.valueOf(result.getDuration() / 1000.0));
writer.startElement("properties");
writer.endElement();
writeTests(writer, result.getResults(), className, classId);
writer.startElement("system-out");
writeOutputs(writer, classId, outputAssociation.equals(TestOutputAssociation.WITH_SUITE), TestOutputEvent.Destination.StdOut);
writer.endElement();
writer.startElement("system-err");
writeOutputs(writer, classId, outputAssociation.equals(TestOutputAssociation.WITH_SUITE), TestOutputEvent.Destination.StdErr);
writer.endElement();
writer.endElement();
} catch (IOException e) {
throw UncheckedException.throwAsUncheckedException(e);
}
}
private void writeOutputs(SimpleXmlWriter writer, long classId, boolean allClassOutput, TestOutputEvent.Destination destination) throws IOException {
writer.startCDATA();
if (allClassOutput) {
testResultsProvider.writeAllOutput(classId, destination, writer);
} else {
testResultsProvider.writeNonTestOutput(classId, destination, writer);
}
writer.endCDATA();
}
private void writeOutputs(SimpleXmlWriter writer, long classId, long testId, TestOutputEvent.Destination destination) throws IOException {
writer.startCDATA();
testResultsProvider.writeTestOutput(classId, testId, destination, writer);
writer.endCDATA();
}
private void writeTests(SimpleXmlWriter writer, Iterable<TestMethodResult> methodResults, String className, long classId) throws IOException {
for (TestMethodResult methodResult : methodResults) {
writer.startElement("testcase")
.attribute("name", methodResult.getName())
.attribute("classname", className)
.attribute("time", String.valueOf(methodResult.getDuration() / 1000.0));
if (methodResult.getResultType() == TestResult.ResultType.SKIPPED) {
writer.startElement("skipped");
writer.endElement();
} else {
for (TestFailure failure : methodResult.getFailures()) {
writer.startElement("failure")
.attribute("message", failure.getMessage())
.attribute("type", failure.getExceptionType());
writer.characters(failure.getStackTrace());
writer.endElement();
}
}
if (outputAssociation.equals(TestOutputAssociation.WITH_TESTCASE)) {
writer.startElement("system-out");
writeOutputs(writer, classId, methodResult.getId(), TestOutputEvent.Destination.StdOut);
writer.endElement();
writer.startElement("system-err");
writeOutputs(writer, classId, methodResult.getId(), TestOutputEvent.Destination.StdErr);
writer.endElement();
}
writer.endElement();
}
}
}