Cap the number of attributes per rule-class at 150
Intention is to prevent hard-crashes due to runaway RuleClass growth -
AttributeContainer has a 254 cutoff for number of attributes, when that's
hit we crash hard.
150 was chosen to be high enough that it's significantly unlikely to affect
any existing rule classes, and low enough to give us the flexibility to lift
the limit if we absolutely must without running into the AttributeContainer
wall.
RELNOTES: A maximum 150 attributes per RuleClass is enforced
PiperOrigin-RevId: 300348762
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 3feba044..594148b 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
@@ -27,6 +27,8 @@
import com.google.devtools.build.lib.analysis.skylark.SkylarkRuleClassFunctions.SkylarkRuleFunction;
import com.google.devtools.build.lib.analysis.skylark.SkylarkRuleContext;
import com.google.devtools.build.lib.cmdline.Label;
+import com.google.devtools.build.lib.events.Event;
+import com.google.devtools.build.lib.events.EventKind;
import com.google.devtools.build.lib.packages.AdvertisedProviderSet;
import com.google.devtools.build.lib.packages.AspectParameters;
import com.google.devtools.build.lib.packages.Attribute;
@@ -210,6 +212,27 @@
}
@Test
+ public void testRuleClassTooManyAttributes() throws Exception {
+ ev.setFailFast(false);
+
+ ImmutableList.Builder<String> linesBuilder =
+ ImmutableList.<String>builder()
+ .add("def impl(ctx): return")
+ .add("r = rule(impl, attrs = {");
+ for (int i = 0; i < 150; i++) {
+ linesBuilder.add(" 'attr" + i + "': attr.int(),");
+ }
+ linesBuilder.add("})");
+
+ evalAndExport(linesBuilder.build().toArray(new String[0]));
+
+ assertThat(ev.getEventCollector()).hasSize(1);
+ Event event = ev.getEventCollector().iterator().next();
+ assertThat(event.getKind()).isEqualTo(EventKind.ERROR);
+ assertThat(event.getMessage()).contains("Rule class r declared too many attributes");
+ }
+
+ @Test
public void testDisableDeprecatedParams() throws Exception {
setSkylarkSemanticsOptions("--incompatible_disable_deprecated_attr_params=true");