blob: ee18660ca431cafc35a7501a2a1ab7c21abbb11f [file] [log] [blame]
// Copyright 2015 The Bazel Authors. 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.ExtendedEventHandler;
import com.google.devtools.build.lib.packages.Target;
import com.google.devtools.build.lib.packages.TargetUtils;
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 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 LoadingOptions}.
* 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(
LoadingOptions options, ExtendedEventHandler 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,
TargetUtils.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);
}
}