aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/test/java/com/google/devtools/build/lib/skyframe
diff options
context:
space:
mode:
authorGravatar Greg Estren <gregce@google.com>2017-03-07 19:04:16 +0000
committerGravatar Vladimir Moskva <vladmos@google.com>2017-03-08 10:49:22 +0000
commit2a715829af07c35675dc6cd8f37e486bd4a7ae7c (patch)
tree066e45a689b1741eb88a428f9321e171236c6249 /src/test/java/com/google/devtools/build/lib/skyframe
parent087dcccf06702ab89993942b666cc67668b7366f (diff)
Support composed dependency transitions with dynamic configs.
-- PiperOrigin-RevId: 149439502 MOS_MIGRATED_REVID=149439502
Diffstat (limited to 'src/test/java/com/google/devtools/build/lib/skyframe')
-rw-r--r--src/test/java/com/google/devtools/build/lib/skyframe/ConfigurationsForTargetsWithDynamicConfigurationsTest.java119
1 files changed, 119 insertions, 0 deletions
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/ConfigurationsForTargetsWithDynamicConfigurationsTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/ConfigurationsForTargetsWithDynamicConfigurationsTest.java
index 2e359f365a..3e0be4b008 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/ConfigurationsForTargetsWithDynamicConfigurationsTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/ConfigurationsForTargetsWithDynamicConfigurationsTest.java
@@ -14,14 +14,24 @@
package com.google.devtools.build.lib.skyframe;
+import static com.google.common.base.Strings.nullToEmpty;
import static com.google.common.truth.Truth.assertThat;
+import static org.junit.Assert.fail;
+import com.google.common.collect.ImmutableList;
import com.google.common.collect.Iterables;
+import com.google.devtools.build.lib.analysis.AspectCollection;
import com.google.devtools.build.lib.analysis.ConfiguredTarget;
+import com.google.devtools.build.lib.analysis.Dependency;
import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.analysis.config.BuildOptions;
+import com.google.devtools.build.lib.analysis.config.PatchTransition;
import com.google.devtools.build.lib.analysis.util.TestAspects;
+import com.google.devtools.build.lib.cmdline.Label;
+import com.google.devtools.build.lib.packages.Attribute;
import com.google.devtools.build.lib.testutil.Suite;
import com.google.devtools.build.lib.testutil.TestSpec;
+import java.util.ArrayList;
import java.util.List;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -135,4 +145,113 @@ public class ConfigurationsForTargetsWithDynamicConfigurationsTest
Iterables.getOnlyElement(update("//a:sim").getTargetsToBuild());
assertThat(target.getConfiguration().getCpu()).isNotEqualTo("SET BY PATCH");
}
+
+ /**
+ * Returns a custom {@link PatchTransition} with the given value added to
+ * {@link BuildConfiguration.Options#testFilter}.
+ */
+ private static PatchTransition newPatchTransition(final String value) {
+ return new PatchTransition() {
+ @Override
+ public BuildOptions apply(BuildOptions options) {
+ BuildOptions toOptions = options.clone();
+ BuildConfiguration.Options baseOptions = toOptions.get(BuildConfiguration.Options.class);
+ baseOptions.testFilter = (nullToEmpty(baseOptions.testFilter)) + value;
+ return toOptions;
+ }
+
+ @Override
+ public boolean defaultsToSelf() {
+ return false;
+ }
+ };
+ }
+
+ /**
+ * Returns a custom {@link Attribute.SplitTransition} that splits
+ * {@link BuildConfiguration.Options#testFilter} down two paths: {@code += prefix + "1"}
+ * and {@code += prefix + "2"}.
+ */
+ private static Attribute.SplitTransition<BuildOptions> newSplitTransition(final String prefix) {
+ return new Attribute.SplitTransition<BuildOptions>() {
+ @Override
+ public List<BuildOptions> split(BuildOptions buildOptions) {
+ ImmutableList.Builder<BuildOptions> result = ImmutableList.builder();
+ for (int index = 1; index <= 2; index++) {
+ BuildOptions toOptions = buildOptions.clone();
+ BuildConfiguration.Options baseOptions = toOptions.get(BuildConfiguration.Options.class);
+ baseOptions.testFilter =
+ (baseOptions.testFilter == null ? "" : baseOptions.testFilter) + prefix + index;
+ result.add(toOptions);
+ }
+ return result.build();
+ }
+
+ @Override
+ public boolean defaultsToSelf() {
+ return false;
+ }
+ };
+ }
+
+ @Test
+ public void composedStraightTransitions() throws Exception {
+ update(); // Creates the target configuration.
+ BuildConfiguration.TransitionApplier applier = getTargetConfiguration().getTransitionApplier();
+ applier.applyTransition(newPatchTransition("foo"));
+ applier.applyTransition(newPatchTransition("bar"));
+ Dependency dep = Iterables.getOnlyElement(
+ applier.getDependencies(Label.create("some", "target"), AspectCollection.EMPTY));
+ BuildOptions toOptions = Iterables.getOnlyElement(
+ ConfiguredTargetFunction.getDynamicTransitionOptions(getTargetConfiguration().getOptions(),
+ dep.getTransition(), ruleClassProvider.getAllFragments(), ruleClassProvider, false));
+ assertThat(toOptions.get(BuildConfiguration.Options.class).testFilter).isEqualTo("foobar");
+ }
+
+ @Test
+ public void composedStraightTransitionThenSplitTransition() throws Exception {
+ update(); // Creates the target configuration.
+ BuildConfiguration.TransitionApplier applier = getTargetConfiguration().getTransitionApplier();
+ applier.applyTransition(newPatchTransition("foo"));
+ applier.split(newSplitTransition("split"));
+ Dependency dep = Iterables.getOnlyElement(
+ applier.getDependencies(Label.create("some", "target"), AspectCollection.EMPTY));
+ List<String> outValues = new ArrayList<>();
+ for (BuildOptions toOptions : ConfiguredTargetFunction.getDynamicTransitionOptions(
+ getTargetConfiguration().getOptions(), dep.getTransition(),
+ ruleClassProvider.getAllFragments(), ruleClassProvider, false)) {
+ outValues.add(toOptions.get(BuildConfiguration.Options.class).testFilter);
+ }
+ assertThat(outValues).containsExactly("foosplit1", "foosplit2");
+ }
+
+ @Test
+ public void composedSplitTransitionThenStraightTransition() throws Exception {
+ update(); // Creates the target configuration.
+ BuildConfiguration.TransitionApplier applier = getTargetConfiguration().getTransitionApplier();
+ applier.split(newSplitTransition("split"));
+ applier.applyTransition(newPatchTransition("foo"));
+ Dependency dep = Iterables.getOnlyElement(
+ applier.getDependencies(Label.create("some", "target"), AspectCollection.EMPTY));
+ List<String> outValues = new ArrayList<>();
+ for (BuildOptions toOptions : ConfiguredTargetFunction.getDynamicTransitionOptions(
+ getTargetConfiguration().getOptions(), dep.getTransition(),
+ ruleClassProvider.getAllFragments(), ruleClassProvider, false)) {
+ outValues.add(toOptions.get(BuildConfiguration.Options.class).testFilter);
+ }
+ assertThat(outValues).containsExactly("split1foo", "split2foo");
+ }
+
+ @Test
+ public void composedSplitTransitions() throws Exception {
+ update(); // Creates the target configuration.
+ BuildConfiguration.TransitionApplier applier = getTargetConfiguration().getTransitionApplier();
+ applier.split(newSplitTransition("split"));
+ try {
+ applier.split(newSplitTransition("disallowed second split"));
+ fail("expected failure: deps cannot apply more than one split transition each");
+ } catch (IllegalStateException e) {
+ assertThat(e.getMessage()).contains("dependency edges may apply at most one split");
+ }
+ }
}