aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/test/java/com
diff options
context:
space:
mode:
authorGravatar Dmitry Lomov <dslomov@google.com>2016-09-27 08:49:26 +0000
committerGravatar Yun Peng <pcloudy@google.com>2016-09-27 09:07:07 +0000
commitbb5901ba0474eb2ddd035502663026bcb0c05b7c (patch)
treed2e8d5ed329dcfa35b9de045ca87225ffe2b2071 /src/test/java/com
parent6cfe704a2ed2cfce3f9931f42ac55ddb70252642 (diff)
Allow aspects to propagate to all attributes.
-- MOS_MIGRATED_REVID=134378592
Diffstat (limited to 'src/test/java/com')
-rw-r--r--src/test/java/com/google/devtools/build/lib/analysis/AspectDefinitionTest.java27
-rw-r--r--src/test/java/com/google/devtools/build/lib/analysis/AspectTest.java74
-rw-r--r--src/test/java/com/google/devtools/build/lib/analysis/DependencyResolverTest.java14
-rw-r--r--src/test/java/com/google/devtools/build/lib/analysis/util/TestAspects.java113
4 files changed, 220 insertions, 8 deletions
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/AspectDefinitionTest.java b/src/test/java/com/google/devtools/build/lib/analysis/AspectDefinitionTest.java
index 4bf2c55102..667af95af3 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/AspectDefinitionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/AspectDefinitionTest.java
@@ -31,7 +31,6 @@ import com.google.devtools.build.lib.packages.NativeAspectClass;
import com.google.devtools.build.lib.packages.Rule;
import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
import com.google.devtools.build.lib.util.FileTypeSet;
-
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
@@ -121,8 +120,30 @@ public class AspectDefinitionTest {
.attributeAspect("srcs", TEST_ASPECT_CLASS)
.attributeAspect("deps", TEST_ASPECT_CLASS)
.build();
- assertThat(withAspects.getAttributeAspects()).containsEntry("srcs", TEST_ASPECT_CLASS);
- assertThat(withAspects.getAttributeAspects()).containsEntry("deps", TEST_ASPECT_CLASS);
+
+ assertThat(withAspects.getAttributeAspects(createLabelListAttribute("srcs")))
+ .containsExactly(TEST_ASPECT_CLASS);
+ assertThat(withAspects.getAttributeAspects(createLabelListAttribute("deps")))
+ .containsExactly(TEST_ASPECT_CLASS);
+ }
+
+ @Test
+ public void testAttributeAspect_AllAttributes() throws Exception {
+ AspectDefinition withAspects = new AspectDefinition.Builder("attribute_aspect")
+ .allAttributesAspect(TEST_ASPECT_CLASS)
+ .build();
+
+ assertThat(withAspects.getAttributeAspects(createLabelListAttribute("srcs")))
+ .containsExactly(TEST_ASPECT_CLASS);
+ assertThat(withAspects.getAttributeAspects(createLabelListAttribute("deps")))
+ .containsExactly(TEST_ASPECT_CLASS);
+ }
+
+
+ private static Attribute createLabelListAttribute(String name) {
+ return Attribute.attr(name, BuildType.LABEL_LIST)
+ .allowedFileTypes(FileTypeSet.ANY_FILE)
+ .build();
}
@Test
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/AspectTest.java b/src/test/java/com/google/devtools/build/lib/analysis/AspectTest.java
index 9274b759b0..a2e9d23191 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/AspectTest.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/AspectTest.java
@@ -425,6 +425,80 @@ public class AspectTest extends AnalysisTestCase {
a.getProvider(ExtraActionArtifactsProvider.class)
.getTransitiveExtraActionArtifacts();
assertThat(getOnlyElement(extraActionArtifacts).getLabel()).isEqualTo(Label.create("@//a", "b"));
+ }
+
+ @Test
+ public void aspectPropagatesToAllAttributes() throws Exception {
+ setRulesAvailableInTests(new TestAspects.BaseRule(),
+ new TestAspects.SimpleRule(),
+ new TestAspects.AllAttributesAspectRule());
+ pkg("a",
+ "simple(name='a', foo=[':b'], foo1=':c', txt='some text')",
+ "simple(name='b', foo=[], txt='some text')",
+ "simple(name='c', foo=[], txt='more text')",
+ "all_attributes_aspect(name='x', foo=[':a'])");
+
+ ConfiguredTarget a = getConfiguredTarget("//a:x");
+ assertThat(a.getProvider(RuleInfo.class).getData())
+ .containsExactly("aspect //a:a", "aspect //a:b", "aspect //a:c", "rule //a:x");
+ }
+
+ @Test
+ public void aspectPropagatesToAllAttributesImplicit() throws Exception {
+ setRulesAvailableInTests(new TestAspects.BaseRule(),
+ new TestAspects.SimpleRule(),
+ new TestAspects.ImplicitDepRule(),
+ new TestAspects.AllAttributesAspectRule());
+
+ scratch.file(
+ "extra/BUILD",
+ "simple(name ='extra')"
+ );
+ pkg("a",
+ "simple(name='a', foo=[':b'], foo1=':c', txt='some text')",
+ "simple(name='b', foo=[], txt='some text')",
+ "implicit_dep(name='c')",
+ "all_attributes_aspect(name='x', foo=[':a'])");
+ update();
+ ConfiguredTarget a = getConfiguredTarget("//a:x");
+ assertThat(a.getProvider(RuleInfo.class).getData())
+ .containsExactly(
+ "aspect //a:a",
+ "aspect //a:b",
+ "aspect //a:c",
+ "aspect //extra:extra",
+ "rule //a:x");
}
+
+
+ @Test
+ public void aspectPropagatesToAllAttributesLateBound() throws Exception {
+ setRulesAvailableInTests(new TestAspects.BaseRule(),
+ new TestAspects.SimpleRule(),
+ new TestAspects.LateBoundDepRule(),
+ new TestAspects.AllAttributesAspectRule());
+
+ scratch.file(
+ "extra/BUILD",
+ "simple(name ='extra')"
+ );
+ pkg("a",
+ "simple(name='a', foo=[':b'], foo1=':c', txt='some text')",
+ "simple(name='b', foo=[], txt='some text')",
+ "late_bound_dep(name='c')",
+ "all_attributes_aspect(name='x', foo=[':a'])");
+ useConfiguration("--plugin=//extra:extra");
+ update();
+
+ ConfiguredTarget a = getConfiguredTarget("//a:x");
+ assertThat(a.getProvider(RuleInfo.class).getData())
+ .containsExactly(
+ "aspect //a:a",
+ "aspect //a:b",
+ "aspect //a:c",
+ "aspect //extra:extra",
+ "rule //a:x");
+ }
+
}
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/DependencyResolverTest.java b/src/test/java/com/google/devtools/build/lib/analysis/DependencyResolverTest.java
index be4988ecaf..d498709148 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/DependencyResolverTest.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/DependencyResolverTest.java
@@ -33,7 +33,6 @@ import com.google.devtools.build.lib.packages.NoSuchTargetException;
import com.google.devtools.build.lib.packages.NoSuchThingException;
import com.google.devtools.build.lib.packages.Target;
import com.google.devtools.build.lib.util.OrderedSetMultimap;
-
import java.util.List;
import java.util.Set;
import javax.annotation.Nullable;
@@ -162,6 +161,19 @@ public class DependencyResolverTest extends AnalysisTestCase {
}
@Test
+ public void hasAllAttributesAspect() throws Exception {
+ setRulesAvailableInTests(new TestAspects.BaseRule(), new TestAspects.SimpleRule());
+ pkg("a",
+ "simple(name='a', foo=[':b'])",
+ "simple(name='b', foo=[])");
+ OrderedSetMultimap<Attribute, Dependency> map =
+ dependentNodeMap("//a:a", TestAspects.ALL_ATTRIBUTES_ASPECT);
+ assertDep(
+ map, "foo", "//a:b",
+ new AspectDescriptor(TestAspects.ALL_ATTRIBUTES_ASPECT));
+ }
+
+ @Test
public void hasAspectDependencies() throws Exception {
setRulesAvailableInTests(new TestAspects.BaseRule());
pkg("a", "base(name='a')");
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/util/TestAspects.java b/src/test/java/com/google/devtools/build/lib/analysis/util/TestAspects.java
index 351ae384ef..263a795dbf 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/util/TestAspects.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/util/TestAspects.java
@@ -38,6 +38,7 @@ import com.google.devtools.build.lib.analysis.Runfiles;
import com.google.devtools.build.lib.analysis.RunfilesProvider;
import com.google.devtools.build.lib.analysis.TransitiveInfoCollection;
import com.google.devtools.build.lib.analysis.TransitiveInfoProvider;
+import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
import com.google.devtools.build.lib.cmdline.Label;
import com.google.devtools.build.lib.cmdline.LabelSyntaxException;
import com.google.devtools.build.lib.collect.nestedset.NestedSet;
@@ -47,12 +48,14 @@ import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
import com.google.devtools.build.lib.packages.AspectDefinition;
import com.google.devtools.build.lib.packages.AspectParameters;
import com.google.devtools.build.lib.packages.Attribute.LateBoundLabel;
+import com.google.devtools.build.lib.packages.Attribute.LateBoundLabelList;
import com.google.devtools.build.lib.packages.AttributeMap;
import com.google.devtools.build.lib.packages.NativeAspectClass;
import com.google.devtools.build.lib.packages.Rule;
import com.google.devtools.build.lib.packages.RuleClass;
import com.google.devtools.build.lib.packages.RuleClass.Builder;
import com.google.devtools.build.lib.rules.RuleConfiguredTargetFactory;
+import com.google.devtools.build.lib.syntax.Type;
import com.google.devtools.build.lib.util.FileTypeSet;
import java.util.List;
@@ -116,12 +119,19 @@ public class TestAspects {
private static NestedSet<String> collectAspectData(String me, RuleContext ruleContext) {
NestedSetBuilder<String> result = new NestedSetBuilder<>(Order.STABLE_ORDER);
result.add(me);
- if (ruleContext.attributes().has("foo", LABEL_LIST)) {
- for (AspectInfo dep : ruleContext.getPrerequisites("foo", Mode.TARGET, AspectInfo.class)) {
- result.addTransitive(dep.getData());
+
+ Iterable<String> attributeNames = ruleContext.attributes().getAttributeNames();
+ for (String attributeName : attributeNames) {
+ Type<?> attributeType = ruleContext.attributes().getAttributeType(attributeName);
+ if (!LABEL.equals(attributeType) && !LABEL_LIST.equals(attributeType)) {
+ continue;
+ }
+ Iterable<AspectInfo> prerequisites = ruleContext
+ .getPrerequisites(attributeName, Mode.DONT_CHECK, AspectInfo.class);
+ for (AspectInfo prerequisite : prerequisites) {
+ result.addTransitive(prerequisite.getData());
}
}
-
return result.build();
}
@@ -212,6 +222,24 @@ public class TestAspects {
.build();
/**
+ * An aspect that propagates along all attributes.
+ */
+ public static class AllAttributesAspect extends BaseAspect {
+
+ @Override
+ public AspectDefinition getDefinition(AspectParameters aspectParameters) {
+ return ALL_ATTRIBUTES_ASPECT_DEFINITION;
+ }
+ }
+ public static final NativeAspectClass ALL_ATTRIBUTES_ASPECT = new AllAttributesAspect();
+ private static final AspectDefinition ALL_ATTRIBUTES_ASPECT_DEFINITION =
+ new AspectDefinition.Builder("all_attributes_aspect")
+ .allAttributesAspect(ALL_ATTRIBUTES_ASPECT)
+ .build();
+
+
+
+ /**
* An aspect that requires aspects on the attributes of rules it attaches to.
*/
public static class AttributeAspect extends BaseAspect {
@@ -525,6 +553,29 @@ public class TestAspects {
}
/**
+ * A rule that defines an {@link AllAttributesAspect} on one of its attributes.
+ */
+ public static class AllAttributesAspectRule implements RuleDefinition {
+
+ @Override
+ public RuleClass build(Builder builder, RuleDefinitionEnvironment environment) {
+ return builder
+ .add(attr("foo", LABEL_LIST).allowedFileTypes(FileTypeSet.ANY_FILE)
+ .aspect(ALL_ATTRIBUTES_ASPECT))
+ .build();
+ }
+
+ @Override
+ public Metadata getMetadata() {
+ return RuleDefinition.Metadata.builder()
+ .name("all_attributes_aspect")
+ .factoryClass(DummyRuleFactory.class)
+ .ancestors(BaseRule.class)
+ .build();
+ }
+ }
+
+ /**
* A rule that defines a {@link WarningAspect} on one of its attributes.
*/
public static class WarningAspectRule implements RuleDefinition {
@@ -578,6 +629,8 @@ public class TestAspects {
public RuleClass build(Builder builder, RuleDefinitionEnvironment environment) {
return builder
.add(attr("foo", LABEL_LIST).allowedFileTypes(FileTypeSet.ANY_FILE))
+ .add(attr("foo1", LABEL).allowedFileTypes(FileTypeSet.ANY_FILE))
+ .add(attr("txt", STRING))
.build();
}
@@ -634,4 +687,56 @@ public class TestAspects {
.build();
}
}
+
+ /**
+ * Rule with an implcit dependency.
+ */
+ public static class ImplicitDepRule implements RuleDefinition {
+ @Override
+ public RuleClass build(Builder builder, RuleDefinitionEnvironment environment) {
+ return builder
+ .add(attr("$dep", LABEL).value(Label.parseAbsoluteUnchecked("//extra:extra")))
+ .build();
+ }
+
+ @Override
+ public Metadata getMetadata() {
+ return RuleDefinition.Metadata.builder()
+ .name("implicit_dep")
+ .factoryClass(DummyRuleFactory.class)
+ .ancestors(BaseRule.class)
+ .build();
+ }
+ }
+
+ /**
+ * Rule with a late-bound dependency.
+ */
+ public static class LateBoundDepRule implements RuleDefinition {
+ private static final LateBoundLabelList<BuildConfiguration> PLUGINS_LABEL_LIST =
+ new LateBoundLabelList<BuildConfiguration>() {
+ @Override
+ public List<Label> resolve(Rule rule, AttributeMap attributes,
+ BuildConfiguration configuration) {
+ return configuration.getPlugins();
+ }
+ };
+
+ @Override
+ public RuleClass build(Builder builder, RuleDefinitionEnvironment environment) {
+ return builder
+ .add(attr(":plugins", LABEL_LIST).value(PLUGINS_LABEL_LIST))
+ .build();
+ }
+
+ @Override
+ public Metadata getMetadata() {
+ return RuleDefinition.Metadata.builder()
+ .name("late_bound_dep")
+ .factoryClass(DummyRuleFactory.class)
+ .ancestors(BaseRule.class)
+ .build();
+ }
+ }
+
}