aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/test/java/com/google/devtools/build/lib
diff options
context:
space:
mode:
authorGravatar Yun Peng <pcloudy@google.com>2016-02-23 18:37:44 +0000
committerGravatar Damien Martin-Guillerez <dmarting@google.com>2016-02-23 22:18:25 +0000
commit83fbb91a5a2afd15f0ab1e251812bd6692e0728a (patch)
tree1a402de1d2fbd15b6163b1a967c8fbede8743610 /src/test/java/com/google/devtools/build/lib
parent17129d4f838cd18b74551e0dd56e290975a6dc8c (diff)
Support "mandatoryProvidersList" in Skylark and added necessary tests
The type of attribute "providers" now is a list of lists of string. But a list of string is still supported. -- MOS_MIGRATED_REVID=115357326
Diffstat (limited to 'src/test/java/com/google/devtools/build/lib')
-rw-r--r--src/test/java/com/google/devtools/build/lib/generatedprojecttest/util/RuleSetUtils.java3
-rw-r--r--src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleClassFunctionsTest.java21
-rw-r--r--src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleContextTest.java77
-rw-r--r--src/test/java/com/google/devtools/build/lib/testutil/TestRuleClassProvider.java23
4 files changed, 123 insertions, 1 deletions
diff --git a/src/test/java/com/google/devtools/build/lib/generatedprojecttest/util/RuleSetUtils.java b/src/test/java/com/google/devtools/build/lib/generatedprojecttest/util/RuleSetUtils.java
index 2bb34a9f21..32b9c83782 100644
--- a/src/test/java/com/google/devtools/build/lib/generatedprojecttest/util/RuleSetUtils.java
+++ b/src/test/java/com/google/devtools/build/lib/generatedprojecttest/util/RuleSetUtils.java
@@ -48,7 +48,8 @@ public class RuleSetUtils {
RuleClassType.INVISIBLE.checkName(input);
return true;
} catch (IllegalArgumentException e) {
- return input.equals("testing_dummy_rule");
+ return input.equals("testing_dummy_rule")
+ || input.equals("testing_rule_for_mandatory_providers");
}
}
};
diff --git a/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleClassFunctionsTest.java b/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleClassFunctionsTest.java
index 4ecfd72d44..20c9a4c356 100644
--- a/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleClassFunctionsTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleClassFunctionsTest.java
@@ -184,6 +184,27 @@ public class SkylarkRuleClassFunctionsTest extends SkylarkTestCase {
}
@Test
+ public void testAttrWithProvidersList() throws Exception {
+ Attribute attr =
+ evalAttributeDefinition("attr.label_list(allow_files = True,"
+ + " providers = [['a', 'b'], ['c']])")
+ .build("a1");
+ assertThat(attr.getMandatoryProvidersList()).containsExactly(ImmutableSet.of("a", "b"),
+ ImmutableSet.of("c"));
+ }
+
+ @Test
+ public void testAttrWithWrongProvidersList() throws Exception {
+ checkErrorContains("Illegal argument: element in 'providers' is of unexpected type."
+ + " Should be list of string, but got list with an element of type int.",
+ "attr.label_list(allow_files = True, providers = [['a', 1], ['c']])");
+
+ checkErrorContains("Illegal argument: element in 'providers' is of unexpected type."
+ + " Should be list of string, but got string.",
+ "attr.label_list(allow_files = True, providers = [['a', 'b'], 'c'])");
+ }
+
+ @Test
public void testLabelListWithAspects() throws Exception {
SkylarkAttr.Descriptor attr =
(SkylarkAttr.Descriptor) evalRuleClassCode(
diff --git a/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleContextTest.java b/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleContextTest.java
index fe6003c8c8..7f595157b7 100644
--- a/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleContextTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleContextTest.java
@@ -180,6 +180,83 @@ public class SkylarkRuleContextTest extends SkylarkTestCase {
}
}
+ @Test
+ public void testMandatoryProvidersListWithSkylark() throws Exception {
+ scratch.file("test/BUILD",
+ "load('/test/rules', 'skylark_rule', 'my_rule', 'my_other_rule')",
+ "my_rule(name = 'mylib',",
+ " srcs = ['a.py'])",
+ "skylark_rule(name = 'skyrule1',",
+ " deps = [':mylib'])",
+ "my_other_rule(name = 'my_other_lib',",
+ " srcs = ['a.py'])",
+ "skylark_rule(name = 'skyrule2',",
+ " deps = [':my_other_lib'])");
+ scratch.file("test/rules.bzl",
+ "def _impl(ctx):",
+ " return",
+ "skylark_rule = rule(",
+ " implementation = _impl,",
+ " attrs = {",
+ " 'deps': attr.label_list(providers = [['a'], ['b', 'c']],",
+ " allow_files=True)",
+ " }",
+ ")",
+ "def my_rule_impl(ctx):",
+ " return struct(a = [])",
+ "my_rule = rule(implementation = my_rule_impl, ",
+ " attrs = { 'srcs' : attr.label_list(allow_files=True)})",
+ "def my_other_rule_impl(ctx):",
+ " return struct(b = [])",
+ "my_other_rule = rule(implementation = my_other_rule_impl, ",
+ " attrs = { 'srcs' : attr.label_list(allow_files=True)})");
+ reporter.removeHandler(failFastHandler);
+ assertNotNull(getConfiguredTarget("//test:skyrule1"));
+
+ try {
+ createRuleContext("//test:skyrule2");
+ fail("Should have failed because of wrong mandatory providers");
+ } catch (Exception ex) {
+ assertContainsEvent("ERROR /workspace/test/BUILD:9:10: in deps attribute of "
+ + "skylark_rule rule //test:skyrule2: '//test:my_other_lib' does not have "
+ + "mandatory provider 'a' or 'c'");
+ }
+ }
+
+ @Test
+ public void testMandatoryProvidersListWithNative() throws Exception {
+ scratch.file("test/BUILD",
+ "load('/test/rules', 'my_rule', 'my_other_rule')",
+ "my_rule(name = 'mylib',",
+ " srcs = ['a.py'])",
+ "testing_rule_for_mandatory_providers(name = 'skyrule1',",
+ " deps = [':mylib'])",
+ "my_other_rule(name = 'my_other_lib',",
+ " srcs = ['a.py'])",
+ "testing_rule_for_mandatory_providers(name = 'skyrule2',",
+ " deps = [':my_other_lib'])");
+ scratch.file("test/rules.bzl",
+ "def my_rule_impl(ctx):",
+ " return struct(a = [])",
+ "my_rule = rule(implementation = my_rule_impl, ",
+ " attrs = { 'srcs' : attr.label_list(allow_files=True)})",
+ "def my_other_rule_impl(ctx):",
+ " return struct(b = [])",
+ "my_other_rule = rule(implementation = my_other_rule_impl, ",
+ " attrs = { 'srcs' : attr.label_list(allow_files=True)})");
+ reporter.removeHandler(failFastHandler);
+ assertNotNull(getConfiguredTarget("//test:skyrule1"));
+
+ try {
+ createRuleContext("//test:skyrule2");
+ fail("Should have failed because of wrong mandatory providers");
+ } catch (Exception ex) {
+ assertContainsEvent("ERROR /workspace/test/BUILD:9:10: in deps attribute of "
+ + "testing_rule_for_mandatory_providers rule //test:skyrule2: '//test:my_other_lib' "
+ + "does not have mandatory provider 'a' or 'c'");
+ }
+ }
+
/* Sharing setup code between the testPackageBoundaryError*() methods is not possible since the
* errors already happen when loading the file. Consequently, all tests would fail at the same
* statement. */
diff --git a/src/test/java/com/google/devtools/build/lib/testutil/TestRuleClassProvider.java b/src/test/java/com/google/devtools/build/lib/testutil/TestRuleClassProvider.java
index eaf1ceec6c..8b708a3d18 100644
--- a/src/test/java/com/google/devtools/build/lib/testutil/TestRuleClassProvider.java
+++ b/src/test/java/com/google/devtools/build/lib/testutil/TestRuleClassProvider.java
@@ -20,6 +20,7 @@ import static com.google.devtools.build.lib.packages.BuildType.OUTPUT_LIST;
import static com.google.devtools.build.lib.syntax.Type.INTEGER;
import static com.google.devtools.build.lib.syntax.Type.STRING_LIST;
+import com.google.common.collect.ImmutableList;
import com.google.devtools.build.lib.analysis.BaseRuleClasses;
import com.google.devtools.build.lib.analysis.ConfiguredRuleClassProvider;
import com.google.devtools.build.lib.analysis.RuleDefinition;
@@ -59,6 +60,7 @@ public class TestRuleClassProvider {
new ConfiguredRuleClassProvider.Builder();
addStandardRules(builder);
builder.addRuleDefinition(new TestingDummyRule());
+ builder.addRuleDefinition(new TestingRuleForMandatoryProviders());
ruleProvider = builder.build();
}
return ruleProvider;
@@ -85,4 +87,25 @@ public class TestRuleClassProvider {
.build();
}
}
+
+ public static final class TestingRuleForMandatoryProviders implements RuleDefinition {
+ @Override
+ public RuleClass build(Builder builder, RuleDefinitionEnvironment env) {
+ return builder
+ .setUndocumented()
+ .add(attr("srcs", LABEL_LIST).allowedFileTypes(FileTypeSet.ANY_FILE))
+ .override(builder.copy("deps").mandatoryProvidersList(ImmutableList.of(
+ ImmutableList.of("a"), ImmutableList.of("b", "c"))))
+ .build();
+ }
+
+ @Override
+ public Metadata getMetadata() {
+ return RuleDefinition.Metadata.builder()
+ .name("testing_rule_for_mandatory_providers")
+ .ancestors(BaseRuleClasses.RuleBase.class)
+ .factoryClass(UnknownRuleConfiguredTarget.class)
+ .build();
+ }
+ }
}