aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/test/java/com/google/devtools/build/lib
diff options
context:
space:
mode:
authorGravatar vladmos <vladmos@google.com>2017-07-13 14:54:03 +0200
committerGravatar László Csomor <laszlocsomor@google.com>2017-07-14 10:50:32 +0200
commit97d67087e6199db3b4c69178cf6a2d0c83c19290 (patch)
tree78913c5bc8632356b2b4112e973fcab9a95d3731 /src/test/java/com/google/devtools/build/lib
parentbc28fa64595653ec1bb73e541f274abd50762502 (diff)
Fix declared providers behavior
DefaultInfo used to not be used when old-style and declared providers were mixed (struct=(custom='key', providers=[DefaultInfo(...)])). Also when a single declared provider was returned it used to be treated as an old-style struct. PiperOrigin-RevId: 161796415
Diffstat (limited to 'src/test/java/com/google/devtools/build/lib')
-rw-r--r--src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleImplementationFunctionsTest.java175
1 files changed, 164 insertions, 11 deletions
diff --git a/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleImplementationFunctionsTest.java b/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleImplementationFunctionsTest.java
index 267065296d..d539354696 100644
--- a/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleImplementationFunctionsTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleImplementationFunctionsTest.java
@@ -33,8 +33,10 @@ import com.google.devtools.build.lib.analysis.actions.FileWriteAction;
import com.google.devtools.build.lib.analysis.actions.SpawnAction;
import com.google.devtools.build.lib.analysis.actions.TemplateExpansionAction;
import com.google.devtools.build.lib.analysis.actions.TemplateExpansionAction.Substitution;
+import com.google.devtools.build.lib.cmdline.Label;
import com.google.devtools.build.lib.events.Event;
import com.google.devtools.build.lib.packages.SkylarkClassObject;
+import com.google.devtools.build.lib.packages.SkylarkClassObjectConstructor.SkylarkKey;
import com.google.devtools.build.lib.rules.SkylarkRuleContext;
import com.google.devtools.build.lib.skylark.util.SkylarkTestCase;
import com.google.devtools.build.lib.skylarkinterface.Param;
@@ -904,8 +906,8 @@ public class SkylarkRuleImplementationFunctionsTest extends SkylarkTestCase {
Object provider = configuredTarget.get("provider");
assertThat(provider).isInstanceOf(DefaultProvider.class);
- assertThat(((DefaultProvider) provider).getConstructor().getPrintableName())
- .isEqualTo("DefaultInfo");
+ assertThat(((SkylarkClassObject) provider).getConstructor().getKey()).isEqualTo(
+ DefaultProvider.SKYLARK_CONSTRUCTOR.getKey());
assertThat(configuredTarget.get("dir"))
.isEqualTo(
@@ -933,6 +935,117 @@ public class SkylarkRuleImplementationFunctionsTest extends SkylarkTestCase {
}
@Test
+ public void testDefaultProviderInStruct() throws Exception {
+ scratch.file(
+ "test/foo.bzl",
+ "foo_provider = provider()",
+ "def _impl(ctx):",
+ " default = DefaultInfo(",
+ " runfiles=ctx.runfiles(ctx.files.runs),",
+ " )",
+ " foo = foo_provider()",
+ " return struct(providers=[foo, default])",
+ "foo_rule = rule(",
+ " implementation = _impl,",
+ " attrs = {",
+ " 'runs': attr.label_list(allow_files=True),",
+ " }",
+ ")");
+ scratch.file(
+ "test/bar.bzl",
+ "load(':foo.bzl', 'foo_provider')",
+ "def _impl(ctx):",
+ " provider = ctx.attr.deps[0][DefaultInfo]",
+ " return struct(",
+ " is_provided = DefaultInfo in ctx.attr.deps[0],",
+ " provider = provider,",
+ " dir = str(sorted(dir(provider))),",
+ " rule_data_runfiles = provider.data_runfiles,",
+ " rule_default_runfiles = provider.default_runfiles,",
+ " rule_files = provider.files,",
+ " rule_files_to_run = provider.files_to_run,",
+ " )",
+ "bar_rule = rule(",
+ " implementation = _impl,",
+ " attrs = {",
+ " 'deps': attr.label_list(allow_files=True),",
+ " }",
+ ")");
+ scratch.file(
+ "test/BUILD",
+ "load(':foo.bzl', 'foo_rule')",
+ "load(':bar.bzl', 'bar_rule')",
+ "foo_rule(name = 'dep_rule', runs = ['run.file', 'run2.file'])",
+ "bar_rule(name = 'my_rule', deps = [':dep_rule', 'file.txt'])");
+ ConfiguredTarget configuredTarget = getConfiguredTarget("//test:my_rule");
+
+ assertThat((Boolean) configuredTarget.get("is_provided")).isTrue();
+
+ Object provider = configuredTarget.get("provider");
+ assertThat(provider).isInstanceOf(DefaultProvider.class);
+ assertThat(((SkylarkClassObject) provider).getConstructor().getKey()).isEqualTo(
+ DefaultProvider.SKYLARK_CONSTRUCTOR.getKey());
+
+ assertThat(configuredTarget.get("dir"))
+ .isEqualTo(
+ "[\"data_runfiles\", \"default_runfiles\", \"files\", \"files_to_run\", \"to_json\", "
+ + "\"to_proto\"]");
+
+ assertThat(configuredTarget.get("rule_data_runfiles")).isInstanceOf(Runfiles.class);
+ assertThat(
+ Iterables.transform(
+ ((Runfiles) configuredTarget.get("rule_data_runfiles")).getAllArtifacts(),
+ String::valueOf))
+ .containsExactly(
+ "File:[/workspace[source]]test/run.file", "File:[/workspace[source]]test/run2.file");
+
+ assertThat(configuredTarget.get("rule_default_runfiles")).isInstanceOf(Runfiles.class);
+ assertThat(
+ Iterables.transform(
+ ((Runfiles) configuredTarget.get("rule_default_runfiles")).getAllArtifacts(),
+ String::valueOf))
+ .containsExactly(
+ "File:[/workspace[source]]test/run.file", "File:[/workspace[source]]test/run2.file");
+
+ assertThat(configuredTarget.get("rule_files")).isInstanceOf(SkylarkNestedSet.class);
+ assertThat(configuredTarget.get("rule_files_to_run")).isInstanceOf(FilesToRunProvider.class);
+ }
+
+ @Test
+ public void testDefaultProviderInvalidConfiguration() throws Exception {
+ scratch.file(
+ "test/foo.bzl",
+ "foo_provider = provider()",
+ "def _impl(ctx):",
+ " default = DefaultInfo(",
+ " runfiles=ctx.runfiles(ctx.files.runs),",
+ " )",
+ " foo = foo_provider()",
+ " return struct(providers=[foo, default], files=depset([]))",
+ "foo_rule = rule(",
+ " implementation = _impl,",
+ " attrs = {",
+ " 'runs': attr.label_list(allow_files=True),",
+ " }",
+ ")");
+ scratch.file(
+ "test/BUILD",
+ "load(':foo.bzl', 'foo_rule')",
+ "foo_rule(name = 'my_rule', runs = ['run.file', 'run2.file'])");
+
+ try {
+ getConfiguredTarget("//test:my_rule");
+ fail();
+ } catch (AssertionError expected) {
+ assertThat(expected)
+ .hasMessageThat()
+ .contains(
+ "Provider 'files' should be specified in DefaultInfo "
+ + "if it's provided explicitly.");
+ }
+ }
+
+ @Test
public void testDefaultProviderOnFileTarget() throws Exception {
scratch.file(
"test/bar.bzl",
@@ -963,8 +1076,8 @@ public class SkylarkRuleImplementationFunctionsTest extends SkylarkTestCase {
Object provider = configuredTarget.get("provider");
assertThat(provider).isInstanceOf(DefaultProvider.class);
- assertThat(((DefaultProvider) provider).getConstructor().getPrintableName())
- .isEqualTo("DefaultInfo");
+ assertThat(((SkylarkClassObject) provider).getConstructor().getKey()).isEqualTo(
+ DefaultProvider.SKYLARK_CONSTRUCTOR.getKey());
assertThat(configuredTarget.get("dir"))
.isEqualTo(
@@ -1026,9 +1139,8 @@ public class SkylarkRuleImplementationFunctionsTest extends SkylarkTestCase {
ConfiguredTarget configuredTarget = getConfiguredTarget("//test:my_rule");
Object provider = configuredTarget.get("default");
assertThat(provider).isInstanceOf(DefaultProvider.class);
- SkylarkClassObject defaultProvider = (DefaultProvider) provider;
- assertThat((defaultProvider).getConstructor().getPrintableName())
- .isEqualTo("DefaultInfo");
+ assertThat(((SkylarkClassObject) provider).getConstructor().getKey()).isEqualTo(
+ DefaultProvider.SKYLARK_CONSTRUCTOR.getKey());
}
@Test
@@ -1099,8 +1211,49 @@ public class SkylarkRuleImplementationFunctionsTest extends SkylarkTestCase {
ConfiguredTarget configuredTarget = getConfiguredTarget("//test:my_rule");
Object provider = configuredTarget.get("proxy");
assertThat(provider).isInstanceOf(SkylarkClassObject.class);
- assertThat(((SkylarkClassObject) provider).getConstructor().getPrintableName())
- .isEqualTo("foo_provider");
+ assertThat(((SkylarkClassObject) provider).getConstructor().getKey()).isEqualTo(
+ new SkylarkKey(Label.parseAbsolute("//test:foo.bzl"), "foo_provider"));
+ }
+
+ @Test
+ public void testSingleDeclaredProvider() throws Exception {
+ scratch.file(
+ "test/foo.bzl",
+ "foo_provider = provider()",
+ "def _impl(ctx):",
+ " return foo_provider(a=123)",
+ "foo_rule = rule(",
+ " implementation = _impl,",
+ " attrs = {",
+ " \"srcs\": attr.label_list(allow_files=True),",
+ " }",
+ ")");
+ scratch.file(
+ "test/bar.bzl",
+ "load(':foo.bzl', 'foo_provider')",
+ "def _impl(ctx):",
+ " dep = ctx.attr.deps[0]",
+ " provider = dep[foo_provider]", // The goal is to test this object
+ " return struct(proxy = provider)", // so we return it here
+ "bar_rule = rule(",
+ " implementation = _impl,",
+ " attrs = {",
+ " 'srcs': attr.label_list(allow_files=True),",
+ " 'deps': attr.label_list(allow_files=True),",
+ " }",
+ ")");
+ scratch.file(
+ "test/BUILD",
+ "load(':foo.bzl', 'foo_rule')",
+ "load(':bar.bzl', 'bar_rule')",
+ "foo_rule(name = 'dep_rule')",
+ "bar_rule(name = 'my_rule', deps = [':dep_rule'])");
+ ConfiguredTarget configuredTarget = getConfiguredTarget("//test:my_rule");
+ Object provider = configuredTarget.get("proxy");
+ assertThat(provider).isInstanceOf(SkylarkClassObject.class);
+ assertThat(((SkylarkClassObject) provider).getConstructor().getKey()).isEqualTo(
+ new SkylarkKey(Label.parseAbsolute("//test:foo.bzl"), "foo_provider"));
+ assertThat(((SkylarkClassObject) provider).getValue("a")).isEqualTo(123);
}
@Test
@@ -1145,8 +1298,8 @@ public class SkylarkRuleImplementationFunctionsTest extends SkylarkTestCase {
ConfiguredTarget configuredTarget = getConfiguredTarget("//test:my_rule");
Object provider = configuredTarget.get("proxy");
assertThat(provider).isInstanceOf(SkylarkClassObject.class);
- assertThat(((SkylarkClassObject) provider).getConstructor().getPrintableName())
- .isEqualTo("foo_provider");
+ assertThat(((SkylarkClassObject) provider).getConstructor().getKey()).isEqualTo(
+ new SkylarkKey(Label.parseAbsolute("//test:foo.bzl"), "foo_provider"));
}
@Test