From 2dddbeeac25ace6f53dd3ce6ac588111c239bdf0 Mon Sep 17 00:00:00 2001 From: Irina Iancu Date: Wed, 24 Aug 2016 15:03:39 +0000 Subject: Removing some of GUAVA dependencies from junit.runner.junit4 and -.model Bazel users that are using a different Guava version than the one in the junitrunner jar are getting an IncompatibleClassChangeError. Rewriting parts of junitrunner code so it won't depend on Guava anymore. Continuing progress on issue #1150. -- MOS_MIGRATED_REVID=131172156 --- .../testing/junit/runner/junit4/JUnit4Runner.java | 10 +++--- .../testing/junit/runner/model/TestCaseNode.java | 36 ++++++++++++++++------ .../testing/junit/runner/model/TestSuiteModel.java | 35 +++++++++++---------- 3 files changed, 51 insertions(+), 30 deletions(-) (limited to 'src/java_tools') diff --git a/src/java_tools/junitrunner/java/com/google/testing/junit/runner/junit4/JUnit4Runner.java b/src/java_tools/junitrunner/java/com/google/testing/junit/runner/junit4/JUnit4Runner.java index 10447a7b70..d9938c7951 100644 --- a/src/java_tools/junitrunner/java/com/google/testing/junit/runner/junit4/JUnit4Runner.java +++ b/src/java_tools/junitrunner/java/com/google/testing/junit/runner/junit4/JUnit4Runner.java @@ -14,9 +14,7 @@ package com.google.testing.junit.runner.junit4; -import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Supplier; -import com.google.common.io.Files; import com.google.testing.junit.junit4.runner.SuiteTrimmingFilter; import com.google.testing.junit.runner.internal.Stdout; import com.google.testing.junit.runner.model.TestSuiteModel; @@ -34,6 +32,7 @@ import org.junit.runner.notification.RunListener; import org.junit.runner.notification.RunNotifier; import java.io.File; +import java.io.FileOutputStream; import java.io.IOException; import java.io.PrintStream; import java.util.Set; @@ -130,7 +129,10 @@ public class JUnit4Runner { private static void exitFileActive(@Nullable File file) { if (file != null) { try { - Files.write(new byte[0], file); + // Overwrite file content. + FileOutputStream outputStream = new FileOutputStream(file, false); + outputStream.write(new byte[0]); + outputStream.close(); } catch (IOException e) { throw new RuntimeException("Could not write exit file at " + file, e); } @@ -148,7 +150,7 @@ public class JUnit4Runner { } } - @VisibleForTesting + // VisibleForTesting TestSuiteModel getModel() { return modelSupplier.get(); } diff --git a/src/java_tools/junitrunner/java/com/google/testing/junit/runner/model/TestCaseNode.java b/src/java_tools/junitrunner/java/com/google/testing/junit/runner/model/TestCaseNode.java index 74ab90b090..50cb8b7e83 100644 --- a/src/java_tools/junitrunner/java/com/google/testing/junit/runner/model/TestCaseNode.java +++ b/src/java_tools/junitrunner/java/com/google/testing/junit/runner/model/TestCaseNode.java @@ -16,15 +16,11 @@ package com.google.testing.junit.runner.model; import static com.google.testing.junit.runner.util.TestPropertyExporter.INITIAL_INDEX_FOR_REPEATED_PROPERTY; -import com.google.common.collect.ConcurrentHashMultiset; -import com.google.common.collect.LinkedListMultimap; -import com.google.common.collect.ListMultimap; -import com.google.common.collect.Multimaps; -import com.google.common.collect.Multiset; import com.google.testing.junit.runner.model.TestResult.Status; import com.google.testing.junit.runner.util.TestPropertyExporter; import java.util.ArrayList; import java.util.Collections; +import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Queue; @@ -39,10 +35,10 @@ import org.junit.runner.Description; class TestCaseNode extends TestNode implements TestPropertyExporter.Callback { private final TestSuiteNode parent; private final Map properties = new ConcurrentHashMap<>(); - private final Multiset repeatedPropertyNames = ConcurrentHashMultiset.create(); + private final Map repeatedPropertyNamesToRepetitions = new HashMap<>(); private final Queue globalFailures = new ConcurrentLinkedQueue<>(); - private final ListMultimap dynamicTestToFailures = - Multimaps.synchronizedListMultimap(LinkedListMultimap.create()); + private final ConcurrentHashMap> dynamicTestToFailures = + new ConcurrentHashMap<>(); @Nullable private volatile TestInterval runTimeInterval = null; private volatile State state = State.INITIAL; @@ -117,11 +113,12 @@ class TestCaseNode extends TestNode implements TestPropertyExporter.Callback { @Override public void dynamicTestFailure(Description test, Throwable throwable, long now) { compareAndSetState(State.INITIAL, State.FINISHED, now); - dynamicTestToFailures.put(test, throwable); + addThrowableToDynamicTestToFailures(test, throwable); } private String getRepeatedPropertyName(String name) { - int index = repeatedPropertyNames.add(name, 1) + INITIAL_INDEX_FOR_REPEATED_PROPERTY; + int index = addNameToRepeatedPropertyNamesAndGetRepetitionsNr(name) + + INITIAL_INDEX_FOR_REPEATED_PROPERTY; return name + index; } @@ -130,6 +127,25 @@ class TestCaseNode extends TestNode implements TestPropertyExporter.Callback { return true; } + private synchronized void addThrowableToDynamicTestToFailures( + Description test, Throwable throwable) { + List throwables = dynamicTestToFailures.get(test); + if (throwables == null) { + throwables = new ArrayList(); + dynamicTestToFailures.put(test, throwables); + } + throwables.add(throwable); + } + + private synchronized int addNameToRepeatedPropertyNamesAndGetRepetitionsNr(String name) { + Integer previousRepetitionsNr = repeatedPropertyNamesToRepetitions.get(name); + if (previousRepetitionsNr == null) { + previousRepetitionsNr = 0; + } + repeatedPropertyNamesToRepetitions.put(name, previousRepetitionsNr + 1); + return previousRepetitionsNr; + } + private synchronized boolean compareAndSetState(State fromState, State toState, long now) { if (fromState == null || toState == null || state == null) { throw new NullPointerException(); diff --git a/src/java_tools/junitrunner/java/com/google/testing/junit/runner/model/TestSuiteModel.java b/src/java_tools/junitrunner/java/com/google/testing/junit/runner/model/TestSuiteModel.java index 08be4caeda..543acfe80e 100644 --- a/src/java_tools/junitrunner/java/com/google/testing/junit/runner/model/TestSuiteModel.java +++ b/src/java_tools/junitrunner/java/com/google/testing/junit/runner/model/TestSuiteModel.java @@ -14,13 +14,8 @@ package com.google.testing.junit.runner.model; -import static com.google.common.base.Predicates.notNull; -import static com.google.common.collect.Maps.filterValues; -import static com.google.common.collect.Maps.transformValues; import static java.util.concurrent.TimeUnit.NANOSECONDS; -import com.google.common.base.Function; -import com.google.common.base.Preconditions; import com.google.common.base.Ticker; import com.google.testing.junit.junit4.runner.DynamicTestException; import com.google.testing.junit.runner.sharding.ShardingEnvironment; @@ -30,6 +25,7 @@ import java.io.IOException; import java.io.OutputStream; import java.io.StringWriter; import java.util.Collection; +import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; @@ -269,7 +265,9 @@ public class TestSuiteModel { } public TestSuiteModel build(String suiteName, Description... topLevelSuites) { - Preconditions.checkState(!buildWasCalled, "Builder.build() was already called"); + if (buildWasCalled) { + throw new IllegalStateException("Builder.build() was already called"); + } buildWasCalled = true; if (shardingEnvironment.isShardingEnabled()) { shardingFilter = getShardingFilter(topLevelSuites); @@ -317,7 +315,9 @@ public class TestSuiteModel { } private void addTestCase(TestSuiteNode parentSuite, Description testCaseDesc) { - Preconditions.checkArgument(testCaseDesc.isTest()); + if (!testCaseDesc.isTest()) { + throw new IllegalArgumentException(); + } if (!shardingFilter.shouldRun(testCaseDesc)) { return; } @@ -327,16 +327,19 @@ public class TestSuiteModel { } } + /** + * Converts the values of the Map from {@link TestNode} to {@link TestCaseNode} filtering out null + * values. + */ private static Map filterTestCases(Map tests) { - return filterValues(transformValues(tests, toTestCaseNode()), notNull()); - } - - private static Function toTestCaseNode() { - return new Function() { - @Override - public TestCaseNode apply(TestNode test) { - return test instanceof TestCaseNode ? (TestCaseNode) test : null; + Map filteredAndConvertedTests = + new HashMap(); + for (Description key : tests.keySet()) { + TestNode testNode = tests.get(key); + if (testNode != null && testNode instanceof TestCaseNode) { + filteredAndConvertedTests.put(key, (TestCaseNode) testNode); } - }; + } + return filteredAndConvertedTests; } } -- cgit v1.2.3