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):",