From ce7977ba38c6183acff6b7337b6610399a620938 Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Fri, 21 Jun 2013 19:16:37 +0400 Subject: [PATCH] junit: fork per working directory: indices fixed --- .../intellij/junit3/JUnit3IdeaTestRunner.java | 16 +++---- .../intellij/junit4/JUnit4IdeaTestRunner.java | 2 +- .../execution/junit/JUnitForkedStarter.java | 46 +++++++++++-------- .../rt/execution/junit/TreeSender.java | 12 +++-- 4 files changed, 43 insertions(+), 33 deletions(-) diff --git a/plugins/junit_rt/src/com/intellij/junit3/JUnit3IdeaTestRunner.java b/plugins/junit_rt/src/com/intellij/junit3/JUnit3IdeaTestRunner.java index 7a4424da8aa0..1f027db9c193 100644 --- a/plugins/junit_rt/src/com/intellij/junit3/JUnit3IdeaTestRunner.java +++ b/plugins/junit_rt/src/com/intellij/junit3/JUnit3IdeaTestRunner.java @@ -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); } diff --git a/plugins/junit_rt/src/com/intellij/junit4/JUnit4IdeaTestRunner.java b/plugins/junit_rt/src/com/intellij/junit4/JUnit4IdeaTestRunner.java index 333c130eb1a0..42f67679da32 100644 --- a/plugins/junit_rt/src/com/intellij/junit4/JUnit4IdeaTestRunner.java +++ b/plugins/junit_rt/src/com/intellij/junit4/JUnit4IdeaTestRunner.java @@ -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 diff --git a/plugins/junit_rt/src/com/intellij/rt/execution/junit/JUnitForkedStarter.java b/plugins/junit_rt/src/com/intellij/rt/execution/junit/JUnitForkedStarter.java index 82566ea29d97..3f3276a6484e 100644 --- a/plugins/junit_rt/src/com/intellij/rt/execution/junit/JUnitForkedStarter.java +++ b/plugins/junit_rt/src/com/intellij/rt/execution/junit/JUnitForkedStarter.java @@ -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); diff --git a/plugins/junit_rt/src/com/intellij/rt/execution/junit/TreeSender.java b/plugins/junit_rt/src/com/intellij/rt/execution/junit/TreeSender.java index df805ee8756b..f64d237b70e3 100644 --- a/plugins/junit_rt/src/com/intellij/rt/execution/junit/TreeSender.java +++ b/plugins/junit_rt/src/com/intellij/rt/execution/junit/TreeSender.java @@ -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) {