diff options
author | 2016-02-23 18:37:44 +0000 | |
---|---|---|
committer | 2016-02-23 22:18:25 +0000 | |
commit | 83fbb91a5a2afd15f0ab1e251812bd6692e0728a (patch) | |
tree | 1a402de1d2fbd15b6163b1a967c8fbede8743610 /src/test/java/com/google/devtools/build/lib | |
parent | 17129d4f838cd18b74551e0dd56e290975a6dc8c (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')
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(); + } + } } |