aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/test/java/com/google/devtools/build
diff options
context:
space:
mode:
authorGravatar dslomov <dslomov@google.com>2017-08-02 23:29:54 +0200
committerGravatar Dmitry Lomov <dslomov@google.com>2017-08-03 12:10:00 +0200
commitc13bb39f78de5e016c9ec1e3e20c43a92ea7d159 (patch)
tree2b66f2ef9fb463f4ef71e3ae2feeaafb59886054 /src/test/java/com/google/devtools/build
parent20f7da51b3228eca561102e3b871b67b704347a9 (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')
-rw-r--r--src/test/java/com/google/devtools/build/lib/packages/RequiredProvidersTest.java116
-rw-r--r--src/test/java/com/google/devtools/build/lib/skylark/SkylarkIntegrationTest.java2
-rw-r--r--src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleClassFunctionsTest.java37
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)