diff options
author | Greg Estren <gregce@google.com> | 2017-03-07 19:04:16 +0000 |
---|---|---|
committer | Vladimir Moskva <vladmos@google.com> | 2017-03-08 10:49:22 +0000 |
commit | 2a715829af07c35675dc6cd8f37e486bd4a7ae7c (patch) | |
tree | 066e45a689b1741eb88a428f9321e171236c6249 /src/test/java/com/google/devtools/build/lib/skyframe | |
parent | 087dcccf06702ab89993942b666cc67668b7366f (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.java | 119 |
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"); + } + } } |