package com.yahoo.dtf.results;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintStream;
import java.net.URI;
import java.text.ParseException;
import java.util.Date;
import java.util.Iterator;
import java.util.Set;
import java.util.Map.Entry;
import com.yahoo.dtf.DTFProperties;
import com.yahoo.dtf.actions.Action;
import com.yahoo.dtf.exception.ResultsException;
import com.yahoo.dtf.exception.StorageException;
import com.yahoo.dtf.util.TimeUtil;
public class JUnitResults extends ResultsBase {
private URI _uri = null;
private PrintStream _xml = null;
public JUnitResults(URI uri, boolean savelogs) {
super(uri, true);
_uri = uri;
}
public URI getURI() { return _uri; }
public void start() throws ResultsException {
try {
OutputStream os = Action.getStorageFactory().getOutputStream(_uri);
_xml = new PrintStream(os);
} catch (StorageException e) {
throw new ResultsException("Unable to open output file.",e);
}
}
public void stop() throws ResultsException {
_xml.close();
/*
* now lets beautify the resulting XML.
*/
}
private void startTestSuite(Result result, PrintStream ps) throws ResultsException {
ps.print("<testsuite");
ps.print(" name=\"dtf." + result.getName() + "\"");
ps.print(" classname=\"dtf." + result.getName() + "\"");
ps.print(" tests=\"" + result.getTotalTests() + "\"");
try {
ps.print(" start=\"" + TimeUtil.dateStampToDateStamp(result.getStart()) + "\"");
ps.print(" stop=\"" + TimeUtil.dateStampToDateStamp(result.getStop()) + "\"");
} catch (ParseException e) {
throw new ResultsException("Error handling date.",e);
}
ps.print(" time=\"" + result.getDurationInSeconds() + "\"");
ps.print(" timestamp=\"" + new Date(result.getStart()) + "\"");
ps.print(" passed=\"" + result.getNumPassed() + "\"");
ps.print(" failures=\"" + result.getNumFailed() + "\"");
ps.print(" errors=\"" + result.getNumFailed() + "\"");
ps.println(" disabled=\"" + result.getNumSkipped() + "\">");
}
private void printProperties(Result result, PrintStream ps) {
Set<Entry<Object,Object>> entries = result.getProperties().entrySet();
for (Entry<Object,Object> entry : entries) {
ps.println("<property name=\"" + entry.getKey() +
"\" value=\"" + entry.getValue() + "\" />");
}
}
public void recordResult(Result result) throws ResultsException {
if ( result.isTestSuite() ) {
startTestSuite(result, _xml);
printProperties(result, _xml);
printResultNode(result,_xml);
Iterator results = result.getResults().iterator();
while (results.hasNext()) {
recordResult((Result)results.next());
}
String testlogfile = (String)
result.getProperties().get(DTFProperties.DTF_TESTCASE_LOG);
File log = null;
if (testlogfile != null && (log = new File(testlogfile)).exists()) {
_xml.println("<system-out><![CDATA[");
try {
FileInputStream fis = new FileInputStream(log);
InputStreamReader isr = new InputStreamReader(fis);
BufferedReader br = new BufferedReader(isr);
try {
String line = null;
while ( (line = br.readLine()) != null )
_xml.println(line);
} finally {
br.close();
}
} catch (FileNotFoundException e) {
throw new ResultsException("Unable to read log file.",e);
} catch (IOException e) {
throw new ResultsException("Error reading log file.",e);
}
_xml.println("]]></system-out>");
} else {
_xml.println("<system-out/>");
}
_xml.println("<system-err/>");
_xml.println("</testsuite>");
} else if (result.isTestCase()) {
/*
* Test case output should look like this:
*
* <testcase name="testAdd"
* time="0.018"/>
*/
_xml.print("<testcase name=\"" + result.getName() + "\"");
try {
_xml.print(" start=\"" +
TimeUtil.dateStampToDateStamp(result.getStart())
+ "\"");
_xml.print(" stop=\"" +
TimeUtil.dateStampToDateStamp(result.getStop())
+ "\"");
} catch (ParseException e) {
throw new ResultsException("Error handling date.",e);
}
_xml.println(" time=\"" + result.getDurationInSeconds() + "\">");
printProperties(result,_xml);
printResultNode(result,_xml);
_xml.println("</testcase>");
}
}
private void printResultNode(Result result, PrintStream ps) {
if (result.isFailResult()) {
ps.print("<failure>");
if (result.getOutput() != null)
ps.print(result.getOutput());
ps.println("</failure>");
}
}
}