junit: speed up start - send objects first; do not send through err and out

This commit is contained in:
anna
2010-12-10 21:48:58 +03:00
parent a4bee57790
commit fe30364a51
10 changed files with 55 additions and 49 deletions
@@ -15,29 +15,42 @@
*/
package com.intellij.rt.execution.junit.segments;
import java.util.Collection;
import java.util.Hashtable;
public abstract class OutputObjectRegistry {
private final Hashtable myKnownKeys = new Hashtable();
private int myLastIndex = 0;
private PacketProcessor myMainTransport;
private PacketProcessor myAuxilaryTransport;
public OutputObjectRegistry(PacketProcessor transport) {
myMainTransport = transport;
}
public OutputObjectRegistry(PacketProcessor mainTransport, PacketProcessor auxilaryTransport) {
this(mainTransport);
myAuxilaryTransport = auxilaryTransport;
}
public String referenceTo(Object test) {
if (myKnownKeys.containsKey(test))
return (String) myKnownKeys.get(test);
return sendObject(test);
}
public String referenceTo(Object test, Collection packets) {
if (myKnownKeys.containsKey(test))
return (String) myKnownKeys.get(test);
return sendObject(test, packets);
}
private String sendObject(Object test, Collection packets) {
String key = String.valueOf(myLastIndex++);
myKnownKeys.put(test, key);
final Packet packet = createPacket();
packet.addString(PoolOfDelimiters.OBJECT_PREFIX).addReference(key);
addStringRepresentation(test, packet);
packet.addLong(getTestCont(test));
packet.addString(PoolOfDelimiters.REFERENCE_END_STR);
packets.add(packet);
return key;
}
public Packet createPacket() {
return new Packet(myMainTransport, this);
}
@@ -48,21 +61,13 @@ public abstract class OutputObjectRegistry {
Packet packet = createPacket().addString(PoolOfDelimiters.OBJECT_PREFIX).addReference(key);
addStringRepresentation(test, packet);
packet.addLong(getTestCont(test));
sendViaAllTransports(packet);
packet.send();
return key;
}
protected abstract int getTestCont(Object test);
protected abstract void addStringRepresentation(Object test, Packet packet);
private void sendViaAllTransports(Packet packet) {
packet.send();
if (myAuxilaryTransport != null)
packet.sendThrough(myAuxilaryTransport);
}
protected static void addTestClass(Packet packet, String className) {
packet.
addLimitedString(PoolOfTestTypes.TEST_CLASS).
@@ -18,6 +18,7 @@ package com.intellij.rt.execution.junit.segments;
import junit.runner.BaseTestRunner;
import java.io.*;
import java.util.Collection;
import java.util.Vector;
public class Packet extends PacketWriter {
@@ -36,6 +37,10 @@ public class Packet extends PacketWriter {
return addReference(myRegistry.referenceTo(test));
}
public Packet addObject(Object test, Collection packet) {
return addReference(myRegistry.referenceTo(test, packet));
}
public Packet addReference(String reference) {
appendString(reference + PoolOfDelimiters.REFERENCE_END);
return this;
@@ -20,6 +20,7 @@ package com.intellij.rt.execution.junit.segments;
*/
public interface PoolOfDelimiters {
char REFERENCE_END = ':';
String REFERENCE_END_STR = ":";
char INTEGER_DELIMITER = ' ';
String OBJECT_PREFIX = "O";
@@ -62,8 +62,8 @@ public class JUnit3IdeaTestRunner extends TestRunner implements IdeaTestRunner {
public void setStreams(SegmentedOutputStream segmentedOut, SegmentedOutputStream segmentedErr) {
setPrinter(new TimeSender());
myRegistry = new JUnit3OutputObjectRegistry(segmentedOut, segmentedErr);
myTestsListener = new TestResultsSender(myRegistry, segmentedErr);
myRegistry = new JUnit3OutputObjectRegistry(segmentedOut);
myTestsListener = new TestResultsSender(myRegistry);
}
protected TestResult createTestResult() {
@@ -28,12 +28,8 @@ import junit.framework.TestCase;
import junit.framework.TestSuite;
public class JUnit3OutputObjectRegistry extends OutputObjectRegistry {
public JUnit3OutputObjectRegistry(PacketProcessor mainTransport, PacketProcessor auxilaryTransport) {
super(mainTransport, auxilaryTransport);
}
public JUnit3OutputObjectRegistry(PacketProcessor out) {
super(out);
public JUnit3OutputObjectRegistry(PacketProcessor mainTransport) {
super(mainTransport);
}
protected int getTestCont(Object test) {
@@ -18,7 +18,6 @@ package com.intellij.junit3;
import com.intellij.rt.execution.junit.*;
import com.intellij.rt.execution.junit.segments.OutputObjectRegistry;
import com.intellij.rt.execution.junit.segments.Packet;
import com.intellij.rt.execution.junit.segments.PacketProcessor;
import com.intellij.rt.execution.junit.states.PoolOfTestStates;
import junit.framework.AssertionFailedError;
import junit.framework.ComparisonFailure;
@@ -27,13 +26,11 @@ import junit.framework.TestListener;
public class TestResultsSender implements TestListener {
private final OutputObjectRegistry myRegistry;
private final PacketProcessor myErr;
private TestMeter myCurrentTestMeter;
private Test myCurrentTest;
public TestResultsSender(OutputObjectRegistry packetFactory, PacketProcessor segmentedErr) {
public TestResultsSender(OutputObjectRegistry packetFactory) {
myRegistry = packetFactory;
myErr = segmentedErr;
}
public synchronized void addError(Test test, Throwable throwable) {
@@ -93,7 +90,6 @@ public class TestResultsSender implements TestListener {
private void switchOutput(Packet switchPacket) {
switchPacket.send();
switchPacket.sendThrough(myErr);
}
public synchronized void startTest(Test test) {
@@ -21,16 +21,15 @@ import com.intellij.rt.execution.junit.segments.Packet;
import junit.framework.Test;
import junit.framework.TestSuite;
import java.util.Enumeration;
import java.util.Vector;
import java.util.*;
public class TreeSender {
private static void sendNode(Test test, Packet packet) {
private static void sendNode(Test test, Packet packet, Collection objects) {
Vector testCases = getTestCasesOf(test);
packet.addObject(test).addLong(testCases.size());
packet.addObject(test, objects).addLong(testCases.size());
for (int i = 0; i < testCases.size(); i++) {
Test nextTest = (Test)testCases.get(i);
sendNode(nextTest, packet);
sendNode(nextTest, packet, objects);
}
}
@@ -54,7 +53,11 @@ public class TreeSender {
public static void sendSuite(OutputObjectRegistry registry, Test suite) {
Packet packet = registry.createPacket();
packet.addString(PoolOfDelimiters.TREE_PREFIX);
sendNode(suite, packet);
Collection objects = new ArrayList();
sendNode(suite, packet, objects);
for (Iterator iterator = objects.iterator(); iterator.hasNext();) {
((Packet)iterator.next()).send();
}
packet.addString("\n");
packet.send();
}
@@ -30,26 +30,29 @@ import org.junit.runner.manipulation.Filter;
import org.junit.runner.notification.RunListener;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.*;
/** @noinspection UnusedDeclaration*/
public class JUnit4IdeaTestRunner implements IdeaTestRunner {
private RunListener myTestsListener;
private OutputObjectRegistry myRegistry;
private static void sendNode(Description test, Packet packet) {
private static void sendNode(Description test, Packet packet, Collection objectPackets) {
final ArrayList children = test.getChildren();
packet.addObject(test).addLong(children.size());
packet.addObject(test, objectPackets).addLong(children.size());
for (int i = 0; i < children.size(); i++) {
sendNode((Description)children.get(i), packet);
sendNode((Description)children.get(i), packet, objectPackets);
}
}
public static void sendTree(OutputObjectRegistry registry, Description suite) {
public void sendTree(OutputObjectRegistry registry, Description suite) {
Packet packet = registry.createPacket();
packet.addString(PoolOfDelimiters.TREE_PREFIX);
sendNode(suite, packet);
Set objects = new HashSet();
sendNode(suite, packet, objects);
for (Iterator iterator = objects.iterator(); iterator.hasNext();) {
((Packet)iterator.next()).send();
}
packet.addString("\n");
packet.send();
}
@@ -150,8 +153,8 @@ public class JUnit4IdeaTestRunner implements IdeaTestRunner {
public void setStreams(SegmentedOutputStream segmentedOut, SegmentedOutputStream segmentedErr) {
myRegistry = new JUnit4OutputObjectRegistry(segmentedOut, segmentedErr);
myTestsListener = new JUnit4TestResultsSender(myRegistry, segmentedErr);
myRegistry = new JUnit4OutputObjectRegistry(segmentedOut);
myTestsListener = new JUnit4TestResultsSender(myRegistry);
}
private class TimeSender extends ResultPrinter {
@@ -27,8 +27,8 @@ import org.junit.runner.Description;
public class JUnit4OutputObjectRegistry extends OutputObjectRegistry {
public JUnit4OutputObjectRegistry(PacketProcessor mainTransport, PacketProcessor auxilaryTransport) {
super(mainTransport, auxilaryTransport);
public JUnit4OutputObjectRegistry(PacketProcessor mainTransport) {
super(mainTransport);
}
protected int getTestCont(Object test) {
@@ -35,13 +35,11 @@ import java.util.regex.Pattern;
public class JUnit4TestResultsSender extends RunListener {
private final OutputObjectRegistry myRegistry;
private final PacketProcessor myErr;
private Map myCurrentTestMeters = new HashMap();
private Set myCurrentTests = new HashSet();
public JUnit4TestResultsSender(OutputObjectRegistry packetFactory, PacketProcessor segmentedErr) {
public JUnit4TestResultsSender(OutputObjectRegistry packetFactory) {
myRegistry = packetFactory;
myErr = segmentedErr;
}
public synchronized void testFailure(Failure failure) throws Exception {
@@ -139,7 +137,6 @@ public class JUnit4TestResultsSender extends RunListener {
private void switchOutput(Packet switchPacket) {
switchPacket.send();
switchPacket.sendThrough(myErr);
}