aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/test
diff options
context:
space:
mode:
authorGravatar Jon Brandvein <brandjon@google.com>2016-09-29 18:41:10 +0000
committerGravatar Yun Peng <pcloudy@google.com>2016-09-30 08:13:17 +0000
commitead58ae8e17257eabf91f512b64da4f85dbe06a1 (patch)
treef5fef9fe0d4f328841a6a24f0990fa51d9c3e530 /src/test
parent6cd43bbd719b78b7feccd2e11a9c6a4376d3b1e5 (diff)
Add an actions provider for testing Skylark rules.
The new provider gathers actions generated by any Skylark-based RuleConfiguredTarget, so long as the rule definition has _skylark_test=True set. For the moment this flag is under the user's control, but the intention is that it will be set by a test runner. -- MOS_MIGRATED_REVID=134687396
Diffstat (limited to 'src/test')
-rw-r--r--src/test/java/com/google/devtools/build/lib/packages/RuleClassTest.java1
-rw-r--r--src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleContextTest.java76
2 files changed, 77 insertions, 0 deletions
diff --git a/src/test/java/com/google/devtools/build/lib/packages/RuleClassTest.java b/src/test/java/com/google/devtools/build/lib/packages/RuleClassTest.java
index 03fbd31bda..5deb1667d6 100644
--- a/src/test/java/com/google/devtools/build/lib/packages/RuleClassTest.java
+++ b/src/test/java/com/google/devtools/build/lib/packages/RuleClassTest.java
@@ -880,6 +880,7 @@ public class RuleClassTest extends PackageLoadingTestCase {
name,
/*isSkylark=*/ skylarkExecutable,
skylarkExecutable,
+ /*skylarkTestable=*/ false,
documented,
publicByDefault,
binaryOutput,
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 00b27d247e..fbdc2c5a55 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
@@ -23,12 +23,15 @@ import static org.junit.Assert.fail;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Iterables;
+import com.google.devtools.build.lib.actions.ActionAnalysisMetadata;
import com.google.devtools.build.lib.actions.Artifact;
+import com.google.devtools.build.lib.analysis.ActionsProvider;
import com.google.devtools.build.lib.analysis.FileConfiguredTarget;
import com.google.devtools.build.lib.analysis.SkylarkProviders;
import com.google.devtools.build.lib.analysis.TransitiveInfoCollection;
import com.google.devtools.build.lib.analysis.actions.SpawnAction;
import com.google.devtools.build.lib.cmdline.Label;
+import com.google.devtools.build.lib.packages.SkylarkClassObject;
import com.google.devtools.build.lib.rules.SkylarkRuleContext;
import com.google.devtools.build.lib.rules.java.JavaSourceJarsProvider;
import com.google.devtools.build.lib.rules.python.PyCommon;
@@ -1011,4 +1014,77 @@ public class SkylarkRuleContextTest extends SkylarkTestCase {
.toString();
assertThat(filename).isEqualTo("../foo/bar.txt");
}
+
+ private void setUpActionTest() throws Exception {
+ scratch.file("test/rules.bzl",
+ "def _testable_impl(ctx):",
+ " out = ctx.outputs.out",
+ " ctx.action(outputs=[out], command='echo foo123 > ' + out.path)",
+ "testable_rule = rule(",
+ " implementation = _testable_impl,",
+ " outputs = {'out': '%{name}.txt'},",
+ " _skylark_testable = True,",
+ ")",
+ "def _nontestable_impl(ctx):",
+ " out = ctx.outputs.out",
+ " ctx.action(outputs=[out], command='echo bar123 > ' + out.path)",
+ "nontestable_rule = rule(",
+ " implementation = _nontestable_impl,",
+ " outputs = {'out': '%{name}.txt'},",
+ ")",
+ "def _testing_impl(ctx):",
+ " pass",
+ "testing_rule = rule(",
+ " implementation = _testing_impl,",
+ " attrs = {'dep1': attr.label(),",
+ " 'dep2': attr.label(),},",
+ ")");
+ scratch.file("test/BUILD",
+ "load(':rules.bzl', 'testable_rule', 'nontestable_rule', 'testing_rule')",
+ "testable_rule(",
+ " name = 'testable',",
+ ")",
+ "nontestable_rule(",
+ " name = 'nontestable',",
+ ")",
+ "testing_rule(",
+ " name = 'testing',",
+ " dep1 = ':testable',",
+ " dep2 = ':nontestable',",
+ ")");
+ }
+
+ @Test
+ public void testDependencyActionsProvider() throws Exception {
+ setUpActionTest();
+ SkylarkRuleContext ruleContext = createRuleContext("//test:testing");
+
+ Object provider = evalRuleContextCode(ruleContext, "ruleContext.attr.dep1[Actions]");
+ assertThat(provider).isInstanceOf(SkylarkClassObject.class);
+ assertThat(((SkylarkClassObject) provider).getConstructor())
+ .isEqualTo(ActionsProvider.ACTIONS_PROVIDER);
+ update("actions", provider);
+
+ Object mapping = eval("actions.by_file");
+ assertThat(mapping).isInstanceOf(SkylarkDict.class);
+ assertThat((SkylarkDict<?, ?>) mapping).hasSize(1);
+ update("file", eval("list(ruleContext.attr.dep1.files)[0]"));
+ Object actionUnchecked = eval("actions.by_file[file]");
+ assertThat(actionUnchecked).isInstanceOf(ActionAnalysisMetadata.class);
+ }
+
+ @Test
+ public void testNoAccessToDependencyActionsWithoutSkylarkTest() throws Exception {
+ reporter.removeHandler(failFastHandler);
+ setUpActionTest();
+ SkylarkRuleContext ruleContext = createRuleContext("//test:testing");
+
+ try {
+ evalRuleContextCode(ruleContext, "ruleContext.attr.dep2[Actions]");
+ fail("Should have failed due to trying to access actions of a rule not marked "
+ + "_skylark_testable");
+ } catch (Exception e) {
+ assertThat(e).hasMessage("Object of type Target doesn't contain declared provider Actions");
+ }
+ }
}