diff options
Diffstat (limited to 'src/test/java/com/google/devtools/build/lib')
-rw-r--r-- | src/test/java/com/google/devtools/build/lib/BUILD | 1 | ||||
-rw-r--r-- | src/test/java/com/google/devtools/build/lib/rules/java/JavaSkylarkApiTest.java | 113 |
2 files changed, 114 insertions, 0 deletions
diff --git a/src/test/java/com/google/devtools/build/lib/BUILD b/src/test/java/com/google/devtools/build/lib/BUILD index 47e35eaf96..9fadf7f6f5 100644 --- a/src/test/java/com/google/devtools/build/lib/BUILD +++ b/src/test/java/com/google/devtools/build/lib/BUILD @@ -895,6 +895,7 @@ java_test( "//src/main/java/com/google/devtools/build/lib:bazel-main", "//src/main/java/com/google/devtools/build/lib:bazel-rules", "//src/main/java/com/google/devtools/build/lib:build-base", + "//src/main/java/com/google/devtools/build/lib:collect", "//src/main/java/com/google/devtools/build/lib:java-compilation", "//src/main/java/com/google/devtools/build/lib:java-rules", "//src/main/java/com/google/devtools/build/lib:packages-internal", diff --git a/src/test/java/com/google/devtools/build/lib/rules/java/JavaSkylarkApiTest.java b/src/test/java/com/google/devtools/build/lib/rules/java/JavaSkylarkApiTest.java index 8a18f541d9..616fdb71b5 100644 --- a/src/test/java/com/google/devtools/build/lib/rules/java/JavaSkylarkApiTest.java +++ b/src/test/java/com/google/devtools/build/lib/rules/java/JavaSkylarkApiTest.java @@ -22,8 +22,10 @@ import com.google.devtools.build.lib.analysis.ConfiguredTarget; import com.google.devtools.build.lib.analysis.SkylarkProviders; import com.google.devtools.build.lib.analysis.util.BuildViewTestCase; import com.google.devtools.build.lib.cmdline.Label; +import com.google.devtools.build.lib.collect.nestedset.NestedSet; import com.google.devtools.build.lib.packages.SkylarkClassObject; import com.google.devtools.build.lib.packages.SkylarkClassObjectConstructor.SkylarkKey; +import java.util.Iterator; import java.util.List; import javax.annotation.Nullable; import org.junit.Test; @@ -80,4 +82,115 @@ public class JavaSkylarkApiTest extends BuildViewTestCase { assertThat((List<?>) skylarkClassObject.getValue("processor_classnames")) .containsExactly("com.google.process.stuff"); } + + @Test + public void cannotConstructJavaProvider() throws Exception { + scratch.file( + "foo/extension.bzl", + "my_provider = provider()", + "def _impl(ctx):", + " java_p = java_common.provider", + " dep_params = java_p()", + " return [my_provider(p = dep_params)]", + "my_rule = rule(_impl, attrs = { 'dep' : attr.label() })"); + scratch.file("foo/BUILD", "load(':extension.bzl', 'my_rule')", "my_rule(name = 'r')"); + reporter.removeHandler(failFastHandler); + assertThat(getConfiguredTarget("//foo:r")).isNull(); + assertContainsEvent("'java_common.provider' cannot be constructed from Skylark"); + } + + @Test + public void javaProviderExposedOnJavaLibrary() throws Exception { + scratch.file( + "foo/extension.bzl", + "my_provider = provider()", + "def _impl(ctx):", + " dep_params = ctx.attr.dep[java_common.provider]", + " return [my_provider(p = dep_params)]", + "my_rule = rule(_impl, attrs = { 'dep' : attr.label() })"); + scratch.file( + "foo/BUILD", + "load(':extension.bzl', 'my_rule')", + "java_library(name = 'jl', srcs = ['java/A.java'])", + "my_rule(name = 'r', dep = ':jl')"); + + ConfiguredTarget myRuleTarget = getConfiguredTarget("//foo:r"); + ConfiguredTarget javaLibraryTarget = getConfiguredTarget("//foo:jl"); + SkylarkKey myProviderKey = + new SkylarkKey(Label.parseAbsolute("//foo:extension.bzl"), "my_provider"); + SkylarkClassObject declaredProvider = + myRuleTarget.getProvider(SkylarkProviders.class).getDeclaredProvider(myProviderKey); + Object javaProvider = declaredProvider.getValue("p"); + assertThat(javaProvider).isInstanceOf(JavaProvider.class); + assertThat(javaLibraryTarget.getProvider(JavaProvider.class)).isEqualTo(javaProvider); + } + + @Test + public void javaProviderPropagation() throws Exception { + scratch.file( + "foo/extension.bzl", + "def _impl(ctx):", + " dep_params = ctx.attr.dep[java_common.provider]", + " return [dep_params]", + "my_rule = rule(_impl, attrs = { 'dep' : attr.label() })"); + scratch.file( + "foo/BUILD", + "load(':extension.bzl', 'my_rule')", + "java_library(name = 'jl', srcs = ['java/A.java'])", + "my_rule(name = 'r', dep = ':jl')", + "java_library(name = 'jl_top', srcs = ['java/C.java'], deps = [':r'])"); + + ConfiguredTarget myRuleTarget = getConfiguredTarget("//foo:r"); + ConfiguredTarget javaLibraryTarget = getConfiguredTarget("//foo:jl"); + ConfiguredTarget topJavaLibraryTarget = getConfiguredTarget("//foo:jl_top"); + + Object javaProvider = myRuleTarget.get(JavaProvider.JAVA_PROVIDER.getKey()); + assertThat(javaProvider).isInstanceOf(JavaProvider.class); + + JavaProvider jlJavaProvider = javaLibraryTarget.getProvider(JavaProvider.class); + + assertThat(jlJavaProvider == javaProvider).isTrue(); + + JavaProvider jlTopJavaProvider = topJavaLibraryTarget.getProvider(JavaProvider.class); + + javaCompilationArgsHaveTheSameParent( + jlJavaProvider.getJavaCompilationArgsProvider().getJavaCompilationArgs(), + jlTopJavaProvider.getJavaCompilationArgsProvider().getJavaCompilationArgs()); + } + + private static boolean javaCompilationArgsHaveTheSameParent( + JavaCompilationArgs args, JavaCompilationArgs otherArgs) { + if (!nestedSetsOfArtifactHaveTheSameParent( + args.getCompileTimeJars(), otherArgs.getCompileTimeJars())) { + return false; + } + if (!nestedSetsOfArtifactHaveTheSameParent( + args.getInstrumentationMetadata(), otherArgs.getInstrumentationMetadata())) { + return false; + } + if (!nestedSetsOfArtifactHaveTheSameParent(args.getRuntimeJars(), otherArgs.getRuntimeJars())) { + return false; + } + return true; + } + + private static boolean nestedSetsOfArtifactHaveTheSameParent( + NestedSet<Artifact> artifacts, NestedSet<Artifact> otherArtifacts) { + Iterator<Artifact> iterator = artifacts.iterator(); + Iterator<Artifact> otherIterator = otherArtifacts.iterator(); + while (iterator.hasNext() && otherIterator.hasNext()) { + Artifact artifact = (Artifact) iterator.next(); + Artifact otherArtifact = (Artifact) otherIterator.next(); + if (!artifact + .getPath() + .getParentDirectory() + .equals(otherArtifact.getPath().getParentDirectory())) { + return false; + } + } + if (iterator.hasNext() || otherIterator.hasNext()) { + return false; + } + return true; + } }
\ No newline at end of file |