diff options
author | dslomov <dslomov@google.com> | 2017-08-02 23:29:54 +0200 |
---|---|---|
committer | Dmitry Lomov <dslomov@google.com> | 2017-08-03 12:10:00 +0200 |
commit | c13bb39f78de5e016c9ec1e3e20c43a92ea7d159 (patch) | |
tree | 2b66f2ef9fb463f4ef71e3ae2feeaafb59886054 /src/test/java/com/google/devtools/build | |
parent | 20f7da51b3228eca561102e3b871b67b704347a9 (diff) |
Use RequiredProviders to validate rule prerequisites in RuleContext.
We now use a unified way to check provider requirements everywhere.
Reland of https://github.com/bazelbuild/bazel/commit/c32e1b1efcd703b3780de47fba62974123593d71.
RELNOTES: None.
PiperOrigin-RevId: 164038621
Diffstat (limited to 'src/test/java/com/google/devtools/build')
3 files changed, 100 insertions, 55 deletions
diff --git a/src/test/java/com/google/devtools/build/lib/packages/RequiredProvidersTest.java b/src/test/java/com/google/devtools/build/lib/packages/RequiredProvidersTest.java index e86cc41f16..489303fef3 100644 --- a/src/test/java/com/google/devtools/build/lib/packages/RequiredProvidersTest.java +++ b/src/test/java/com/google/devtools/build/lib/packages/RequiredProvidersTest.java @@ -16,7 +16,6 @@ package com.google.devtools.build.lib.packages; import static com.google.common.truth.Truth.assertThat; -import com.google.common.base.Predicates; import com.google.common.collect.ImmutableSet; import com.google.devtools.build.lib.cmdline.Label; import com.google.devtools.build.lib.cmdline.LabelSyntaxException; @@ -31,6 +30,9 @@ import org.junit.runners.JUnit4; */ @RunWith(JUnit4.class) public class RequiredProvidersTest { + + private static final String NO_PROVIDERS_REQUIRED = "no providers required"; + private static final class P1 {} private static final class P2 {} private static final class P3 {} @@ -59,10 +61,11 @@ public class RequiredProvidersTest { RequiredProviders requiredProviders) { boolean result = requiredProviders.isSatisfiedBy(providers); - assertThat(requiredProviders.isSatisfiedBy( - Predicates.in(providers.getNativeProviders()), - Predicates.in(providers.getSkylarkProviders()) - )).isEqualTo(result); + assertThat( + requiredProviders.isSatisfiedBy( + providers.getNativeProviders()::contains, + providers.getSkylarkProviders()::contains)) + .isEqualTo(result); return result; } @@ -108,32 +111,31 @@ public class RequiredProvidersTest { .addNative(P1.class) .addNative(P2.class) .build(); - assertThat(validateNative(providerSet, ImmutableSet.<Class<?>>of(P1.class, P2.class))) + assertThat( + validateNative(providerSet, NO_PROVIDERS_REQUIRED, ImmutableSet.of(P1.class, P2.class))) .isTrue(); } @Test public void nativeProvidersBranchMatch() { assertThat( - validateNative( - AdvertisedProviderSet.builder() - .addNative(P1.class) - .build(), - ImmutableSet.<Class<?>>of(P1.class), - ImmutableSet.<Class<?>>of(P2.class) - )).isTrue(); + validateNative( + AdvertisedProviderSet.builder().addNative(P1.class).build(), + NO_PROVIDERS_REQUIRED, + ImmutableSet.<Class<?>>of(P1.class), + ImmutableSet.<Class<?>>of(P2.class))) + .isTrue(); } @Test public void nativeProvidersNoMatch() { assertThat( - validateNative( - AdvertisedProviderSet.builder() - .addNative(P3.class) - .build(), - ImmutableSet.<Class<?>>of(P1.class), - ImmutableSet.<Class<?>>of(P2.class) - )).isFalse(); + validateNative( + AdvertisedProviderSet.builder().addNative(P3.class).build(), + "P1 or P2", + ImmutableSet.<Class<?>>of(P1.class), + ImmutableSet.<Class<?>>of(P2.class))) + .isFalse(); } @Test @@ -143,53 +145,75 @@ public class RequiredProvidersTest { .addSkylark(ID_NATIVE) .addSkylark(ID_SKYLARK) .build(); - assertThat(validateSkylark(providerSet, - ImmutableSet.of( - ID_LEGACY, ID_SKYLARK, ID_NATIVE))) + assertThat( + validateSkylark( + providerSet, + NO_PROVIDERS_REQUIRED, + ImmutableSet.of(ID_LEGACY, ID_SKYLARK, ID_NATIVE))) .isTrue(); } @Test public void skylarkProvidersBranchMatch() { assertThat( - validateSkylark( - AdvertisedProviderSet.builder() - .addSkylark(ID_LEGACY) - .build(), - ImmutableSet.of(ID_LEGACY), - ImmutableSet.of(ID_NATIVE) - )).isTrue(); + validateSkylark( + AdvertisedProviderSet.builder().addSkylark(ID_LEGACY).build(), + NO_PROVIDERS_REQUIRED, + ImmutableSet.of(ID_LEGACY), + ImmutableSet.of(ID_NATIVE))) + .isTrue(); } @Test public void skylarkProvidersNoMatch() { assertThat( - validateSkylark( - AdvertisedProviderSet.builder() - .addSkylark(ID_SKYLARK) - .build(), - ImmutableSet.of(ID_LEGACY), - ImmutableSet.of(ID_NATIVE) - )).isFalse(); + validateSkylark( + AdvertisedProviderSet.builder().addSkylark(ID_SKYLARK).build(), + "'p_legacy' or 'p_native'", + ImmutableSet.of(ID_LEGACY), + ImmutableSet.of(ID_NATIVE))) + .isFalse(); + } + + @Test + public void checkDescriptions() { + assertThat(RequiredProviders.acceptAnyBuilder().build().getDescription()) + .isEqualTo("no providers required"); + assertThat(RequiredProviders.acceptNoneBuilder().build().getDescription()) + .isEqualTo("no providers accepted"); + assertThat( + RequiredProviders.acceptAnyBuilder() + .addSkylarkSet(ImmutableSet.of(ID_LEGACY, ID_SKYLARK)) + .addSkylarkSet(ImmutableSet.of(ID_SKYLARK)) + .addNativeSet(ImmutableSet.of(P1.class, P2.class)) + .build() + .getDescription()) + .isEqualTo("[P1, P2] or ['p_legacy', 'p_skylark'] or 'p_skylark'"); } @SafeVarargs - private static boolean validateNative(AdvertisedProviderSet providerSet, - ImmutableSet<Class<?>>... sets) { + private static boolean validateNative( + AdvertisedProviderSet providerSet, String missing, ImmutableSet<Class<?>>... sets) { Builder anyBuilder = RequiredProviders.acceptAnyBuilder(); Builder noneBuilder = RequiredProviders.acceptNoneBuilder(); for (ImmutableSet<Class<?>> set : sets) { anyBuilder.addNativeSet(set); noneBuilder.addNativeSet(set); } - boolean result = satisfies(providerSet, anyBuilder.build()); - assertThat(satisfies(providerSet, noneBuilder.build())).isEqualTo(result); + RequiredProviders rpStartingFromAny = anyBuilder.build(); + boolean result = satisfies(providerSet, rpStartingFromAny); + assertThat(rpStartingFromAny.getMissing(providerSet).getDescription()).isEqualTo(missing); + + RequiredProviders rpStaringFromNone = noneBuilder.build(); + assertThat(satisfies(providerSet, rpStaringFromNone)).isEqualTo(result); + assertThat(rpStaringFromNone.getMissing(providerSet).getDescription()).isEqualTo(missing); return result; } @SafeVarargs private static boolean validateSkylark( AdvertisedProviderSet providerSet, + String missing, ImmutableSet<SkylarkProviderIdentifier>... sets) { Builder anyBuilder = RequiredProviders.acceptAnyBuilder(); Builder noneBuilder = RequiredProviders.acceptNoneBuilder(); @@ -197,8 +221,14 @@ public class RequiredProvidersTest { anyBuilder.addSkylarkSet(set); noneBuilder.addSkylarkSet(set); } - boolean result = satisfies(providerSet, anyBuilder.build()); - assertThat(satisfies(providerSet, noneBuilder.build())).isEqualTo(result); + + RequiredProviders rpStartingFromAny = anyBuilder.build(); + boolean result = satisfies(providerSet, rpStartingFromAny); + assertThat(rpStartingFromAny.getMissing(providerSet).getDescription()).isEqualTo(missing); + + RequiredProviders rpStaringFromNone = noneBuilder.build(); + assertThat(satisfies(providerSet, rpStaringFromNone)).isEqualTo(result); + assertThat(rpStaringFromNone.getMissing(providerSet).getDescription()).isEqualTo(missing); return result; } } diff --git a/src/test/java/com/google/devtools/build/lib/skylark/SkylarkIntegrationTest.java b/src/test/java/com/google/devtools/build/lib/skylark/SkylarkIntegrationTest.java index b346a60513..71e084da10 100644 --- a/src/test/java/com/google/devtools/build/lib/skylark/SkylarkIntegrationTest.java +++ b/src/test/java/com/google/devtools/build/lib/skylark/SkylarkIntegrationTest.java @@ -711,7 +711,7 @@ public class SkylarkIntegrationTest extends BuildViewTestCase { "main_rule = rule(implementation = rule_impl, attrs = {", " 'deps': attr.label_list(providers = [", " 'files', 'data_runfiles', 'default_runfiles',", - " 'files_to_run', 'label', 'output_groups',", + " 'files_to_run', 'output_groups',", " ])", "})"); scratch.file( 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 5c32321734..c212605bc2 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 @@ -249,8 +249,18 @@ public class SkylarkRuleClassFunctionsTest extends SkylarkTestCase { buildAttribute("a1", "b = provider()", "attr.label_list(allow_files = True, providers = ['a', b])"); - assertThat(attr.getMandatoryProvidersList()) - .containsExactly(ImmutableSet.of(legacy("a"), declared("b"))); + assertThat(attr.getRequiredProviders().isSatisfiedBy(set(legacy("a"), declared("b")))).isTrue(); + assertThat(attr.getRequiredProviders().isSatisfiedBy(set(legacy("a")))).isFalse(); + } + + @Test + public void testAttrWithProvidersOneEmpty() throws Exception { + Attribute attr = + buildAttribute( + "a1", + "b = provider()", + "attr.label_list(allow_files = True, providers = [['a', b],[]])"); + assertThat(attr.getRequiredProviders().acceptsAny()).isTrue(); } @Test @@ -259,9 +269,17 @@ public class SkylarkRuleClassFunctionsTest extends SkylarkTestCase { buildAttribute("a1", "b = provider()", "attr.label_list(allow_files = True, providers = [['a', b], ['c']])"); - assertThat(attr.getMandatoryProvidersList()).containsExactly( - ImmutableSet.of(legacy("a"), declared("b")), - ImmutableSet.of(legacy("c"))); + assertThat(attr.getRequiredProviders().isSatisfiedBy(set(legacy("a"), declared("b")))).isTrue(); + assertThat(attr.getRequiredProviders().isSatisfiedBy(set(legacy("c")))).isTrue(); + assertThat(attr.getRequiredProviders().isSatisfiedBy(set(legacy("a")))).isFalse(); + } + + private static AdvertisedProviderSet set(SkylarkProviderIdentifier... ids) { + AdvertisedProviderSet.Builder builder = AdvertisedProviderSet.builder(); + for (SkylarkProviderIdentifier id : ids) { + builder.addSkylark(id); + } + return builder.build(); } private void checkAttributeError(String expectedMessage, String... lines) throws Exception { @@ -425,12 +443,9 @@ public class SkylarkRuleClassFunctionsTest extends SkylarkTestCase { private static final RuleClass.ConfiguredTargetFactory<Object, Object> DUMMY_CONFIGURED_TARGET_FACTORY = - new RuleClass.ConfiguredTargetFactory<Object, Object>() { - @Override - public Object create(Object ruleContext) throws InterruptedException { - throw new IllegalStateException(); - } - }; + ruleContext -> { + throw new IllegalStateException(); + }; private RuleClass ruleClass(String name) { return new RuleClass.Builder(name, RuleClassType.NORMAL, false) |