From 188b578c0e9995c864d284f22de4e48c220b0596 Mon Sep 17 00:00:00 2001 From: mstaib Date: Wed, 16 May 2018 10:13:51 -0700 Subject: Enable manual trimming of config_feature_flags. This enables users of config_feature_flags to specify the flags used by the transitive closure of a particular target in the transitive_configs attribute of all targets. It also adds a flag - --enforce_transitive_configs_for_config_feature_flag - which enforces this specification and uses it to trim the set of flags available to that target. RELNOTES: None. PiperOrigin-RevId: 196846092 --- .../android/AbstractAndroidLocalTestTestBase.java | 58 +- .../build/lib/rules/android/AndroidBinaryTest.java | 70 +- .../config/ConfigFeatureFlagConfigurationTest.java | 48 +- .../lib/rules/config/ConfigFeatureFlagTest.java | 13 +- .../build/lib/rules/config/ConfigSettingTest.java | 122 +++- .../config/FeatureFlagManualTrimmingTest.java | 770 +++++++++++++++++++++ .../build/lib/rules/objc/AppleBinaryTest.java | 10 +- .../lib/rules/objc/AppleStaticLibraryTest.java | 10 +- .../build/lib/rules/objc/ObjcRuleTestCase.java | 3 + .../build/lib/skylark/SkylarkRuleContextTest.java | 1 + 10 files changed, 1046 insertions(+), 59 deletions(-) create mode 100644 src/test/java/com/google/devtools/build/lib/rules/config/FeatureFlagManualTrimmingTest.java (limited to 'src/test/java/com/google/devtools/build/lib') diff --git a/src/test/java/com/google/devtools/build/lib/rules/android/AbstractAndroidLocalTestTestBase.java b/src/test/java/com/google/devtools/build/lib/rules/android/AbstractAndroidLocalTestTestBase.java index 301d2acc12..bf62f4f71c 100644 --- a/src/test/java/com/google/devtools/build/lib/rules/android/AbstractAndroidLocalTestTestBase.java +++ b/src/test/java/com/google/devtools/build/lib/rules/android/AbstractAndroidLocalTestTestBase.java @@ -93,7 +93,9 @@ public abstract class AbstractAndroidLocalTestTestBase extends BuildViewTestCase @Test public void testFeatureFlagsAttributeSetsSelectInDependency() throws Exception { - useConfiguration("--experimental_dynamic_configs=on"); + useConfiguration( + "--experimental_dynamic_configs=on", + "--enforce_transitive_configs_for_config_feature_flag"); writeFile( "java/com/foo/BUILD", "load('//java/bar:foo.bzl', 'extra_deps')", @@ -105,6 +107,7 @@ public abstract class AbstractAndroidLocalTestTestBase extends BuildViewTestCase "config_setting(", " name = 'flag1@on',", " flag_values = {':flag1': 'on'},", + " transitive_configs = [':flag1'],", ")", "config_feature_flag(", " name = 'flag2',", @@ -114,6 +117,7 @@ public abstract class AbstractAndroidLocalTestTestBase extends BuildViewTestCase "config_setting(", " name = 'flag2@on',", " flag_values = {':flag2': 'on'},", + " transitive_configs = [':flag2'],", ")", "android_library(", " name = 'lib',", @@ -124,6 +128,7 @@ public abstract class AbstractAndroidLocalTestTestBase extends BuildViewTestCase " ':flag2@on': ['Flag2On.java'],", " '//conditions:default': ['Flag2Off.java'],", " }),", + " transitive_configs = [':flag1', ':flag2'],", ")", "android_local_test(", " name = 'foo',", @@ -131,7 +136,8 @@ public abstract class AbstractAndroidLocalTestTestBase extends BuildViewTestCase " deps = [':lib'] + extra_deps,", " feature_flags = {", " 'flag1': 'on',", - " }", + " },", + " transitive_configs = [':flag1', ':flag2'],", ")"); ConfiguredTarget binary = getConfiguredTarget("//java/com/foo"); List inputs = @@ -144,7 +150,9 @@ public abstract class AbstractAndroidLocalTestTestBase extends BuildViewTestCase @Test public void testFeatureFlagsAttributeSetsSelectInTest() throws Exception { - useConfiguration("--experimental_dynamic_configs=on"); + useConfiguration( + "--experimental_dynamic_configs=on", + "--enforce_transitive_configs_for_config_feature_flag"); writeFile( "java/com/foo/BUILD", "load('//java/bar:foo.bzl', 'extra_deps')", @@ -156,6 +164,7 @@ public abstract class AbstractAndroidLocalTestTestBase extends BuildViewTestCase "config_setting(", " name = 'flag1@on',", " flag_values = {':flag1': 'on'},", + " transitive_configs = [':flag1'],", ")", "config_feature_flag(", " name = 'flag2',", @@ -165,6 +174,7 @@ public abstract class AbstractAndroidLocalTestTestBase extends BuildViewTestCase "config_setting(", " name = 'flag2@on',", " flag_values = {':flag2': 'on'},", + " transitive_configs = [':flag2'],", ")", "android_local_test(", " name = 'foo',", @@ -178,7 +188,8 @@ public abstract class AbstractAndroidLocalTestTestBase extends BuildViewTestCase " }),", " feature_flags = {", " 'flag1': 'on',", - " }", + " },", + " transitive_configs = [':flag1', ':flag2'],", ")"); ConfiguredTarget binary = getConfiguredTarget("//java/com/foo"); List inputs = @@ -192,7 +203,9 @@ public abstract class AbstractAndroidLocalTestTestBase extends BuildViewTestCase @Test public void testFeatureFlagsAttributeFailsAnalysisIfFlagValueIsInvalid() throws Exception { reporter.removeHandler(failFastHandler); - useConfiguration("--experimental_dynamic_configs=on"); + useConfiguration( + "--experimental_dynamic_configs=on", + "--enforce_transitive_configs_for_config_feature_flag"); writeFile( "java/com/foo/BUILD", "load('//java/bar:foo.bzl', 'extra_deps')", @@ -204,13 +217,15 @@ public abstract class AbstractAndroidLocalTestTestBase extends BuildViewTestCase "config_setting(", " name = 'flag1@on',", " flag_values = {':flag1': 'on'},", + " transitive_configs = [':flag1'],", ")", "android_library(", " name = 'lib',", " srcs = select({", " ':flag1@on': ['Flag1On.java'],", " '//conditions:default': ['Flag1Off.java'],", - " })", + " }),", + " transitive_configs = [':flag1'],", ")", "android_local_test(", " name = 'foo',", @@ -218,7 +233,8 @@ public abstract class AbstractAndroidLocalTestTestBase extends BuildViewTestCase " deps = [':lib',] + extra_deps,", " feature_flags = {", " 'flag1': 'invalid',", - " }", + " },", + " transitive_configs = [':flag1'],", ")"); assertThat(getConfiguredTarget("//java/com/foo")).isNull(); assertContainsEvent( @@ -230,7 +246,9 @@ public abstract class AbstractAndroidLocalTestTestBase extends BuildViewTestCase public void testFeatureFlagsAttributeFailsAnalysisIfFlagValueIsInvalidEvenIfNotUsed() throws Exception { reporter.removeHandler(failFastHandler); - useConfiguration("--experimental_dynamic_configs=on"); + useConfiguration( + "--experimental_dynamic_configs=on", + "--enforce_transitive_configs_for_config_feature_flag"); writeFile( "java/com/foo/BUILD", "load('//java/bar:foo.bzl', 'extra_deps')", @@ -259,7 +277,9 @@ public abstract class AbstractAndroidLocalTestTestBase extends BuildViewTestCase @Test public void testFeatureFlagsAttributeSetsFeatureFlagProviderValues() throws Exception { - useConfiguration("--experimental_dynamic_configs=on"); + useConfiguration( + "--experimental_dynamic_configs=on", + "--enforce_transitive_configs_for_config_feature_flag"); writeFile( "java/com/foo/reader.bzl", "def _impl(ctx):", @@ -291,6 +311,7 @@ public abstract class AbstractAndroidLocalTestTestBase extends BuildViewTestCase "flag_reader(", " name = 'FooFlags',", " flags = [':flag1', ':flag2'],", + " transitive_configs = [':flag1', ':flag2'],", ")", "android_local_test(", " name = 'foo',", @@ -298,7 +319,8 @@ public abstract class AbstractAndroidLocalTestTestBase extends BuildViewTestCase " deps = extra_deps,", " feature_flags = {", " 'flag1': 'on',", - " }", + " },", + " transitive_configs = [':flag1', ':flag2'],", ")"); Artifact flagList = actionsTestUtil().getFirstArtifactEndingWith( @@ -314,7 +336,9 @@ public abstract class AbstractAndroidLocalTestTestBase extends BuildViewTestCase public void testFeatureFlagsAttributeFailsAnalysisIfFlagIsAliased() throws Exception { reporter.removeHandler(failFastHandler); - useConfiguration("--experimental_dynamic_configs=on"); + useConfiguration( + "--experimental_dynamic_configs=on", + "--enforce_transitive_configs_for_config_feature_flag"); writeFile( "java/com/foo/BUILD", "load('//java/bar:foo.bzl', 'extra_deps')", @@ -326,6 +350,7 @@ public abstract class AbstractAndroidLocalTestTestBase extends BuildViewTestCase "alias(", " name = 'alias',", " actual = 'flag1',", + " transitive_configs = [':flag1'],", ")", "android_local_test(", " name = 'foo',", @@ -333,7 +358,8 @@ public abstract class AbstractAndroidLocalTestTestBase extends BuildViewTestCase " deps = extra_deps,", " feature_flags = {", " 'alias': 'on',", - " }", + " },", + " transitive_configs = [':flag1'],", ")"); assertThat(getConfiguredTarget("//java/com/foo")).isNull(); assertContainsEvent(String.format( @@ -345,6 +371,7 @@ public abstract class AbstractAndroidLocalTestTestBase extends BuildViewTestCase @Test public void testFeatureFlagPolicyMustBeVisibleToRuleToUseFeatureFlags() throws Exception { reporter.removeHandler(failFastHandler); // expecting an error + useConfiguration("--enforce_transitive_configs_for_config_feature_flag"); overwriteFile( "tools/whitelists/config_feature_flag/BUILD", "package_group(", @@ -367,7 +394,8 @@ public abstract class AbstractAndroidLocalTestTestBase extends BuildViewTestCase " deps = extra_deps,", " feature_flags = {", " '//flag:flag': 'right',", - " }", + " },", + " transitive_configs = ['//flag:flag'],", ")"); assertThat(getConfiguredTarget("//java/com/google/android/foo:foo")).isNull(); assertContainsEvent( @@ -378,6 +406,7 @@ public abstract class AbstractAndroidLocalTestTestBase extends BuildViewTestCase @Test public void testFeatureFlagPolicyDoesNotBlockRuleIfInPolicy() throws Exception { + useConfiguration("--enforce_transitive_configs_for_config_feature_flag"); overwriteFile( "tools/whitelists/config_feature_flag/BUILD", "package_group(", @@ -400,7 +429,8 @@ public abstract class AbstractAndroidLocalTestTestBase extends BuildViewTestCase " deps = extra_deps,", " feature_flags = {", " '//flag:flag': 'right',", - " }", + " },", + " transitive_configs = ['//flag:flag'],", ")"); assertThat(getConfiguredTarget("//java/com/google/android/foo:foo")).isNotNull(); assertNoEvents(); diff --git a/src/test/java/com/google/devtools/build/lib/rules/android/AndroidBinaryTest.java b/src/test/java/com/google/devtools/build/lib/rules/android/AndroidBinaryTest.java index 3a9bb90190..7d41301892 100644 --- a/src/test/java/com/google/devtools/build/lib/rules/android/AndroidBinaryTest.java +++ b/src/test/java/com/google/devtools/build/lib/rules/android/AndroidBinaryTest.java @@ -3006,7 +3006,9 @@ public class AndroidBinaryTest extends AndroidBuildViewTestCase { @Test public void testFeatureFlagsAttributeSetsSelectInDependency() throws Exception { - useConfiguration("--experimental_dynamic_configs=notrim"); + useConfiguration( + "--experimental_dynamic_configs=notrim", + "--enforce_transitive_configs_for_config_feature_flag"); scratch.file( "java/com/foo/BUILD", "config_feature_flag(", @@ -3017,6 +3019,7 @@ public class AndroidBinaryTest extends AndroidBuildViewTestCase { "config_setting(", " name = 'flag1@on',", " flag_values = {':flag1': 'on'},", + " transitive_configs = [':flag1'],", ")", "config_feature_flag(", " name = 'flag2',", @@ -3026,6 +3029,7 @@ public class AndroidBinaryTest extends AndroidBuildViewTestCase { "config_setting(", " name = 'flag2@on',", " flag_values = {':flag2': 'on'},", + " transitive_configs = [':flag2'],", ")", "android_library(", " name = 'lib',", @@ -3036,6 +3040,7 @@ public class AndroidBinaryTest extends AndroidBuildViewTestCase { " ':flag2@on': ['Flag2On.java'],", " '//conditions:default': ['Flag2Off.java'],", " }),", + " transitive_configs = [':flag1', ':flag2'],", ")", "android_binary(", " name = 'foo',", @@ -3043,7 +3048,8 @@ public class AndroidBinaryTest extends AndroidBuildViewTestCase { " deps = [':lib'],", " feature_flags = {", " 'flag1': 'on',", - " }", + " },", + " transitive_configs = [':flag1', ':flag2'],", ")"); ConfiguredTarget binary = getConfiguredTarget("//java/com/foo"); List inputs = @@ -3055,7 +3061,9 @@ public class AndroidBinaryTest extends AndroidBuildViewTestCase { @Test public void testFeatureFlagsAttributeSetsSelectInBinary() throws Exception { - useConfiguration("--experimental_dynamic_configs=notrim"); + useConfiguration( + "--experimental_dynamic_configs=notrim", + "--enforce_transitive_configs_for_config_feature_flag"); scratch.file( "java/com/foo/BUILD", "config_feature_flag(", @@ -3066,6 +3074,7 @@ public class AndroidBinaryTest extends AndroidBuildViewTestCase { "config_setting(", " name = 'flag1@on',", " flag_values = {':flag1': 'on'},", + " transitive_configs = [':flag1'],", ")", "config_feature_flag(", " name = 'flag2',", @@ -3075,6 +3084,7 @@ public class AndroidBinaryTest extends AndroidBuildViewTestCase { "config_setting(", " name = 'flag2@on',", " flag_values = {':flag2': 'on'},", + " transitive_configs = [':flag2'],", ")", "android_binary(", " name = 'foo',", @@ -3088,7 +3098,8 @@ public class AndroidBinaryTest extends AndroidBuildViewTestCase { " }),", " feature_flags = {", " 'flag1': 'on',", - " }", + " },", + " transitive_configs = [':flag1', ':flag2'],", ")"); ConfiguredTarget binary = getConfiguredTarget("//java/com/foo"); List inputs = @@ -3100,7 +3111,9 @@ public class AndroidBinaryTest extends AndroidBuildViewTestCase { @Test public void testFeatureFlagsAttributeSetsSelectInBinaryAlias() throws Exception { - useConfiguration("--experimental_dynamic_configs=notrim"); + useConfiguration( + "--experimental_dynamic_configs=notrim", + "--enforce_transitive_configs_for_config_feature_flag"); scratch.file( "java/com/foo/BUILD", "config_feature_flag(", @@ -3111,6 +3124,7 @@ public class AndroidBinaryTest extends AndroidBuildViewTestCase { "config_setting(", " name = 'flag1@on',", " flag_values = {':flag1': 'on'},", + " transitive_configs = [':flag1'],", ")", "android_binary(", " name = 'foo',", @@ -3121,7 +3135,8 @@ public class AndroidBinaryTest extends AndroidBuildViewTestCase { " }),", " feature_flags = {", " 'flag1': 'on',", - " }", + " },", + " transitive_configs = [':flag1'],", ")", "alias(", " name = 'alias',", @@ -3138,7 +3153,9 @@ public class AndroidBinaryTest extends AndroidBuildViewTestCase { @Test public void testFeatureFlagsAttributeFailsAnalysisIfFlagValueIsInvalid() throws Exception { reporter.removeHandler(failFastHandler); - useConfiguration("--experimental_dynamic_configs=on"); + useConfiguration( + "--experimental_dynamic_configs=on", + "--enforce_transitive_configs_for_config_feature_flag"); scratch.file( "java/com/foo/BUILD", "config_feature_flag(", @@ -3149,13 +3166,15 @@ public class AndroidBinaryTest extends AndroidBuildViewTestCase { "config_setting(", " name = 'flag1@on',", " flag_values = {':flag1': 'on'},", + " transitive_configs = [':flag1'],", ")", "android_library(", " name = 'lib',", " srcs = select({", " ':flag1@on': ['Flag1On.java'],", " '//conditions:default': ['Flag1Off.java'],", - " })", + " }),", + " transitive_configs = [':flag1'],", ")", "android_binary(", " name = 'foo',", @@ -3163,7 +3182,8 @@ public class AndroidBinaryTest extends AndroidBuildViewTestCase { " deps = [':lib'],", " feature_flags = {", " 'flag1': 'invalid',", - " }", + " },", + " transitive_configs = [':flag1'],", ")"); assertThat(getConfiguredTarget("//java/com/foo")).isNull(); assertContainsEvent( @@ -3175,7 +3195,9 @@ public class AndroidBinaryTest extends AndroidBuildViewTestCase { public void testFeatureFlagsAttributeFailsAnalysisIfFlagValueIsInvalidEvenIfNotUsed() throws Exception { reporter.removeHandler(failFastHandler); - useConfiguration("--experimental_dynamic_configs=on"); + useConfiguration( + "--experimental_dynamic_configs=on", + "--enforce_transitive_configs_for_config_feature_flag"); scratch.file( "java/com/foo/BUILD", "config_feature_flag(", @@ -3186,13 +3208,15 @@ public class AndroidBinaryTest extends AndroidBuildViewTestCase { "config_setting(", " name = 'flag1@on',", " flag_values = {':flag1': 'on'},", + " transitive_configs = [':flag1'],", ")", "android_binary(", " name = 'foo',", " manifest = 'AndroidManifest.xml',", " feature_flags = {", " 'flag1': 'invalid',", - " }", + " },", + " transitive_configs = [':flag1'],", ")"); assertThat(getConfiguredTarget("//java/com/foo")).isNull(); assertContainsEvent( @@ -3204,7 +3228,9 @@ public class AndroidBinaryTest extends AndroidBuildViewTestCase { public void testFeatureFlagsAttributeFailsAnalysisIfFlagIsAliased() throws Exception { reporter.removeHandler(failFastHandler); - useConfiguration("--experimental_dynamic_configs=notrim"); + useConfiguration( + "--experimental_dynamic_configs=notrim", + "--enforce_transitive_configs_for_config_feature_flag"); scratch.file( "java/com/foo/BUILD", "config_feature_flag(", @@ -3215,13 +3241,15 @@ public class AndroidBinaryTest extends AndroidBuildViewTestCase { "alias(", " name = 'alias',", " actual = 'flag1',", + " transitive_configs = [':flag1'],", ")", "android_binary(", " name = 'foo',", " manifest = 'AndroidManifest.xml',", " feature_flags = {", " 'alias': 'on',", - " }", + " },", + " transitive_configs = [':flag1'],", ")"); assertThat(getConfiguredTarget("//java/com/foo")).isNull(); assertContainsEvent( @@ -3232,7 +3260,9 @@ public class AndroidBinaryTest extends AndroidBuildViewTestCase { @Test public void testFeatureFlagsAttributeSetsFeatureFlagProviderValues() throws Exception { - useConfiguration("--experimental_dynamic_configs=notrim"); + useConfiguration( + "--experimental_dynamic_configs=notrim", + "--enforce_transitive_configs_for_config_feature_flag"); scratch.file( "java/com/foo/reader.bzl", "def _impl(ctx):", @@ -3263,6 +3293,7 @@ public class AndroidBinaryTest extends AndroidBuildViewTestCase { "flag_reader(", " name = 'FooFlags',", " flags = [':flag1', ':flag2'],", + " transitive_configs = [':flag1', ':flag2'],", ")", "android_binary(", " name = 'foo',", @@ -3270,7 +3301,8 @@ public class AndroidBinaryTest extends AndroidBuildViewTestCase { " srcs = [':FooFlags.java'],", " feature_flags = {", " 'flag1': 'on',", - " }", + " },", + " transitive_configs = [':flag1', ':flag2'],", ")"); Artifact flagList = getFirstArtifactEndingWith( @@ -3316,6 +3348,7 @@ public class AndroidBinaryTest extends AndroidBuildViewTestCase { @Test public void testFeatureFlagPolicyMustContainRuleToUseFeatureFlags() throws Exception { reporter.removeHandler(failFastHandler); // expecting an error + useConfiguration("--enforce_transitive_configs_for_config_feature_flag"); scratch.overwriteFile( "tools/whitelists/config_feature_flag/BUILD", "package_group(", @@ -3337,7 +3370,8 @@ public class AndroidBinaryTest extends AndroidBuildViewTestCase { " srcs = [':FooFlags.java'],", " feature_flags = {", " '//flag:flag': 'right',", - " }", + " },", + " transitive_configs = ['//flag:flag'],", ")"); assertThat(getConfiguredTarget("//java/com/google/android/foo:foo")).isNull(); assertContainsEvent( @@ -3348,6 +3382,7 @@ public class AndroidBinaryTest extends AndroidBuildViewTestCase { @Test public void testFeatureFlagPolicyDoesNotBlockRuleIfInPolicy() throws Exception { + useConfiguration("--enforce_transitive_configs_for_config_feature_flag"); scratch.overwriteFile( "tools/whitelists/config_feature_flag/BUILD", "package_group(", @@ -3369,7 +3404,8 @@ public class AndroidBinaryTest extends AndroidBuildViewTestCase { " srcs = [':FooFlags.java'],", " feature_flags = {", " '//flag:flag': 'right',", - " }", + " },", + " transitive_configs = ['//flag:flag'],", ")"); assertThat(getConfiguredTarget("//java/com/google/android/foo:foo")).isNotNull(); assertNoEvents(); diff --git a/src/test/java/com/google/devtools/build/lib/rules/config/ConfigFeatureFlagConfigurationTest.java b/src/test/java/com/google/devtools/build/lib/rules/config/ConfigFeatureFlagConfigurationTest.java index 07dcae5dc2..7811335294 100644 --- a/src/test/java/com/google/devtools/build/lib/rules/config/ConfigFeatureFlagConfigurationTest.java +++ b/src/test/java/com/google/devtools/build/lib/rules/config/ConfigFeatureFlagConfigurationTest.java @@ -16,12 +16,15 @@ package com.google.devtools.build.lib.rules.config; import static com.google.common.truth.Truth.assertThat; import static com.google.common.truth.Truth8.assertThat; +import static org.junit.Assert.fail; import com.google.common.collect.ImmutableMap; +import com.google.common.collect.ImmutableSet; import com.google.devtools.build.lib.actions.util.LabelArtifactOwner; import com.google.devtools.build.lib.cmdline.Label; import java.util.Map; import java.util.Optional; +import java.util.Set; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.JUnit4; @@ -40,13 +43,39 @@ public final class ConfigFeatureFlagConfigurationTest { } @Test - public void getFeatureFlagValue_returnsEmptyOptionalWhenRequestingUnsetFlag() throws Exception { + public void + getFeatureFlagValue_returnsEmptyOptionalWhenRequestingUnknownFlagFromUntrimmedOptions() + throws Exception { Optional flagValue = - getConfigurationWithFlags(ImmutableMap.of(Label.parseAbsoluteUnchecked("//a:a"), "valued")) + getUntrimmedConfigurationWithFlags( + ImmutableMap.of(Label.parseAbsoluteUnchecked("//a:a"), "valued")) .getFeatureFlagValue(new LabelArtifactOwner(Label.parseAbsoluteUnchecked("//b:b"))); assertThat(flagValue).isEmpty(); } + @Test + public void getFeatureFlagValue_returnsEmptyOptionalWhenRequestingKnownDefaultFlag() + throws Exception { + Optional flagValue = + getConfigurationWithFlags( + ImmutableMap.of(Label.parseAbsoluteUnchecked("//a:a"), "valued"), + ImmutableSet.of( + Label.parseAbsoluteUnchecked("//a:a"), Label.parseAbsoluteUnchecked("//b:b"))) + .getFeatureFlagValue(new LabelArtifactOwner(Label.parseAbsoluteUnchecked("//b:b"))); + assertThat(flagValue).isEmpty(); + } + + @Test + public void getFeatureFlagValue_throwsExceptionWhenRequestingUnknownFlag() throws Exception { + try { + getConfigurationWithFlags(ImmutableMap.of(Label.parseAbsoluteUnchecked("//a:a"), "valued")) + .getFeatureFlagValue(new LabelArtifactOwner(Label.parseAbsoluteUnchecked("//b:b"))); + fail("no exception was thrown"); + } catch (ConfigFeatureFlagConfiguration.MissingFlagException expected) { + assertThat(expected).hasMessageThat().contains("//b:b"); + } + } + @Test public void getOutputDirectoryName_returnsNullWhenFlagMapIsEmpty() throws Exception { assertThat(getConfigurationWithFlags(ImmutableMap.of()).getOutputDirectoryName()) @@ -133,7 +162,22 @@ public final class ConfigFeatureFlagConfigurationTest { /** Generates a configuration fragment with the given set of flag-value pairs. */ private static ConfigFeatureFlagConfiguration getConfigurationWithFlags( Map flags) { + return getConfigurationWithFlags(flags, flags.keySet()); + } + + private static ConfigFeatureFlagConfiguration getConfigurationWithFlags( + Map flags, Set