aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/test/java/com/google
diff options
context:
space:
mode:
authorGravatar dslomov <dslomov@google.com>2017-07-14 11:34:24 +0200
committerGravatar László Csomor <laszlocsomor@google.com>2017-07-14 12:55:05 +0200
commitddc180a1e141d48a2440bab4ffe37b76b6ac731c (patch)
treefca9b7b1a90ee2e2a3f626ffa7d7d1b8da47c918 /src/test/java/com/google
parentbcde0ed7139041311d659fd013a178f0492dd72c (diff)
Aspects-on-aspects correctness fix.
Fixes an issue where an aspect propagates over a target that depends on another target twice with different set of aspects applied. RELNOTES: None. PiperOrigin-RevId: 161931168
Diffstat (limited to 'src/test/java/com/google')
-rw-r--r--src/test/java/com/google/devtools/build/lib/skylark/SkylarkAspectsTest.java62
1 files changed, 62 insertions, 0 deletions
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 d0185116e8..f9d10a90d9 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
@@ -2261,6 +2261,68 @@ public class SkylarkAspectsTest extends AnalysisTestCase {
"//test:r2_1=False");
}
+ /**
+ * r0 is a dependency of r1 via two attributes, dep1 and dep2.
+ * r1 sends an aspect 'a' along dep1 but not along dep2.
+ *
+ * rcollect depends upon r1 and sends another aspect, 'collector',
+ * along its dep dependency. 'collector' wants to see aspect 'a' and propagates along
+ * dep1 and dep2. It should be applied both to r0 and to r0+a.
+ */
+ @Test
+ public void multipleDepsDifferentAspects() throws Exception {
+ scratch.file(
+ "test/aspect.bzl",
+ "PAspect = provider()",
+ "PCollector = provider()",
+ "def _aspect_impl(target, ctx):",
+ " return [PAspect()]",
+ "a = aspect(_aspect_impl, attr_aspects = ['dep'], provides = [PAspect])",
+ "def _collector_impl(target, ctx):",
+ " suffix = '+PAspect' if PAspect in target else ''",
+ " result = [str(target.label)+suffix]",
+ " for a in ['dep', 'dep1', 'dep2']:",
+ " if hasattr(ctx.rule.attr, a):",
+ " result += getattr(ctx.rule.attr, a)[PCollector].result",
+ " return [PCollector(result=result)]",
+ "collector = aspect(_collector_impl, attr_aspects = ['*'], ",
+ " required_aspect_providers = [PAspect])",
+ "def _rimpl(ctx):",
+ " pass",
+ "r0 = rule(_rimpl)",
+ "r1 = rule(_rimpl, ",
+ " attrs = {",
+ " 'dep1' : attr.label(),",
+ " 'dep2' : attr.label(aspects = [a]),",
+ " },",
+ ")",
+ "def _rcollect_impl(ctx):",
+ " return [ctx.attr.dep[PCollector]]",
+ "rcollect = rule(_rcollect_impl,",
+ " attrs = {",
+ " 'dep' : attr.label(aspects = [collector]),",
+ " })"
+ );
+ scratch.file(
+ "test/BUILD",
+ "load(':aspect.bzl', 'r0', 'r1', 'rcollect')",
+ "r0(name = 'r0')",
+ "r1(name = 'r1', dep1 = ':r0', dep2 = ':r0')",
+ "rcollect(name = 'rcollect', dep = ':r1')"
+ );
+
+ AnalysisResult analysisResult = update(ImmutableList.of(), "//test:rcollect");
+ ConfiguredTarget configuredTarget =
+ Iterables.getOnlyElement(analysisResult.getTargetsToBuild());
+ SkylarkKey pCollector = new SkylarkKey(Label.parseAbsolute("//test:aspect.bzl"), "PCollector");
+ assertThat((SkylarkList<?>) configuredTarget.get(pCollector).getValue("result"))
+ .containsExactly(
+ "//test:r1",
+ "//test:r0",
+ "//test:r0+PAspect");
+ }
+
+
/** SkylarkAspectTest with "keep going" flag */
@RunWith(JUnit4.class)