blob: 9a436daa135c41b54f1f327a804f9340abafcdfa [file] [log] [blame]
Marian Loburbe3171e2015-06-26 16:03:14 +00001// Copyright 2015 Google Inc. All rights reserved.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14package com.google.devtools.build.lib.skyframe;
15
16import com.google.common.base.Predicates;
Lukacs Berki6e91eb92015-09-21 09:12:37 +000017import com.google.devtools.build.lib.cmdline.Label;
Marian Loburbe3171e2015-06-26 16:03:14 +000018import com.google.devtools.build.lib.cmdline.ResolvedTargets;
19import com.google.devtools.build.lib.cmdline.TargetParsingException;
20import com.google.devtools.build.lib.events.EventHandler;
21import com.google.devtools.build.lib.packages.Target;
22import com.google.devtools.build.lib.packages.TestTargetUtils;
23import com.google.devtools.build.lib.pkgcache.TargetProvider;
Marian Loburbe3171e2015-06-26 16:03:14 +000024
25import java.util.ArrayList;
26
27/**
28 * Evaluates set of test targets based on list of target patterns. In contradistinction to
29 * {@code BuildTargetPatternEvaluatorUtil} this class will expand all test suites.
30 */
31class TestTargetPatternsResultBuilder extends TargetPatternsResultBuilder {
32 private final ArrayList<ResolvedTargetsOfPattern> labelsOfPatterns = new ArrayList<>();
33 private final TargetProvider targetProvider;
34 private final EventHandler eventHandler;
35 private final boolean keepGoing;
36
37 private static class ResolvedTargetsOfPattern {
38 private final ResolvedTargets<Label> labels;
39 private final boolean negativePattern;
40
41 public ResolvedTargetsOfPattern(ResolvedTargets<Label> labels, boolean negativePattern) {
42 this.labels = labels;
43 this.negativePattern = negativePattern;
44 }
45
46 public ResolvedTargets<Label> getLabels() {
47 return labels;
48 }
49
50 public boolean isNegativePattern() {
51 return negativePattern;
52 }
53 }
54
55 TestTargetPatternsResultBuilder(TargetProvider targetProvider,
56 EventHandler eventHandler, boolean keepGoing) {
57 this.targetProvider = targetProvider;
58 this.eventHandler = eventHandler;
59 this.keepGoing = keepGoing;
60 }
61
62 @Override
63 void addLabelsOfNegativePattern(ResolvedTargets<Label> labels) {
64 labelsOfPatterns.add(new ResolvedTargetsOfPattern(labels, true));
65 }
66
67 @Override
68 void addLabelsOfPositivePattern(ResolvedTargets<Label> labels) {
69 labelsOfPatterns.add(new ResolvedTargetsOfPattern(labels, false));
70 }
71
72 @Override
73 protected Iterable<Label> getLabels() {
74 ArrayList<Label> labels = new ArrayList<>();
75 for (ResolvedTargetsOfPattern resolvedLabels : labelsOfPatterns) {
76 labels.addAll(resolvedLabels.getLabels().getTargets());
77 labels.addAll(resolvedLabels.getLabels().getFilteredTargets());
78 }
79 return labels;
80 }
81
82 @Override
83 ResolvedTargets.Builder<Target> buildInternal() throws TargetParsingException {
84 ResolvedTargets.Builder<Target> finalResult = ResolvedTargets.builder();
85 for (ResolvedTargetsOfPattern labels : labelsOfPatterns) {
86 ResolvedTargets.Builder<Target> resolvedTargetsBuilder =
87 transformLabelsIntoTargets(labels.getLabels());
88 ResolvedTargets<Target> expanded = TestTargetUtils.expandTestSuites(targetProvider,
89 eventHandler,
90 resolvedTargetsBuilder.build().getTargets(),
91 /*strict=*/false,
92 keepGoing);
93 if (expanded.hasError()) {
94 setError();
95 }
96 if (labels.isNegativePattern()) {
97 finalResult.filter(Predicates.not(Predicates.in(expanded.getTargets())));
98 } else {
99 finalResult.addAll(expanded.getTargets());
100 }
101 }
102 return finalResult;
103 }
104}