package aQute.junit; import static java.nio.charset.StandardCharsets.UTF_8; import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.lang.reflect.Method; import java.net.ConnectException; import java.net.InetAddress; import java.net.Socket; import java.util.List; import org.osgi.framework.Bundle; import org.osgi.framework.BundleContext; import junit.framework.AssertionFailedError; import junit.framework.JUnit4TestAdapter; import junit.framework.Test; import junit.framework.TestSuite; public class JUnitEclipseReport implements TestReporter { BufferedReader in; PrintWriter out; long startTime; Bundle targetBundle; List<Test> tests; boolean verbose = false; Test current; public JUnitEclipseReport(int port) throws Exception { Socket socket = null; ConnectException e = null; for (int i = 0; socket == null && i < 30; i++) { try { socket = new Socket(InetAddress.getByName(null), port); } catch (ConnectException ce) { e = ce; Thread.sleep(i * 100); } } if (socket == null) { System.err.println("Cannot open the JUnit Port: " + port + " " + e); System.exit(-2); return; } in = new BufferedReader(new InputStreamReader(socket.getInputStream(), UTF_8)); out = new PrintWriter(new OutputStreamWriter(socket.getOutputStream(), UTF_8)); } public void setup(Bundle fw, Bundle targetBundle) { this.targetBundle = targetBundle; } public void begin(List<Test> tests, int realcount) { this.tests = tests; message("%TESTC ", realcount + " v2"); report(tests); startTime = System.currentTimeMillis(); } public void end() { message("%RUNTIME", "" + (System.currentTimeMillis() - startTime)); out.flush(); out.close(); } public void addError(Test test, Throwable t) { message("%ERROR ", test); trace(t); } public void addFailure(Test test, AssertionFailedError t) { message("%FAILED ", test); trace(t); } void trace(Throwable t) { message("%TRACES ", ""); t.printStackTrace(out); out.println(); message("%TRACEE ", ""); } public void endTest(Test test) { message("%TESTE ", test); } public void startTest(Test test) { this.current = test; message("%TESTS ", test); try { Method m = test.getClass().getMethod("setBundleContext", new Class[] { BundleContext.class }); m.invoke(test, new Object[] { targetBundle.getBundleContext() }); } catch (Exception e) { } } private void message(String key, String payload) { if (key.length() != 8) throw new IllegalArgumentException(key + " is not 8 characters"); out.print(key); out.println(payload); out.flush(); if (verbose) System.err.println(key + payload); } private void message(String key, Test test) { if (tests == null) message(key, "?," + test); else message(key, (tests.indexOf(test) + 1) + "," + test); } private void report(List<Test> flattened) { for (int i = 0; i < flattened.size(); i++) { StringBuffer sb = new StringBuffer(); sb.append(i + 1); sb.append(","); Test test = flattened.get(i); if (test instanceof TestSuite || test instanceof JUnit4TestAdapter) { sb.append(test); sb.append(","); sb.append(true); } else { sb.append(test); sb.append(","); sb.append(false); } sb.append(","); sb.append(test.countTestCases()); message("%TSTTREE", sb.toString()); } } public void aborted() { end(); } public void close() { try { in.close(); } catch (Exception ioe) { // ignore } } }