diff options
Diffstat (limited to 'src/test/java/com/google/devtools/build/lib')
4 files changed, 74 insertions, 2 deletions
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/BuildViewTest.java b/src/test/java/com/google/devtools/build/lib/analysis/BuildViewTest.java index 4098a2b02f..6d107b3ee6 100644 --- a/src/test/java/com/google/devtools/build/lib/analysis/BuildViewTest.java +++ b/src/test/java/com/google/devtools/build/lib/analysis/BuildViewTest.java @@ -16,6 +16,7 @@ package com.google.devtools.build.lib.analysis; import static com.google.common.truth.Truth.assertThat; import static com.google.common.truth.Truth.assertWithMessage; +import static com.google.devtools.build.lib.packages.Attribute.attr; import static com.google.devtools.build.lib.testutil.MoreAsserts.assertEventCount; import static com.google.devtools.build.lib.testutil.MoreAsserts.assertEventCountAtLeast; import static org.junit.Assert.fail; @@ -36,8 +37,10 @@ import com.google.devtools.build.lib.analysis.config.InvalidConfigurationExcepti import com.google.devtools.build.lib.analysis.util.AnalysisMock; import com.google.devtools.build.lib.analysis.util.BuildViewTestBase; import com.google.devtools.build.lib.analysis.util.ExpectedDynamicConfigurationErrors; +import com.google.devtools.build.lib.analysis.util.MockRule; import com.google.devtools.build.lib.cmdline.Label; import com.google.devtools.build.lib.packages.Attribute; +import com.google.devtools.build.lib.packages.BuildType; import com.google.devtools.build.lib.packages.Rule; import com.google.devtools.build.lib.skyframe.SkyFunctions; import com.google.devtools.build.lib.skyframe.TargetPatternValue.TargetPatternKey; @@ -1340,6 +1343,56 @@ public class BuildViewTest extends BuildViewTestBase { assertDoesNotContainEvent("implicitly depends upon"); } + @Test + public void allowedRuleClassesAndAllowedRuleClassesWithWarning() throws Exception { + setRulesAvailableInTests( + (MockRule) () -> MockRule.define( + "custom_rule", + attr("deps", BuildType.LABEL_LIST) + .allowedFileTypes() + .allowedRuleClasses("java_library", "java_binary") + .allowedRuleClassesWithWarning("genrule"))); + + scratch.file("foo/BUILD", + "genrule(", + " name = 'genlib',", + " srcs = [],", + " outs = ['genlib.out'],", + " cmd = 'echo hi > $@')", + "custom_rule(", + " name = 'foo',", + " deps = [':genlib'])"); + + update("//foo"); + assertContainsEvent("WARNING /workspace/foo/BUILD:8:12: in deps attribute of custom_rule rule " + + "//foo:foo: genrule rule '//foo:genlib' is unexpected here (expected java_library or " + + "java_binary); continuing anyway"); + } + + @Test + public void onlyAllowedRuleClassesWithWarning() throws Exception { + setRulesAvailableInTests( + (MockRule) () -> MockRule.define( + "custom_rule", + attr("deps", BuildType.LABEL_LIST) + .allowedFileTypes() + .allowedRuleClassesWithWarning("genrule"))); + + scratch.file("foo/BUILD", + "genrule(", + " name = 'genlib',", + " srcs = [],", + " outs = ['genlib.out'],", + " cmd = 'echo hi > $@')", + "custom_rule(", + " name = 'foo',", + " deps = [':genlib'])"); + + update("//foo"); + assertContainsEvent("WARNING /workspace/foo/BUILD:8:12: in deps attribute of custom_rule rule " + + "//foo:foo: genrule rule '//foo:genlib' is unexpected here; continuing anyway"); + } + /** Runs the same test with the reduced loading phase. */ @TestSpec(size = Suite.SMALL_TESTS) @RunWith(JUnit4.class) diff --git a/src/test/java/com/google/devtools/build/lib/analysis/util/MockRule.java b/src/test/java/com/google/devtools/build/lib/analysis/util/MockRule.java index 9446a04ded..bba074bec4 100644 --- a/src/test/java/com/google/devtools/build/lib/analysis/util/MockRule.java +++ b/src/test/java/com/google/devtools/build/lib/analysis/util/MockRule.java @@ -102,6 +102,11 @@ public interface MockRule extends RuleDefinition { } /** + * Default <code>"deps"</code> attribute for rule classes that don't need special behavior. + */ + Attribute.Builder<?> DEPS_ATTRIBUTE = attr("deps", BuildType.LABEL_LIST).allowedFileTypes(); + + /** * Builds out this rule with default attributes Blaze expects of all rules plus the custom * attributes defined by this implementation's {@link State}. * @@ -110,7 +115,6 @@ public interface MockRule extends RuleDefinition { @Override default RuleClass build(RuleClass.Builder builder, RuleDefinitionEnvironment environment) { builder - .add(attr("deps", BuildType.LABEL_LIST).allowedFileTypes()) .add(attr("testonly", BOOLEAN).nonconfigurable("test").value(false)) .add(attr("deprecation", STRING).nonconfigurable("test").value((String) null)) .add(attr("tags", STRING_LIST)) diff --git a/src/test/java/com/google/devtools/build/lib/packages/AttributeTest.java b/src/test/java/com/google/devtools/build/lib/packages/AttributeTest.java index 1f507b57f2..b5d74d7852 100644 --- a/src/test/java/com/google/devtools/build/lib/packages/AttributeTest.java +++ b/src/test/java/com/google/devtools/build/lib/packages/AttributeTest.java @@ -310,4 +310,19 @@ public class AttributeTest { return new TestSplitTransition(); } } + + @Test + public void allowedRuleClassesAndAllowedRuleClassesWithWarningsCannotOverlap() throws Exception { + try { + attr("x", LABEL_LIST) + .allowedRuleClasses("foo", "bar", "baz") + .allowedRuleClassesWithWarning("bar") + .allowedFileTypes() + .build(); + fail("Expected illegal state exception because rule classes and rule classes with warning " + + "overlap"); + } catch (IllegalStateException e) { + assertThat(e).hasMessageThat().contains("may not contain the same rule classes"); + } + } } diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/ConfigurationsForTargetsWithDynamicConfigurationsTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/ConfigurationsForTargetsWithDynamicConfigurationsTest.java index b30124244a..ba5a07cb3c 100644 --- a/src/test/java/com/google/devtools/build/lib/skyframe/ConfigurationsForTargetsWithDynamicConfigurationsTest.java +++ b/src/test/java/com/google/devtools/build/lib/skyframe/ConfigurationsForTargetsWithDynamicConfigurationsTest.java @@ -431,7 +431,7 @@ public class ConfigurationsForTargetsWithDynamicConfigurationsTest private static final class RuleWithOutgoingTransition implements MockRule { @Override public State define() { - return MockRule.define("change_deps"); + return MockRule.define("change_deps", MockRule.DEPS_ATTRIBUTE); } @Override |