package hudson.plugins.sctmexecutor;
import hudson.FilePath;
import java.io.IOException;
import java.io.OutputStream;
import java.text.DateFormat;
import java.text.MessageFormat;
import java.util.Date;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.xml.stream.FactoryConfigurationError;
import javax.xml.stream.XMLOutputFactory;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamWriter;
import com.borland.sctm.ws.execution.entities.ExecutionResult;
import com.borland.sctm.ws.execution.entities.TestDefinitionResult;
final class StdXMLResultWriter implements ITestResultWriter {
private static final int NOT_EXECUTED = 3;
private static final int FAILED = 2;
private static final String DEFAULT_SCTM_PACKAGENAME = "silkcentral.testmanager."; //$NON-NLS-1$
private static final Logger LOGGER = Logger.getLogger("hudson.plugins.sctmexecutor"); //$NON-NLS-1$
private String sctmHost;
private FilePath rootDir;
private String buildNumber;
private boolean ignoreSetupCleanup;
public StdXMLResultWriter(FilePath rootDir, String serviceURL, String buildNumber, boolean ignoreSetupCleanup) {
this.rootDir = rootDir;
this.buildNumber = buildNumber;
this.sctmHost = serviceURL.substring(0, serviceURL.indexOf("/", "http://".length())) + "/silk/DEF"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
this.ignoreSetupCleanup = ignoreSetupCleanup;
}
public void write(ExecutionResult result) {
int done = 3;
String resultFileName = MessageFormat.format("TEST-{0}-{1}.xml",result.getExecDefName(), buildNumber); //$NON-NLS-1$
while (done > 0) {
try {
FilePath resultFile = rootDir.child(resultFileName); //$NON-NLS-1$
OutputStream fos = resultFile.write();
XMLStreamWriter writer = XMLOutputFactory.newInstance().createXMLStreamWriter(fos);
writer.writeStartDocument();
writeTestSuite(writer, result);
writer.writeEndDocument();
fos.close();
done = 0;
} catch (IOException e) {
resultFileName = resultFileName + "[" + DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT).format(new Date(System.currentTimeMillis())) //$NON-NLS-1$
+ "]"; //$NON-NLS-1$
if (--done <= 0)
LOGGER.log(Level.SEVERE, "Cannot write result file."); //$NON-NLS-1$
} catch (InterruptedException e) {
LOGGER.log(Level.SEVERE, e.getMessage());
done = 0;
} catch (XMLStreamException e) {
LOGGER.log(Level.SEVERE, e.getMessage());
done = 0;
} catch (FactoryConfigurationError e) {
LOGGER.log(Level.SEVERE, e.getMessage());
done = 0;
}
}
}
private void writeTestSuite(XMLStreamWriter writer, ExecutionResult result) throws XMLStreamException {
String execDefName = DEFAULT_SCTM_PACKAGENAME + result.getExecDefName();
writer.writeStartElement("testsuite"); //$NON-NLS-1$
writeTestSuiteCountAttributes(writer, result);
writer.writeAttribute("hostname", result.getExecServerName()); //$NON-NLS-1$
writer.writeAttribute("name", execDefName); //$NON-NLS-1$
writer.writeAttribute("timestamp", DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT).format( //$NON-NLS-1$
new Date(System.currentTimeMillis())));
if (!this.ignoreSetupCleanup) {
TestDefinitionResult setupTestDef = result.getSetupTestDef();
TestDefinitionResult cleanupTestDef = result.getCleanupTestDef();
if (setupTestDef != null)
writeTestResult(writer, setupTestDef, execDefName);
if (cleanupTestDef != null)
writeTestResult(writer, cleanupTestDef, execDefName);
}
for (TestDefinitionResult testResult : result.getTestDefResult()) {
writeTestResult(writer, testResult, execDefName);
}
writer.writeEndElement();
}
private void writeTestSuiteCountAttributes(XMLStreamWriter writer, ExecutionResult result) throws XMLStreamException {
int errors = 0;
int failures = 0;
double duration = 0;
for (TestDefinitionResult testResult : result.getTestDefResult()) {
if (testResult.getStatus() == FAILED)
failures++;
else if (testResult.getStatus() == NOT_EXECUTED)
errors++;
duration += testResult.getDuration() / 1000;
}
TestDefinitionResult setupTestDef = result.getSetupTestDef();
TestDefinitionResult cleanupTestDef = result.getCleanupTestDef();
if (setupTestDef != null) {
if (setupTestDef.getStatus() == FAILED)
failures++;
else if (setupTestDef.getStatus() == NOT_EXECUTED)
errors++;
duration += setupTestDef.getDuration() / 1000;
}
if (cleanupTestDef != null) {
if (cleanupTestDef.getStatus() == FAILED)
failures++;
else if (cleanupTestDef.getStatus() == NOT_EXECUTED)
errors++;
duration += cleanupTestDef.getDuration() / 1000;
}
writer.writeAttribute("tests", String.valueOf(countTest(result))); //$NON-NLS-1$
writer.writeAttribute("errors", String.valueOf(errors)); //$NON-NLS-1$
writer.writeAttribute("failures", String.valueOf(failures)); //$NON-NLS-1$
writer.writeAttribute("time", String.valueOf(duration)); //$NON-NLS-1$
}
private int countTest(ExecutionResult result) {
int testCount = result.getTestDefResult().length;
if (result.getSetupTestDef() != null)
testCount++;
if (result.getCleanupTestDef() != null)
testCount++;
return testCount;
}
private void writeTestResult(XMLStreamWriter writer, TestDefinitionResult testResult, String testsuiteName) throws XMLStreamException {
writer.writeStartElement("testcase"); //$NON-NLS-1$
writer.writeAttribute("classname", testsuiteName); //$NON-NLS-1$
writer.writeAttribute("name", testResult.getName()); //$NON-NLS-1$
writer.writeAttribute("time", String.valueOf(testResult.getDuration() / 1000)); //$NON-NLS-1$
if (testResult.getStatus() == FAILED)
writeFailure(writer, testResult.getResultURL());
else if (testResult.getStatus() == NOT_EXECUTED)
writeError(writer, testResult.getResultURL());
writer.writeEndElement();
}
private void writeError(XMLStreamWriter writer, String resultURL) throws XMLStreamException {
writer.writeStartElement("error"); //$NON-NLS-1$
writer.writeAttribute("message", MessageFormat.format("{0}{1}", sctmHost, resultURL)); //$NON-NLS-1$ //$NON-NLS-2$
writer.writeAttribute("type", "SCTMError"); //$NON-NLS-1$ //$NON-NLS-2$
writer.writeEndElement();
}
private void writeFailure(XMLStreamWriter writer, String resultURL) throws XMLStreamException {
writer.writeStartElement("failure"); //$NON-NLS-1$
writer.writeAttribute("message", MessageFormat.format("{0}{1}", sctmHost, resultURL)); //$NON-NLS-1$ //$NON-NLS-2$
writer.writeAttribute("type", Messages.getString("StdXMLResultWriter.testresult.failure")); //$NON-NLS-1$ //$NON-NLS-2$
writer.writeEndElement();
}
}