junit: fork per working directory: indices fixed

This commit is contained in:
Anna Kozlova
2013-06-21 19:17:30 +04:00
parent d8891a7de1
commit ce7977ba38
4 changed files with 43 additions and 33 deletions
@@ -130,15 +130,13 @@ public class JUnit3IdeaTestRunner extends TestRunner implements IdeaTestRunner {
}
public TestResult doRun(Test suite, boolean wait) { //todo
if (mySendTree) {
try {
TreeSender.sendTree(this, suite);
}
catch (Exception e) {
//noinspection HardCodedStringLiteral
System.err.println("Internal Error occured.");
e.printStackTrace(System.err);
}
try {
TreeSender.sendTree(this, suite, mySendTree);
}
catch (Exception e) {
//noinspection HardCodedStringLiteral
System.err.println("Internal Error occured.");
e.printStackTrace(System.err);
}
return super.doRun(suite, wait);
}
@@ -47,7 +47,7 @@ public class JUnit4IdeaTestRunner implements IdeaTestRunner {
else if (request instanceof FilterRequest) {
description = getFilteredDescription(request, description);
}
if (sendTree) TreeSender.sendTree(this, description);
TreeSender.sendTree(this, description, sendTree);
}
catch (Exception e) {
//noinspection HardCodedStringLiteral
@@ -19,6 +19,7 @@ import com.intellij.rt.execution.junit.segments.SegmentedOutputStream;
import java.io.*;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
/**
@@ -90,7 +91,7 @@ public class JUnitForkedStarter {
final Object description = testRunner.getTestToStart(args);
if (description == null) return -1;
TreeSender.sendTree(testRunner, description);
TreeSender.sendTree(testRunner, description, true);
long time = System.currentTimeMillis();
@@ -111,7 +112,7 @@ public class JUnitForkedStarter {
final FileOutputStream writer = new FileOutputStream(tempFile);
String firstName = null;
List classNames = new ArrayList();
try {
final int classNamesSize = Integer.parseInt(perDirReader.readLine());
writer.write((packageName + ", working directory: \'" + workingDir + "\'\n").getBytes("UTF-8")); //instead of package name
@@ -121,9 +122,7 @@ public class JUnitForkedStarter {
System.err.println("Class name is expected. Working dir: " + workingDir);
return -1;
}
if (firstName == null) {
firstName = className;
}
classNames.add(className);
writer.write((className + "\n").getBytes("UTF-8"));
}
}
@@ -131,14 +130,20 @@ public class JUnitForkedStarter {
writer.close();
}
final Object rootDescriptor = findByClassName(testRunner, firstName, description);
final Object rootDescriptor = findByClassName(testRunner, (String)classNames.get(0), description);
final int childResult;
final File dir = new File(workingDir);
if (forkMode.equals("none")) {
childResult =
runChild(rootDescriptor, isJUnit4, listeners, out, err, parameters, testRunner, false, "@" + tempFile.getAbsolutePath(), dir);
runChild(isJUnit4, listeners, out, err, parameters, "@" + tempFile.getAbsolutePath(), dir,
String.valueOf(testRunner.getRegistry().getKnownObject(rootDescriptor) - 1));
} else {
final List children = testRunner.getChildTests(rootDescriptor);
final List children = new ArrayList(testRunner.getChildTests(description));
for (Iterator iterator = children.iterator(); iterator.hasNext(); ) {
if (!classNames.contains(testRunner.getTestClassName(iterator.next()))) {
iterator.remove();
}
}
final boolean forkTillMethod = forkMode.equalsIgnoreCase("method");
childResult = processChildren(isJUnit4, listeners, out, err, parameters, testRunner, children, result, forkTillMethod, dir);
}
@@ -186,34 +191,39 @@ public class JUnitForkedStarter {
for (int i = 0, argsLength = children.size(); i < argsLength; i++) {
final Object child = children.get(i);
final List childTests = testRunner.getChildTests(child);
final int childResult = childTests.isEmpty() || !forkTillMethod
? runChild(child, isJUnit4, listeners, out, err, parameters, testRunner, forkTillMethod || workingDir != null, testRunner.getStartDescription(child), workingDir)
: processChildren(isJUnit4, listeners, out, err, parameters, testRunner, childTests, result, forkTillMethod, workingDir);
final int childResult;
if (childTests.isEmpty() || !forkTillMethod) {
final int startIndex = testRunner.getRegistry().getKnownObject(child);
childResult =
runChild(isJUnit4, listeners, out, err, parameters, testRunner.getStartDescription(child), workingDir,
String.valueOf(startIndex));
}
else {
childResult =
processChildren(isJUnit4, listeners, out, err, parameters, testRunner, childTests, result, forkTillMethod, workingDir);
}
result = Math.min(childResult, result);
}
return result;
}
private static int runChild(Object child,
boolean isJUnit4,
private static int runChild(boolean isJUnit4,
List listeners,
SegmentedOutputStream out,
SegmentedOutputStream err,
List parameters,
IdeaTestRunner testRunner,
boolean forkTillMethod,
String description,
File workingDir) throws IOException, InterruptedException {
File workingDir,
String startIndex) throws IOException, InterruptedException {
//noinspection SSBasedInspection
final File tempFile = File.createTempFile("fork", "test");
final String testOutputPath = tempFile.getAbsolutePath();
final int knownObject = testRunner.getRegistry().getKnownObject(child);
final ProcessBuilder builder = new ProcessBuilder();
builder.add(parameters);
builder.add(JUnitForkedStarter.class.getName());
builder.add(testOutputPath);
builder.add(String.valueOf(knownObject + (forkTillMethod ? 0 : 1)));
builder.add(startIndex);
builder.add(String.valueOf(isJUnit4));
builder.add(description);
builder.add(listeners);
@@ -25,16 +25,18 @@ public class TreeSender {
private TreeSender() {
}
public static void sendTree(IdeaTestRunner runner, Object suite) {
public static void sendTree(IdeaTestRunner runner, Object suite, boolean sendTree) {
Packet packet = runner.getRegistry().createPacket();
packet.addString(PoolOfDelimiters.TREE_PREFIX);
Set objects = new HashSet();
sendNode(runner, suite, packet, objects);
for (Iterator iterator = objects.iterator(); iterator.hasNext();) {
((Packet)iterator.next()).send();
if (sendTree) {
for (Iterator iterator = objects.iterator(); iterator.hasNext();) {
((Packet)iterator.next()).send();
}
packet.addString("\n");
packet.send();
}
packet.addString("\n");
packet.send();
}
private static void sendNode(IdeaTestRunner runner, Object test, Packet packet, Collection objectPackets) {