diff options
author | Jon Brandvein <brandjon@google.com> | 2016-09-29 18:41:10 +0000 |
---|---|---|
committer | Yun Peng <pcloudy@google.com> | 2016-09-30 08:13:17 +0000 |
commit | ead58ae8e17257eabf91f512b64da4f85dbe06a1 (patch) | |
tree | f5fef9fe0d4f328841a6a24f0990fa51d9c3e530 /src/test | |
parent | 6cd43bbd719b78b7feccd2e11a9c6a4376d3b1e5 (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.java | 1 | ||||
-rw-r--r-- | src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleContextTest.java | 76 |
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"); + } + } } |