From 247ac16337769e4492f4ac0a0a4fd786c92eed24 Mon Sep 17 00:00:00 2001 From: Greg Estren Date: Wed, 10 Aug 2016 20:50:09 +0000 Subject: Dynamic config test improvements: - Adds a helper routine to get all configured targets with a given label - Enhances latebound split test to check that deps actually take expected configurations -- MOS_MIGRATED_REVID=129906477 --- src/test/java/com/google/devtools/build/lib/BUILD | 1 + .../devtools/build/lib/analysis/BuildViewTest.java | 15 +++++-- .../build/lib/analysis/LateBoundSplitUtil.java | 47 +++++++++++++++++----- .../skyframe/util/SkyframeExecutorTestUtils.java | 19 +++++++++ 4 files changed, 69 insertions(+), 13 deletions(-) (limited to 'src/test') diff --git a/src/test/java/com/google/devtools/build/lib/BUILD b/src/test/java/com/google/devtools/build/lib/BUILD index b4c26b5ba3..7dbbf5f614 100644 --- a/src/test/java/com/google/devtools/build/lib/BUILD +++ b/src/test/java/com/google/devtools/build/lib/BUILD @@ -478,6 +478,7 @@ java_test( "//src/main/java/com/google/devtools/build/lib/actions", "//src/main/java/com/google/devtools/build/lib/rules/cpp", "//src/main/java/com/google/devtools/build/skyframe", + "//src/test/java/com/google/devtools/build/lib/skyframe:testutil", "//third_party:auto_value", "//third_party:guava", "//third_party:guava-testlib", diff --git a/src/test/java/com/google/devtools/build/lib/analysis/BuildViewTest.java b/src/test/java/com/google/devtools/build/lib/analysis/BuildViewTest.java index d48756ad1b..0aab4dddae 100644 --- a/src/test/java/com/google/devtools/build/lib/analysis/BuildViewTest.java +++ b/src/test/java/com/google/devtools/build/lib/analysis/BuildViewTest.java @@ -48,6 +48,7 @@ import com.google.devtools.build.lib.packages.Rule; import com.google.devtools.build.lib.pkgcache.LoadingFailedException; import com.google.devtools.build.lib.skyframe.SkyFunctions; import com.google.devtools.build.lib.skyframe.TargetPatternValue.TargetPatternKey; +import com.google.devtools.build.lib.skyframe.util.SkyframeExecutorTestUtils; import com.google.devtools.build.lib.testutil.Suite; import com.google.devtools.build.lib.testutil.TestSpec; import com.google.devtools.build.lib.testutil.TestUtils; @@ -1265,12 +1266,18 @@ public class BuildViewTest extends BuildViewTestBase { scratch.file("foo/BUILD", "rule_with_latebound_split(", " name = 'foo')", - "sh_binary(", - " name = 'latebound_dep',", - " srcs = ['latebound_dep.sh'])"); + "rule_with_test_fragment(", + " name = 'latebound_dep')"); update("//foo:foo"); assertNotNull(getConfiguredTarget("//foo:foo")); - // TODO(bazel-team): also check that the dep is created in each expected configuration. + Iterable deps = SkyframeExecutorTestUtils.getExistingConfiguredTargets( + skyframeExecutor, Label.parseAbsolute("//foo:latebound_dep")); + assertThat(deps).hasSize(2); + assertThat( + ImmutableList.of( + LateBoundSplitUtil.getOptions(Iterables.get(deps, 0).getConfiguration()).fooFlag, + LateBoundSplitUtil.getOptions(Iterables.get(deps, 1).getConfiguration()).fooFlag)) + .containsExactly("one", "two"); } /** Runs the same test with the reduced loading phase. */ diff --git a/src/test/java/com/google/devtools/build/lib/analysis/LateBoundSplitUtil.java b/src/test/java/com/google/devtools/build/lib/analysis/LateBoundSplitUtil.java index a6a2480786..ce01c8fab9 100644 --- a/src/test/java/com/google/devtools/build/lib/analysis/LateBoundSplitUtil.java +++ b/src/test/java/com/google/devtools/build/lib/analysis/LateBoundSplitUtil.java @@ -44,7 +44,7 @@ public class LateBoundSplitUtil { /** * A custom {@link FragmentOptions} with the option to be split. */ - public static class Options extends FragmentOptions { // public for options loader + public static class TestOptions extends FragmentOptions { // public for options loader @Option( name = "foo", defaultValue = "", @@ -66,9 +66,9 @@ public class LateBoundSplitUtil { @Override public List split(BuildOptions buildOptions) { BuildOptions split1 = buildOptions.clone(); - split1.get(Options.class).fooFlag = "one"; + split1.get(TestOptions.class).fooFlag = "one"; BuildOptions split2 = buildOptions.clone(); - split2.get(Options.class).fooFlag = "two"; + split2.get(TestOptions.class).fooFlag = "two"; return ImmutableList.of(split1, split2); } @@ -81,7 +81,7 @@ public class LateBoundSplitUtil { /** * The {@link BuildConfiguration.Fragment} that contains the options. */ - private static class Fragment extends BuildConfiguration.Fragment { + private static class TestFragment extends BuildConfiguration.Fragment { } /** @@ -92,17 +92,17 @@ public class LateBoundSplitUtil { public BuildConfiguration.Fragment create(ConfigurationEnvironment env, BuildOptions buildOptions) throws InvalidConfigurationException { - return new Fragment(); + return new TestFragment(); } @Override public Class creates() { - return Fragment.class; + return TestFragment.class; } @Override public ImmutableSet> requiredOptions() { - return ImmutableSet.>of(Options.class); + return ImmutableSet.>of(TestOptions.class); } } @@ -129,7 +129,7 @@ public class LateBoundSplitUtil { .allowedRuleClasses(Attribute.ANY_RULE) .cfg(SIMPLE_SPLIT) .value(SIMPLE_LATEBOUND_RESOLVER)) - .requiresConfigurationFragments(Fragment.class) + .requiresConfigurationFragments(TestFragment.class) .build(); } @@ -143,6 +143,27 @@ public class LateBoundSplitUtil { } } + /** + * A custom rule that requires {@link TestFragment}. + */ + static class RuleWithTestFragment implements RuleDefinition { + @Override + public RuleClass build(RuleClass.Builder builder, RuleDefinitionEnvironment environment) { + return builder + .requiresConfigurationFragments(TestFragment.class) + .build(); + } + + @Override + public Metadata getMetadata() { + return RuleDefinition.Metadata.builder() + .name("rule_with_test_fragment") + .ancestors(BaseRuleClasses.RuleBase.class) + .factoryClass(UnknownRuleConfiguredTarget.class) + .build(); + } + } + /** * Returns a rule class provider with standard test setup plus the above rules/configs. */ @@ -150,8 +171,16 @@ public class LateBoundSplitUtil { ConfiguredRuleClassProvider.Builder builder = new ConfiguredRuleClassProvider.Builder(); TestRuleClassProvider.addStandardRules(builder); builder.addRuleDefinition(new RuleWithLateBoundSplitAttribute()); + builder.addRuleDefinition(new RuleWithTestFragment()); builder.addConfigurationFragment(new FragmentLoader()); - builder.addConfigurationOptions(Options.class); + builder.addConfigurationOptions(TestOptions.class); return builder.build(); } + + /** + * Returns the {@link TestOptions} from the given configuration. + */ + static TestOptions getOptions(BuildConfiguration config) { + return config.getOptions().get(TestOptions.class); + } } \ No newline at end of file diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/util/SkyframeExecutorTestUtils.java b/src/test/java/com/google/devtools/build/lib/skyframe/util/SkyframeExecutorTestUtils.java index 7c7c4f9a6c..34218e67c8 100644 --- a/src/test/java/com/google/devtools/build/lib/skyframe/util/SkyframeExecutorTestUtils.java +++ b/src/test/java/com/google/devtools/build/lib/skyframe/util/SkyframeExecutorTestUtils.java @@ -13,7 +13,9 @@ // limitations under the License. package com.google.devtools.build.lib.skyframe.util; +import com.google.common.base.Predicate; import com.google.common.collect.ImmutableList; +import com.google.common.collect.Iterables; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import com.google.devtools.build.lib.analysis.ConfiguredTarget; @@ -104,6 +106,23 @@ public class SkyframeExecutorTestUtils { return value.getConfiguredTarget(); } + /** + * Returns all configured targets currently in the graph with the given label. + * + *

Unlike {@link #getExistingConfiguredTarget(SkyframeExecutor, Label, BuildConfiguration)}, + * this doesn't make the caller request a specific configuration. + */ + public static Iterable getExistingConfiguredTargets( + SkyframeExecutor skyframeExecutor, final Label label) { + return Iterables.filter(getAllExistingConfiguredTargets(skyframeExecutor), + new Predicate() { + @Override + public boolean apply(ConfiguredTarget input) { + return input.getTarget().getLabel().equals(label); + } + }); + } + /** * Returns all configured targets currently in the graph. */ -- cgit v1.2.3