aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar Ulf Adams <ulfjack@google.com>2015-09-08 08:54:25 +0000
committerGravatar Damien Martin-Guillerez <dmarting@google.com>2015-09-08 09:09:31 +0000
commit83f8271fd9fae7c9fde473c28c1b7e3f7504442a (patch)
tree3321ef2eaee91ffbfa7728a5a88635f1d7cbf54c
parent2aad9d7e697aa6277bec89b8eaa7d728ceacf56b (diff)
Extract the test filtering into a new class.
This is intended to make it easier to reimplement this in Skyframe, in order to merge loading and analysis phases. -- MOS_MIGRATED_REVID=102536532
-rw-r--r--src/main/java/com/google/devtools/build/lib/pkgcache/LoadingPhaseRunner.java29
-rw-r--r--src/main/java/com/google/devtools/build/lib/pkgcache/TestFilter.java102
2 files changed, 103 insertions, 28 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/pkgcache/LoadingPhaseRunner.java b/src/main/java/com/google/devtools/build/lib/pkgcache/LoadingPhaseRunner.java
index e227929a4b..77227c646b 100644
--- a/src/main/java/com/google/devtools/build/lib/pkgcache/LoadingPhaseRunner.java
+++ b/src/main/java/com/google/devtools/build/lib/pkgcache/LoadingPhaseRunner.java
@@ -14,8 +14,6 @@
package com.google.devtools.build.lib.pkgcache;
import com.google.common.base.Preconditions;
-import com.google.common.base.Predicate;
-import com.google.common.base.Predicates;
import com.google.common.base.Stopwatch;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet;
@@ -603,33 +601,8 @@ public class LoadingPhaseRunner {
ResolvedTargets.Builder<Target> finalBuilder = ResolvedTargets.builder();
finalBuilder.merge(testTargetsBuilder);
- finalBuilder.filter(getTestFilter(eventHandler, options));
+ finalBuilder.filter(TestFilter.forOptions(options, eventHandler, ruleNames));
return finalBuilder.build();
-
- }
-
- /**
- * Convert the options into a test filter.
- */
- private Predicate<Target> getTestFilter(EventHandler eventHandler, Options options) {
- Predicate<Target> testFilter = Predicates.alwaysTrue();
- if (!options.testSizeFilterSet.isEmpty()) {
- testFilter = Predicates.and(testFilter,
- TestTargetUtils.testSizeFilter(options.testSizeFilterSet));
- }
- if (!options.testTimeoutFilterSet.isEmpty()) {
- testFilter = Predicates.and(testFilter,
- TestTargetUtils.testTimeoutFilter(options.testTimeoutFilterSet));
- }
- if (!options.testTagFilterList.isEmpty()) {
- testFilter = Predicates.and(testFilter,
- TestTargetUtils.tagFilter(options.testTagFilterList));
- }
- if (!options.testLangFilterList.isEmpty()) {
- testFilter = Predicates.and(testFilter,
- TestTargetUtils.testLangFilter(options.testLangFilterList, eventHandler, ruleNames));
- }
- return testFilter;
}
/**
diff --git a/src/main/java/com/google/devtools/build/lib/pkgcache/TestFilter.java b/src/main/java/com/google/devtools/build/lib/pkgcache/TestFilter.java
new file mode 100644
index 0000000000..6728cdd1f4
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/pkgcache/TestFilter.java
@@ -0,0 +1,102 @@
+// Copyright 2015 Google Inc. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+package com.google.devtools.build.lib.pkgcache;
+
+import com.google.common.base.Predicate;
+import com.google.common.base.Predicates;
+import com.google.devtools.build.lib.events.EventHandler;
+import com.google.devtools.build.lib.packages.Target;
+import com.google.devtools.build.lib.packages.TestSize;
+import com.google.devtools.build.lib.packages.TestTargetUtils;
+import com.google.devtools.build.lib.packages.TestTimeout;
+import com.google.devtools.build.lib.pkgcache.LoadingPhaseRunner.Options;
+
+import java.util.List;
+import java.util.Objects;
+import java.util.Set;
+
+import javax.annotation.Nullable;
+
+/**
+ * Predicate that implements test filtering using the command-line options in {@link Options}.
+ * Implements {@link #hashCode} and {@link #equals} so it can be used as a Skyframe key.
+ */
+public final class TestFilter implements Predicate<Target> {
+ /**
+ * Convert the options into a test filter.
+ */
+ public static TestFilter forOptions(Options options, EventHandler eventHandler,
+ Set<String> ruleNames) {
+ Predicate<Target> testFilter = Predicates.alwaysTrue();
+ if (!options.testSizeFilterSet.isEmpty()) {
+ testFilter = Predicates.and(testFilter,
+ TestTargetUtils.testSizeFilter(options.testSizeFilterSet));
+ }
+ if (!options.testTimeoutFilterSet.isEmpty()) {
+ testFilter = Predicates.and(testFilter,
+ TestTargetUtils.testTimeoutFilter(options.testTimeoutFilterSet));
+ }
+ if (!options.testTagFilterList.isEmpty()) {
+ testFilter = Predicates.and(testFilter,
+ TestTargetUtils.tagFilter(options.testTagFilterList));
+ }
+ if (!options.testLangFilterList.isEmpty()) {
+ testFilter = Predicates.and(testFilter,
+ TestTargetUtils.testLangFilter(options.testLangFilterList, eventHandler, ruleNames));
+ }
+ return new TestFilter(options.testSizeFilterSet, options.testTimeoutFilterSet,
+ options.testTagFilterList, options.testLangFilterList, testFilter);
+ }
+
+ private final Set<TestSize> testSizeFilterSet;
+ private final Set<TestTimeout> testTimeoutFilterSet;
+ private final List<String> testTagFilterList;
+ private final List<String> testLangFilterList;
+ private final Predicate<Target> impl;
+
+ private TestFilter(Set<TestSize> testSizeFilterSet, Set<TestTimeout> testTimeoutFilterSet,
+ List<String> testTagFilterList, List<String> testLangFilterList, Predicate<Target> impl) {
+ this.testSizeFilterSet = testSizeFilterSet;
+ this.testTimeoutFilterSet = testTimeoutFilterSet;
+ this.testTagFilterList = testTagFilterList;
+ this.testLangFilterList = testLangFilterList;
+ this.impl = impl;
+ }
+
+ @Override
+ public boolean apply(@Nullable Target input) {
+ return impl.apply(input);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(testSizeFilterSet, testTimeoutFilterSet, testTagFilterList,
+ testLangFilterList);
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (o == this) {
+ return true;
+ }
+ if (!(o instanceof TestFilter)) {
+ return false;
+ }
+ TestFilter f = (TestFilter) o;
+ return f.testSizeFilterSet.equals(testSizeFilterSet)
+ && f.testTimeoutFilterSet.equals(testTimeoutFilterSet)
+ && f.testTagFilterList.equals(testTagFilterList)
+ && f.testLangFilterList.equals(testLangFilterList);
+ }
+}