diff options
author | dslomov <dslomov@google.com> | 2017-05-02 16:26:39 +0200 |
---|---|---|
committer | Damien Martin-Guillerez <dmarting@google.com> | 2017-05-03 10:44:40 +0200 |
commit | f969734be768e7e941bbc3a7ed98c30908e2b261 (patch) | |
tree | 016fa1af773e260ca63a2f28f5b696e1116d8959 /src/test/java/com | |
parent | 430aca72c4e52f51d530df027ee2a4c0cfb6da40 (diff) |
Implement OutputGroupInfo provider.
Work towards #2894.
RELNOTES: None.
PiperOrigin-RevId: 154829065
Diffstat (limited to 'src/test/java/com')
3 files changed, 263 insertions, 27 deletions
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewTestCase.java b/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewTestCase.java index a41b3b6c20..866830fa63 100644 --- a/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewTestCase.java +++ b/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewTestCase.java @@ -666,7 +666,7 @@ public abstract class BuildViewTestCase extends FoundationTestCase { protected Action getGeneratingActionInOutputGroup( ConfiguredTarget target, String outputName, String outputGroupName) { NestedSet<Artifact> outputGroup = - target.getProvider(OutputGroupProvider.class).getOutputGroup(outputGroupName); + OutputGroupProvider.get(target).getOutputGroup(outputGroupName); return getGeneratingAction(outputName, outputGroup, "outputGroup/" + outputGroupName); } @@ -1401,7 +1401,7 @@ public abstract class BuildViewTestCase extends FoundationTestCase { protected NestedSet<Artifact> getOutputGroup( TransitiveInfoCollection target, String outputGroup) { - OutputGroupProvider provider = target.getProvider(OutputGroupProvider.class); + OutputGroupProvider provider = OutputGroupProvider.get(target); return provider == null ? NestedSetBuilder.<Artifact>emptySet(Order.STABLE_ORDER) : provider.getOutputGroup(outputGroup); diff --git a/src/test/java/com/google/devtools/build/lib/skylark/SkylarkAspectsTest.java b/src/test/java/com/google/devtools/build/lib/skylark/SkylarkAspectsTest.java index a52ee89a5a..59b637e3fa 100644 --- a/src/test/java/com/google/devtools/build/lib/skylark/SkylarkAspectsTest.java +++ b/src/test/java/com/google/devtools/build/lib/skylark/SkylarkAspectsTest.java @@ -421,13 +421,46 @@ public class SkylarkAspectsTest extends AnalysisTestCase { update(ImmutableList.of("test/aspect.bzl%MyAspect"), "//test:xxx"); assertThat(getLabelsToBuild(analysisResult)).containsExactly("//test:xxx"); AspectValue aspectValue = analysisResult.getAspects().iterator().next(); - OutputGroupProvider outputGroupProvider = - aspectValue.getConfiguredAspect().getProvider(OutputGroupProvider.class); + OutputGroupProvider outputGroupProvider = OutputGroupProvider.get( + aspectValue.getConfiguredAspect()); + assertThat(outputGroupProvider).isNotNull(); NestedSet<Artifact> names = outputGroupProvider.getOutputGroup("my_result"); assertThat(names).isNotEmpty(); - NestedSet<Artifact> expectedSet = getConfiguredTarget("//test:xxx") - .getProvider(OutputGroupProvider.class) + NestedSet<Artifact> expectedSet = OutputGroupProvider.get(getConfiguredTarget("//test:xxx")) + .getOutputGroup(OutputGroupProvider.HIDDEN_TOP_LEVEL); + assertThat(names).containsExactlyElementsIn(expectedSet); + } + + @Test + public void aspectWithOutputGroupsDeclaredProvider() throws Exception { + scratch.file( + "test/aspect.bzl", + "def _impl(target, ctx):", + " f = target[OutputGroupInfo]._hidden_top_level" + INTERNAL_SUFFIX, + " return [OutputGroupInfo(my_result = f)]", + "", + "MyAspect = aspect(", + " implementation=_impl,", + ")"); + scratch.file( + "test/BUILD", + "java_library(", + " name = 'xxx',", + " srcs = ['A.java'],", + ")"); + + AnalysisResult analysisResult = + update(ImmutableList.of("test/aspect.bzl%MyAspect"), "//test:xxx"); + assertThat(getLabelsToBuild(analysisResult)).containsExactly("//test:xxx"); + AspectValue aspectValue = analysisResult.getAspects().iterator().next(); + OutputGroupProvider outputGroupProvider = OutputGroupProvider.get( + aspectValue.getConfiguredAspect()); + + assertThat(outputGroupProvider).isNotNull(); + NestedSet<Artifact> names = outputGroupProvider.getOutputGroup("my_result"); + assertThat(names).isNotEmpty(); + NestedSet<Artifact> expectedSet = OutputGroupProvider.get(getConfiguredTarget("//test:xxx")) .getOutputGroup(OutputGroupProvider.HIDDEN_TOP_LEVEL); assertThat(names).containsExactlyElementsIn(expectedSet); } @@ -465,12 +498,53 @@ public class SkylarkAspectsTest extends AnalysisTestCase { .containsExactly("//test:xxx"); AspectValue aspectValue = analysisResult.getAspects().iterator().next(); OutputGroupProvider outputGroupProvider = - aspectValue.getConfiguredAspect().getProvider(OutputGroupProvider.class); + OutputGroupProvider.get(aspectValue.getConfiguredAspect()); assertThat(outputGroupProvider).isNotNull(); NestedSet<Artifact> names = outputGroupProvider.getOutputGroup("my_result"); assertThat(names).isNotEmpty(); - NestedSet<Artifact> expectedSet = getConfiguredTarget("//test:xxx") - .getProvider(OutputGroupProvider.class) + NestedSet<Artifact> expectedSet = OutputGroupProvider.get(getConfiguredTarget("//test:xxx")) + .getOutputGroup(OutputGroupProvider.HIDDEN_TOP_LEVEL); + assertThat(names).containsExactlyElementsIn(expectedSet); + } + + @Test + public void aspectWithOutputGroupsAsListDeclaredProvider() throws Exception { + scratch.file( + "test/aspect.bzl", + "def _impl(target, ctx):", + " g = target[OutputGroupInfo]._hidden_top_level" + INTERNAL_SUFFIX, + " return [OutputGroupInfo(my_result= [ f for f in g])]", + "", + "MyAspect = aspect(", + " implementation=_impl,", + ")"); + scratch.file( + "test/BUILD", + "java_library(", + " name = 'xxx',", + " srcs = ['A.java'],", + ")"); + + AnalysisResult analysisResult = + update(ImmutableList.of("test/aspect.bzl%MyAspect"), "//test:xxx"); + assertThat( + transform( + analysisResult.getTargetsToBuild(), + new Function<ConfiguredTarget, String>() { + @Nullable + @Override + public String apply(ConfiguredTarget configuredTarget) { + return configuredTarget.getLabel().toString(); + } + })) + .containsExactly("//test:xxx"); + AspectValue aspectValue = analysisResult.getAspects().iterator().next(); + OutputGroupProvider outputGroupProvider = + OutputGroupProvider.get(aspectValue.getConfiguredAspect()); + assertThat(outputGroupProvider).isNotNull(); + NestedSet<Artifact> names = outputGroupProvider.getOutputGroup("my_result"); + assertThat(names).isNotEmpty(); + NestedSet<Artifact> expectedSet = OutputGroupProvider.get(getConfiguredTarget("//test:xxx")) .getOutputGroup(OutputGroupProvider.HIDDEN_TOP_LEVEL); assertThat(names).containsExactlyElementsIn(expectedSet); } @@ -863,6 +937,69 @@ public class SkylarkAspectsTest extends AnalysisTestCase { } @Test + public void outputGroupsFromOneAspect() throws Exception { + scratch.file( + "test/aspect.bzl", + "def _a1_impl(target, ctx):", + " f = ctx.new_file(target.label.name + '_a1.txt')", + " ctx.file_action(f, 'f')", + " return struct(output_groups = { 'a1_group' : depset([f]) })", + "", + "a1 = aspect(implementation=_a1_impl, attr_aspects = ['dep'])", + "def _rule_impl(ctx):", + " if not ctx.attr.dep:", + " return struct()", + " og = {k:ctx.attr.dep.output_groups[k] for k in ctx.attr.dep.output_groups}", + " return struct(output_groups = og)", + "my_rule1 = rule(_rule_impl, attrs = { 'dep' : attr.label(aspects = [a1]) })" + ); + scratch.file( + "test/BUILD", + "load(':aspect.bzl', 'my_rule1')", + "my_rule1(name = 'base')", + "my_rule1(name = 'xxx', dep = ':base')" + ); + + + AnalysisResult analysisResult = update("//test:xxx"); + OutputGroupProvider outputGroupProvider = + OutputGroupProvider.get(Iterables.getOnlyElement(analysisResult.getTargetsToBuild())); + assertThat(getOutputGroupContents(outputGroupProvider, "a1_group")) + .containsExactly("test/base_a1.txt"); + } + + @Test + public void outputGroupsDeclaredProviderFromOneAspect() throws Exception { + scratch.file( + "test/aspect.bzl", + "def _a1_impl(target, ctx):", + " f = ctx.new_file(target.label.name + '_a1.txt')", + " ctx.file_action(f, 'f')", + " return [OutputGroupInfo(a1_group = depset([f]))]", + "", + "a1 = aspect(implementation=_a1_impl, attr_aspects = ['dep'])", + "def _rule_impl(ctx):", + " if not ctx.attr.dep:", + " return struct()", + " return [OutputGroupInfo(a1_group = ctx.attr.dep[OutputGroupInfo].a1_group)]", + "my_rule1 = rule(_rule_impl, attrs = { 'dep' : attr.label(aspects = [a1]) })" + ); + scratch.file( + "test/BUILD", + "load(':aspect.bzl', 'my_rule1')", + "my_rule1(name = 'base')", + "my_rule1(name = 'xxx', dep = ':base')" + ); + + + AnalysisResult analysisResult = update("//test:xxx"); + OutputGroupProvider outputGroupProvider = + OutputGroupProvider.get(Iterables.getOnlyElement(analysisResult.getTargetsToBuild())); + assertThat(getOutputGroupContents(outputGroupProvider, "a1_group")) + .containsExactly("test/base_a1.txt"); + } + + @Test public void outputGroupsFromTwoAspects() throws Exception { scratch.file( "test/aspect.bzl", @@ -896,15 +1033,60 @@ public class SkylarkAspectsTest extends AnalysisTestCase { AnalysisResult analysisResult = update("//test:yyy"); OutputGroupProvider outputGroupProvider = - Iterables - .getOnlyElement(analysisResult.getTargetsToBuild()) - .getProvider(OutputGroupProvider.class); + OutputGroupProvider.get(Iterables.getOnlyElement(analysisResult.getTargetsToBuild())); + assertThat(getOutputGroupContents(outputGroupProvider, "a1_group")) + .containsExactly("test/base_a1.txt"); + assertThat(getOutputGroupContents(outputGroupProvider, "a2_group")) + .containsExactly("test/xxx_a2.txt"); + } + + @Test + public void outputGroupsDeclaredProvidersFromTwoAspects() throws Exception { + scratch.file( + "test/aspect.bzl", + "def _a1_impl(target, ctx):", + " f = ctx.new_file(target.label.name + '_a1.txt')", + " ctx.file_action(f, 'f')", + " return [OutputGroupInfo(a1_group = depset([f]))]", + "", + "a1 = aspect(implementation=_a1_impl, attr_aspects = ['dep'])", + "def _rule_impl(ctx):", + " if not ctx.attr.dep:", + " return struct()", + " og = dict()", + " dep_og = ctx.attr.dep[OutputGroupInfo]", + " if hasattr(dep_og, 'a1_group'):", + " og['a1_group'] = dep_og.a1_group", + " if hasattr(dep_og, 'a2_group'):", + " og['a2_group'] = dep_og.a2_group", + " return [OutputGroupInfo(**og)]", + "my_rule1 = rule(_rule_impl, attrs = { 'dep' : attr.label(aspects = [a1]) })", + "def _a2_impl(target, ctx):", + " g = ctx.new_file(target.label.name + '_a2.txt')", + " ctx.file_action(g, 'f')", + " return [OutputGroupInfo(a2_group = depset([g]))]", + "", + "a2 = aspect(implementation=_a2_impl, attr_aspects = ['dep'])", + "my_rule2 = rule(_rule_impl, attrs = { 'dep' : attr.label(aspects = [a2]) })"); + scratch.file( + "test/BUILD", + "load(':aspect.bzl', 'my_rule1', 'my_rule2')", + "my_rule1(name = 'base')", + "my_rule1(name = 'xxx', dep = ':base')", + "my_rule2(name = 'yyy', dep = ':xxx')" + ); + + + AnalysisResult analysisResult = update("//test:yyy"); + OutputGroupProvider outputGroupProvider = + OutputGroupProvider.get(Iterables.getOnlyElement(analysisResult.getTargetsToBuild())); assertThat(getOutputGroupContents(outputGroupProvider, "a1_group")) .containsExactly("test/base_a1.txt"); assertThat(getOutputGroupContents(outputGroupProvider, "a2_group")) .containsExactly("test/xxx_a2.txt"); } + @Test public void duplicateOutputGroupsFromTwoAspects() throws Exception { scratch.file( diff --git a/src/test/java/com/google/devtools/build/lib/skylark/SkylarkIntegrationTest.java b/src/test/java/com/google/devtools/build/lib/skylark/SkylarkIntegrationTest.java index 52dcc451a6..02abf93947 100644 --- a/src/test/java/com/google/devtools/build/lib/skylark/SkylarkIntegrationTest.java +++ b/src/test/java/com/google/devtools/build/lib/skylark/SkylarkIntegrationTest.java @@ -175,8 +175,7 @@ public class SkylarkIntegrationTest extends BuildViewTestCase { "cc_binary(name = 'lib', data = ['a.txt'])", "my_rule(name='my', dep = ':lib')"); NestedSet<Artifact> hiddenTopLevelArtifacts = - getConfiguredTarget("//test/skylark:lib") - .getProvider(OutputGroupProvider.class) + OutputGroupProvider.get(getConfiguredTarget("//test/skylark:lib")) .getOutputGroup(OutputGroupProvider.HIDDEN_TOP_LEVEL); ConfiguredTarget myTarget = getConfiguredTarget("//test/skylark:my"); SkylarkNestedSet result = @@ -184,11 +183,40 @@ public class SkylarkIntegrationTest extends BuildViewTestCase { .getProvider(SkylarkProviders.class) .getValue("result"); assertThat(result.getSet(Artifact.class)).containsExactlyElementsIn(hiddenTopLevelArtifacts); - assertThat(myTarget.getProvider(OutputGroupProvider.class).getOutputGroup("my_group")) + assertThat(OutputGroupProvider.get(myTarget).getOutputGroup("my_group")) .containsExactlyElementsIn(hiddenTopLevelArtifacts); } @Test + public void testOutputGroupsDeclaredProvider() throws Exception { + scratch.file( + "test/skylark/extension.bzl", + "def _impl(ctx):", + " f = ctx.attr.dep[OutputGroupInfo]._hidden_top_level" + INTERNAL_SUFFIX, + " return struct(result = f, ", + " providers = [OutputGroupInfo(my_group = f)])", + "my_rule = rule(implementation = _impl,", + " attrs = { 'dep' : attr.label() })"); + scratch.file( + "test/skylark/BUILD", + "load('/test/skylark/extension', 'my_rule')", + "cc_binary(name = 'lib', data = ['a.txt'])", + "my_rule(name='my', dep = ':lib')"); + NestedSet<Artifact> hiddenTopLevelArtifacts = + OutputGroupProvider.get(getConfiguredTarget("//test/skylark:lib")) + .getOutputGroup(OutputGroupProvider.HIDDEN_TOP_LEVEL); + ConfiguredTarget myTarget = getConfiguredTarget("//test/skylark:my"); + SkylarkNestedSet result = + (SkylarkNestedSet) myTarget + .getProvider(SkylarkProviders.class) + .getValue("result"); + assertThat(result.getSet(Artifact.class)).containsExactlyElementsIn(hiddenTopLevelArtifacts); + assertThat(OutputGroupProvider.get(myTarget).getOutputGroup("my_group")) + .containsExactlyElementsIn(hiddenTopLevelArtifacts); + } + + + @Test public void testOutputGroupsAsDictionary() throws Exception { scratch.file( "test/skylark/extension.bzl", @@ -210,15 +238,13 @@ public class SkylarkIntegrationTest extends BuildViewTestCase { "cc_binary(name = 'lib', data = ['a.txt'])", "my_rule(name='my', dep = ':lib')"); NestedSet<Artifact> hiddenTopLevelArtifacts = - getConfiguredTarget("//test/skylark:lib") - .getProvider(OutputGroupProvider.class) + OutputGroupProvider.get(getConfiguredTarget("//test/skylark:lib")) .getOutputGroup(OutputGroupProvider.HIDDEN_TOP_LEVEL); ConfiguredTarget myTarget = getConfiguredTarget("//test/skylark:my"); - SkylarkProviders skylarkProviders = myTarget - .getProvider(SkylarkProviders.class); + SkylarkProviders skylarkProviders = myTarget.getProvider(SkylarkProviders.class); SkylarkNestedSet result = (SkylarkNestedSet) skylarkProviders.getValue("result"); assertThat(result.getSet(Artifact.class)).containsExactlyElementsIn(hiddenTopLevelArtifacts); - assertThat(myTarget.getProvider(OutputGroupProvider.class).getOutputGroup("my_group")) + assertThat(OutputGroupProvider.get(myTarget).getOutputGroup("my_group")) .containsExactlyElementsIn(hiddenTopLevelArtifacts); assertThat(skylarkProviders.getValue("has_key1")).isEqualTo(Boolean.TRUE); assertThat(skylarkProviders.getValue("has_key2")).isEqualTo(Boolean.FALSE); @@ -247,15 +273,14 @@ public class SkylarkIntegrationTest extends BuildViewTestCase { "cc_binary(name = 'lib', data = ['a.txt'])", "my_rule(name='my', dep = ':lib')"); NestedSet<Artifact> hiddenTopLevelArtifacts = - getConfiguredTarget("//test/skylark:lib") - .getProvider(OutputGroupProvider.class) + OutputGroupProvider.get(getConfiguredTarget("//test/skylark:lib")) .getOutputGroup(OutputGroupProvider.HIDDEN_TOP_LEVEL); ConfiguredTarget myTarget = getConfiguredTarget("//test/skylark:my"); SkylarkProviders skylarkProviders = myTarget .getProvider(SkylarkProviders.class); SkylarkNestedSet result = (SkylarkNestedSet) skylarkProviders.getValue("result"); assertThat(result.getSet(Artifact.class)).containsExactlyElementsIn(hiddenTopLevelArtifacts); - assertThat(myTarget.getProvider(OutputGroupProvider.class).getOutputGroup("my_group")) + assertThat(OutputGroupProvider.get(myTarget).getOutputGroup("my_group")) .containsExactlyElementsIn(hiddenTopLevelArtifacts); } @@ -276,18 +301,47 @@ public class SkylarkIntegrationTest extends BuildViewTestCase { "cc_binary(name = 'lib', data = ['a.txt'])", "my_rule(name='my', dep = ':lib')"); NestedSet<Artifact> hiddenTopLevelArtifacts = - getConfiguredTarget("//test/skylark:lib") - .getProvider(OutputGroupProvider.class) + OutputGroupProvider.get(getConfiguredTarget("//test/skylark:lib")) .getOutputGroup(OutputGroupProvider.HIDDEN_TOP_LEVEL); ConfiguredTarget myTarget = getConfiguredTarget("//test/skylark:my"); SkylarkNestedSet result = (SkylarkNestedSet) myTarget.getProvider(SkylarkProviders.class).getValue("result"); assertThat(result.getSet(Artifact.class)).containsExactlyElementsIn(hiddenTopLevelArtifacts); - assertThat(myTarget.getProvider(OutputGroupProvider.class).getOutputGroup("my_group")) + assertThat(OutputGroupProvider.get(myTarget).getOutputGroup("my_group")) .containsExactlyElementsIn(hiddenTopLevelArtifacts); - assertThat(myTarget.getProvider(OutputGroupProvider.class).getOutputGroup("my_empty_group")) + assertThat(OutputGroupProvider.get(myTarget).getOutputGroup("my_empty_group")) .isEmpty(); } + + @Test + public void testOutputGroupsDeclaredProviderWithList() throws Exception { + scratch.file( + "test/skylark/extension.bzl", + "def _impl(ctx):", + " f = ctx.attr.dep[OutputGroupInfo]._hidden_top_level" + INTERNAL_SUFFIX, + " g = list(f)", + " return struct(result = f, ", + " providers = [OutputGroupInfo(my_group = g, my_empty_group = [])])", + "my_rule = rule(implementation = _impl,", + " attrs = { 'dep' : attr.label() })"); + scratch.file( + "test/skylark/BUILD", + "load('/test/skylark/extension', 'my_rule')", + "cc_binary(name = 'lib', data = ['a.txt'])", + "my_rule(name='my', dep = ':lib')"); + NestedSet<Artifact> hiddenTopLevelArtifacts = + OutputGroupProvider.get(getConfiguredTarget("//test/skylark:lib")) + .getOutputGroup(OutputGroupProvider.HIDDEN_TOP_LEVEL); + ConfiguredTarget myTarget = getConfiguredTarget("//test/skylark:my"); + SkylarkNestedSet result = + (SkylarkNestedSet) myTarget.getProvider(SkylarkProviders.class).getValue("result"); + assertThat(result.getSet(Artifact.class)).containsExactlyElementsIn(hiddenTopLevelArtifacts); + assertThat(OutputGroupProvider.get(myTarget).getOutputGroup("my_group")) + .containsExactlyElementsIn(hiddenTopLevelArtifacts); + assertThat(OutputGroupProvider.get(myTarget).getOutputGroup("my_empty_group")) + .isEmpty(); + } + @Test public void testStackTraceErrorInFunction() throws Exception { runStackTraceTest( |