package org.tmatesoft.svn.core.test; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStreamWriter; import java.io.Writer; import java.text.DecimalFormat; import java.text.NumberFormat; import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Properties; import org.tmatesoft.svn.core.SVNException; import org.tmatesoft.svn.core.internal.util.SVNXMLUtil; import org.tmatesoft.svn.core.internal.wc.SVNFileUtil; public class JUnitTestLogger extends AbstractTestLogger { private static NumberFormat ourTestNumberFormat = new DecimalFormat("000"); private File myResultDirectory; private int myFailuresCount; private int myTestsCount; private long myLastTime; private long mySuiteTime; private List<TestInfo> myTests; private boolean myIsLogAll; private String mySuiteName; public JUnitTestLogger(File resultDirectory) { this(resultDirectory, false); } public JUnitTestLogger(File resultDirectory, boolean logAll) { myResultDirectory = resultDirectory; myIsLogAll = logAll; } @Override public void startTests(Properties configuration) throws IOException { } @Override public void startServer(String name, String url) { } @Override public void startSuite(String suiteName) { mySuiteName = suiteName; myLastTime = System.currentTimeMillis(); mySuiteTime = myLastTime; myTests = new LinkedList<TestInfo>(); myTestsCount = 0; myFailuresCount = 0; } @Override public void handleTest(TestResult test) { TestInfo info = new TestInfo(); info.name = ourTestNumberFormat.format(test.getID()) + " [" + test.getName() + " ]"; info.time = System.currentTimeMillis() - myLastTime; info.isFailed = !test.isPass(); if (!test.isPass() && test.getOutput() != null) { info.output = test.getOutput().toString(); } if (myIsLogAll) { myResultDirectory.mkdirs(); File testLog = new File(myResultDirectory, mySuiteName + "." + test.getID() + ".log"); try { SVNFileUtil.writeToFile(testLog, test.getOutput().toString(), "UTF-8"); } catch (SVNException e) { } } if (!test.isPass()) { myFailuresCount++; } myTestsCount++; myLastTime = System.currentTimeMillis(); myTests.add(info); } @Override public void endSuite(String suiteName) { Map<String, String> suiteAttributes = new HashMap<String, String>(); suiteAttributes.put("errors", "0"); suiteAttributes.put("failures", Integer.toString(myFailuresCount)); suiteAttributes.put("tests", Integer.toString(myTestsCount)); suiteAttributes.put("time", getTimeString(System.currentTimeMillis() - mySuiteTime)); suiteAttributes.put("name", suiteName); StringBuffer xml = new StringBuffer(); xml = SVNXMLUtil.addXMLHeader(xml); xml = SVNXMLUtil.openXMLTag(null, "testsuite", SVNXMLUtil.XML_STYLE_NORMAL, suiteAttributes, xml); if (myTests != null) { int index = 0; for (TestInfo test : myTests) { index++; Map<String, String> testAttributes = new HashMap<String, String>(); testAttributes.put("classname", suiteName); testAttributes.put("name", test.name); testAttributes.put("time", getTimeString(test.time)); xml = SVNXMLUtil.openXMLTag(null, "testcase", !test.isFailed ? (SVNXMLUtil.XML_STYLE_SELF_CLOSING | SVNXMLUtil.XML_STYLE_PROTECT_CDATA): SVNXMLUtil.XML_STYLE_NORMAL, testAttributes, xml); if (test.isFailed) { Map<String, String> failureAttributes = new HashMap<String, String>(); failureAttributes.put("type", "org.tmatesoft.test.python"); if (test.output != null) { xml = SVNXMLUtil.openCDataTag(null, "failure", test.output, failureAttributes, xml); } else { xml = SVNXMLUtil.openXMLTag(null, "failure", SVNXMLUtil.XML_STYLE_SELF_CLOSING, failureAttributes, xml); } xml = SVNXMLUtil.closeXMLTag(null, "testcase", xml, true); } } } xml = SVNXMLUtil.closeXMLTag(null, "testsuite", xml); Writer writer = openSuiteFile(suiteName); if (writer != null) { try { writer.write(xml.toString()); } catch (IOException e) { } finally { try { writer.close(); } catch (IOException e) { } } } } private String getTimeString(long l) { String str = Long.toString(l); if (str.length() > 3) { return str.substring(0, str.length() - 3) + "." + str.substring(str.length() - 3, str.length()); } else { return "0." + str; } } @Override public void endServer(String name, String url) { } @Override public void endTests(Properties configuration) { } private Writer openSuiteFile(String suiteName) { myResultDirectory.mkdirs(); File file = new File(myResultDirectory, getSuiteFileName(suiteName)); Writer w = null; try { w = new OutputStreamWriter(new BufferedOutputStream(new FileOutputStream(file)), "UTF-8"); } catch (IOException e) { e.printStackTrace(); } return w; } private String getSuiteFileName(String suiteName) { return "TEST-" + suiteName + ".xml"; } private static class TestInfo { public String output; String name; long time; boolean isFailed; } }