make execGroups available to the RuleClass (like requiredToolchains)
PiperOrigin-RevId: 304174397
diff --git a/src/test/java/com/google/devtools/build/lib/packages/RuleClassBuilderTest.java b/src/test/java/com/google/devtools/build/lib/packages/RuleClassBuilderTest.java
index 49e1d23..9cd63ce 100644
--- a/src/test/java/com/google/devtools/build/lib/packages/RuleClassBuilderTest.java
+++ b/src/test/java/com/google/devtools/build/lib/packages/RuleClassBuilderTest.java
@@ -23,6 +23,8 @@
import com.google.common.base.Predicate;
import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.ImmutableSet;
import com.google.devtools.build.lib.actions.MutableActionGraph.ActionConflictException;
import com.google.devtools.build.lib.cmdline.Label;
import com.google.devtools.build.lib.packages.RuleClass.Builder.RuleClassNamePredicate;
@@ -191,6 +193,54 @@
}
@Test
+ public void testExecGroupsAreInherited() throws Exception {
+ Label mockToolchainType = Label.parseAbsoluteUnchecked("//mock_toolchain_type");
+ Label mockConstraint = Label.parseAbsoluteUnchecked("//mock_constraint");
+ ExecGroup parentGroup =
+ new ExecGroup(ImmutableSet.of(mockToolchainType), ImmutableSet.of(mockConstraint));
+ ExecGroup childGroup = new ExecGroup(ImmutableSet.of(), ImmutableSet.of());
+ RuleClass parent =
+ new RuleClass.Builder("$parent", RuleClassType.ABSTRACT, false)
+ .add(attr("tags", STRING_LIST))
+ .addExecGroups(ImmutableMap.of("group", parentGroup))
+ .build();
+ RuleClass child =
+ new RuleClass.Builder("child", RuleClassType.NORMAL, false, parent)
+ .factory(DUMMY_CONFIGURED_TARGET_FACTORY)
+ .add(attr("attr", STRING))
+ .addExecGroups(ImmutableMap.of("child-group", childGroup))
+ .build();
+ assertThat(child.getExecGroups().get("group")).isEqualTo(parentGroup);
+ assertThat(child.getExecGroups().get("child-group")).isEqualTo(childGroup);
+ }
+
+ @Test
+ public void testDuplicateExecGroupNamesErrors() throws Exception {
+ RuleClass a =
+ new RuleClass.Builder("ruleA", RuleClassType.NORMAL, false)
+ .factory(DUMMY_CONFIGURED_TARGET_FACTORY)
+ .addExecGroups(
+ ImmutableMap.of("blueberry", new ExecGroup(ImmutableSet.of(), ImmutableSet.of())))
+ .add(attr("tags", STRING_LIST))
+ .build();
+ RuleClass b =
+ new RuleClass.Builder("ruleB", RuleClassType.NORMAL, false)
+ .factory(DUMMY_CONFIGURED_TARGET_FACTORY)
+ .addExecGroups(
+ ImmutableMap.of("blueberry", new ExecGroup(ImmutableSet.of(), ImmutableSet.of())))
+ .add(attr("tags", STRING_LIST))
+ .build();
+ IllegalArgumentException e =
+ assertThrows(
+ IllegalArgumentException.class,
+ () -> new RuleClass.Builder("ruleC", RuleClassType.NORMAL, false, a, b).build());
+ assertThat(e)
+ .hasMessageThat()
+ .isEqualTo(
+ "An execution group named 'blueberry' is inherited multiple times in ruleC ruleclass");
+ }
+
+ @Test
public void testBasicRuleNamePredicates() throws Exception {
Predicate<String> abcdef = nothingBut("abc", "def").asPredicateOfRuleClassName();
assertThat(abcdef.test("abc")).isTrue();
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 3153f5b..51697d2 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
@@ -941,6 +941,7 @@
/*requiredToolchains=*/ ImmutableSet.of(),
/*useToolchainResolution=*/ true,
/* executionPlatformConstraints= */ ImmutableSet.of(),
+ /* execGroups= */ ImmutableMap.of(),
OutputFile.Kind.FILE,
ImmutableList.copyOf(attributes),
/* buildSetting= */ null);
@@ -1151,6 +1152,29 @@
}
@Test
+ public void testExecGroups() throws Exception {
+ RuleClass.Builder ruleClassBuilder =
+ new RuleClass.Builder("ruleClass", RuleClassType.NORMAL, false)
+ .factory(DUMMY_CONFIGURED_TARGET_FACTORY)
+ .add(attr("tags", STRING_LIST));
+
+ Label toolchain = Label.parseAbsoluteUnchecked("//toolchain");
+ Label constraint = Label.parseAbsoluteUnchecked("//constraint");
+
+ ruleClassBuilder.addExecGroups(
+ ImmutableMap.of(
+ "cherry", new ExecGroup(ImmutableSet.of(toolchain), ImmutableSet.of(constraint))));
+
+ RuleClass ruleClass = ruleClassBuilder.build();
+
+ assertThat(ruleClass.getExecGroups()).hasSize(1);
+ assertThat(ruleClass.getExecGroups().get("cherry").getRequiredToolchains())
+ .containsExactly(toolchain);
+ assertThat(ruleClass.getExecGroups().get("cherry").getExecutionPlatformConstraints())
+ .containsExactly(constraint);
+ }
+
+ @Test
public void testBuildSetting_createsDefaultAttribute() {
RuleClass labelFlag =
new RuleClass.Builder("label_flag", RuleClassType.NORMAL, false)
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 b15fc6d..62cf58e 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
@@ -1760,6 +1760,32 @@
}
@Test
+ public void testRuleAddExecGroup() throws Exception {
+ setSkylarkSemanticsOptions("--experimental_exec_groups=true");
+ reset();
+
+ registerDummyStarlarkFunction();
+ scratch.file("test/BUILD", "toolchain_type(name = 'my_toolchain_type')");
+ evalAndExport(
+ "plum = rule(",
+ " implementation = impl,",
+ " exec_groups = {",
+ " 'group': exec_group(",
+ " toolchains=['//test:my_toolchain_type'],",
+ " exec_compatible_with=['//constraint:cv1', '//constraint:cv2'],",
+ " ),",
+ " },",
+ ")");
+ RuleClass plum = ((SkylarkRuleFunction) lookup("plum")).getRuleClass();
+ assertThat(plum.getRequiredToolchains()).isEmpty();
+ assertThat(plum.getExecGroups().get("group").getRequiredToolchains())
+ .containsExactly(makeLabel("//test:my_toolchain_type"));
+ assertThat(plum.getExecutionPlatformConstraints()).isEmpty();
+ assertThat(plum.getExecGroups().get("group").getExecutionPlatformConstraints())
+ .containsExactly(makeLabel("//constraint:cv1"), makeLabel("//constraint:cv2"));
+ }
+
+ @Test
public void testRuleFunctionReturnsNone() throws Exception {
scratch.file("test/rule.bzl",
"def _impl(ctx):",