diff options
author | tomlu <tomlu@google.com> | 2018-04-24 10:54:24 -0700 |
---|---|---|
committer | Copybara-Service <copybara-piper@google.com> | 2018-04-24 10:55:39 -0700 |
commit | 177e5912b578f2261124578061a6eab7b6afa7f2 (patch) | |
tree | d78c0001bb216c612380bfa0f3423f0c642bb908 /src/test/java/com/google/devtools/build/lib/rules | |
parent | d1af4306095545151b1c062e5544f80496ceb5eb (diff) |
Add new-style JavaInfo provider constructor.
Design: https://docs.google.com/document/d/1ubah6phuvWnugShtVgSQnaopQ1BtKtNxQASVwGZA7k0/
* Moves action construction out into java_common.run_ijar, java_common.pack_sources
* Deprecates corresponding arguments in JavaInfo
An incompatible flag will be added in another CL since it is not possible to add incompatible flags at the same time as new functionality is added.
RELNOTES: Adds new-style JavaInfo provider constructor.
PiperOrigin-RevId: 194111925
Diffstat (limited to 'src/test/java/com/google/devtools/build/lib/rules')
-rw-r--r-- | src/test/java/com/google/devtools/build/lib/rules/java/JavaInfoSkylarkApiTest.java | 233 |
1 files changed, 192 insertions, 41 deletions
diff --git a/src/test/java/com/google/devtools/build/lib/rules/java/JavaInfoSkylarkApiTest.java b/src/test/java/com/google/devtools/build/lib/rules/java/JavaInfoSkylarkApiTest.java index 4619b7a5ea..8fb0b29785 100644 --- a/src/test/java/com/google/devtools/build/lib/rules/java/JavaInfoSkylarkApiTest.java +++ b/src/test/java/com/google/devtools/build/lib/rules/java/JavaInfoSkylarkApiTest.java @@ -16,6 +16,7 @@ package com.google.devtools.build.lib.rules.java; import static com.google.common.truth.Truth.assertThat; import static com.google.devtools.build.lib.actions.util.ActionsTestUtil.prettyArtifactNames; +import com.google.common.collect.ImmutableList; import com.google.devtools.build.lib.analysis.ConfiguredTarget; import com.google.devtools.build.lib.analysis.util.BuildViewTestCase; import com.google.devtools.build.lib.cmdline.Label; @@ -25,17 +26,27 @@ import com.google.devtools.build.lib.rules.java.JavaRuleOutputJarsProvider.Outpu import com.google.devtools.build.lib.testutil.TestConstants; import org.junit.Test; import org.junit.runner.RunWith; -import org.junit.runners.JUnit4; +import org.junit.runners.Parameterized; +import org.junit.runners.Parameterized.Parameters; -/** - * Tests JavaInfo API for Skylark. - */ -@RunWith(JUnit4.class) +/** Tests JavaInfo API for Skylark. */ +@RunWith(Parameterized.class) public class JavaInfoSkylarkApiTest extends BuildViewTestCase { private static final String HOST_JAVA_RUNTIME_LABEL = TestConstants.TOOLS_REPOSITORY + "//tools/jdk:current_host_java_runtime"; + @Parameters(name = "Use legacy JavaInfo constructor: {0}") + public static Iterable<Object[]> legacyJavaInfoConstructor() { + return ImmutableList.of(new Object[] {false}, new Object[] {true}); + } + + private final boolean legacyJavaInfoConstructor; + + public JavaInfoSkylarkApiTest(boolean legacyJavaInfoConstructor) { + this.legacyJavaInfoConstructor = legacyJavaInfoConstructor; + } + @Test public void buildHelperCreateJavaInfoWithOutputJarOnly() throws Exception { ruleBuilder().build(); @@ -94,7 +105,7 @@ public class JavaInfoSkylarkApiTest extends BuildViewTestCase { } @Test - public void buildHelperCreateJavaInfoJavaRuleOutputJarsProviderSourseJarOutputJarAndUseIJar() + public void buildHelperCreateJavaInfoJavaRuleOutputJarsProviderSourceJarOutputJarAndUseIJar() throws Exception { ruleBuilder() .withIJar() @@ -591,13 +602,88 @@ public class JavaInfoSkylarkApiTest extends BuildViewTestCase { "foo/libmy_java_lib_d-hjar.jar"); } + @Test + public void buildHelperCreateJavaInfoWithOutputJarAndStampJar() throws Exception { + if (legacyJavaInfoConstructor) { + // Unsupported mode, don't test this + return; + } - private RuleBuilder ruleBuilder(){ + ruleBuilder().withStampJar().build(); + + scratch.file( + "foo/BUILD", + "load(':extension.bzl', 'my_rule')", + "my_rule(", + " name = 'my_skylark_rule',", + " output_jar = 'my_skylark_rule_lib.jar',", + " source_jars = ['my_skylark_rule_src.jar']", + ")"); + assertNoEvents(); + + JavaCompilationArgsProvider javaCompilationArgsProvider = + fetchJavaInfo().getProvider(JavaCompilationArgsProvider.class); + assertThat( + prettyArtifactNames( + javaCompilationArgsProvider.getJavaCompilationArgs().getRuntimeJars())) + .containsExactly("foo/my_skylark_rule_lib.jar"); + assertThat( + prettyArtifactNames( + javaCompilationArgsProvider.getJavaCompilationArgs().getFullCompileTimeJars())) + .containsExactly("foo/my_skylark_rule_lib.jar"); + assertThat( + prettyArtifactNames( + javaCompilationArgsProvider.getJavaCompilationArgs().getCompileTimeJars())) + .containsExactly("foo/my_skylark_rule_lib-stamped.jar"); + assertThat( + prettyArtifactNames( + javaCompilationArgsProvider.getRecursiveJavaCompilationArgs().getRuntimeJars())) + .containsExactly("foo/my_skylark_rule_lib.jar"); + assertThat( + prettyArtifactNames( + javaCompilationArgsProvider + .getRecursiveJavaCompilationArgs() + .getFullCompileTimeJars())) + .containsExactly("foo/my_skylark_rule_lib.jar"); + assertThat( + prettyArtifactNames( + javaCompilationArgsProvider.getRecursiveJavaCompilationArgs().getCompileTimeJars())) + .containsExactly("foo/my_skylark_rule_lib-stamped.jar"); + } + + @Test + public void testMixMatchNewAndLegacyArgsIsError() throws Exception { + ImmutableList.Builder<String> lines = ImmutableList.builder(); + lines.add( + "result = provider()", + "def _impl(ctx):", + " output_jar = ctx.actions.declare_file('output_jar')", + " source_jar = ctx.actions.declare_file('source_jar')", + " javaInfo = JavaInfo(", + " output_jar = output_jar, ", + " source_jar = source_jar,", + " source_jars = [source_jar],", + " )", + " return [result(property = javaInfo)]", + "my_rule = rule(", + " implementation = _impl,", + ")"); + scratch.file("foo/extension.bzl", lines.build().toArray(new String[] {})); + checkError( + "foo", + "my_skylark_rule", + "Cannot use deprecated arguments at the same time", + "load(':extension.bzl', 'my_rule')", + "my_rule(name = 'my_skylark_rule')"); + } + + private RuleBuilder ruleBuilder() { return new RuleBuilder(); } - private class RuleBuilder{ + private class RuleBuilder { private boolean useIJar = false; + private boolean stampJar; private boolean neverLink = false; private boolean sourceFiles = false; @@ -606,6 +692,11 @@ public class JavaInfoSkylarkApiTest extends BuildViewTestCase { return this; } + private RuleBuilder withStampJar() { + stampJar = true; + return this; + } + private RuleBuilder withNeverLink() { neverLink = true; return this; @@ -616,18 +707,9 @@ public class JavaInfoSkylarkApiTest extends BuildViewTestCase { return this; } - private void build() throws Exception { - if (useIJar || sourceFiles) { - writeBuildFileForJavaToolchain(); - } - - String[] lines = { - "result = provider()", - "def _impl(ctx):", - " ctx.actions.write(ctx.outputs.output_jar, 'JavaInfo API Test', is_executable=False) ", - " dp = [dep[java_common.provider] for dep in ctx.attr.dep]", - " dp_runtime = [dep[java_common.provider] for dep in ctx.attr.dep_runtime]", - " dp_exports = [dep[java_common.provider] for dep in ctx.attr.dep_exports]", + private String[] legacyJavaInfo() { + assertThat(stampJar).isFalse(); + return new String[] { " javaInfo = JavaInfo(", " output_jar = ctx.outputs.output_jar, ", useIJar ? " use_ijar = True," : " use_ijar = False,", @@ -641,29 +723,98 @@ public class JavaInfoSkylarkApiTest extends BuildViewTestCase { useIJar || sourceFiles ? " java_toolchain = ctx.attr._toolchain," : "", sourceFiles ? " host_javabase = ctx.attr._host_javabase," : "", " )", - " return [result(property = javaInfo)]", - "my_rule = rule(", - " implementation = _impl,", - " attrs = {", - " 'dep' : attr.label_list(),", - " 'dep_runtime' : attr.label_list(),", - " 'dep_exports' : attr.label_list(),", - " 'output_jar' : attr.output(default=None, mandatory=True),", - " 'source_jars' : attr.label_list(allow_files=['.jar']),", - " 'sources' : attr.label_list(allow_files=['.java']),", - useIJar || sourceFiles - ? " '_toolchain': attr.label(default = Label('//java/com/google/test:toolchain'))," - : "", - sourceFiles - ? " '_host_javabase': attr.label(default = Label('" - + HOST_JAVA_RUNTIME_LABEL - + "'))," - : "", - " }", - ")" + " return [result(property = javaInfo)]" }; + } + + private String[] newJavaInfo() { + assertThat(useIJar && stampJar).isFalse(); + ImmutableList.Builder<String> lines = ImmutableList.builder(); + if (useIJar) { + lines.add( + " compile_jar = java_common.run_ijar(", + " ctx.actions,", + " jar = ctx.outputs.output_jar,", + " java_toolchain = ctx.attr._toolchain,", + " )"); + } else if (stampJar) { + lines.add( + " compile_jar = java_common.stamp_jar(", + " ctx.actions,", + " jar = ctx.outputs.output_jar,", + " target_label = ctx.label,", + " java_toolchain = ctx.attr._toolchain,", + " )"); + } else { + lines.add(" compile_jar = ctx.outputs.output_jar"); + } + if (sourceFiles) { + lines.add( + " source_jar = java_common.pack_sources(", + " ctx.actions,", + " output_jar = ctx.outputs.output_jar,", + " sources = ctx.files.sources,", + " source_jars = ctx.files.source_jars,", + " java_toolchain = ctx.attr._toolchain,", + " host_javabase = ctx.attr._host_javabase,", + ")"); + } else { + lines.add( + " if ctx.files.source_jars:", + " source_jar = list(ctx.files.source_jars)[0]", + " else:", + " source_jar = None"); + } + lines.add( + " javaInfo = JavaInfo(", + " output_jar = ctx.outputs.output_jar, ", + " compile_jar = compile_jar,", + " source_jar = source_jar,", + neverLink ? " neverlink = True," : "", + " deps = dp,", + " runtime_deps = dp_runtime,", + " exports = dp_exports,", + " )", + " return [result(property = javaInfo)]"); + return lines.build().toArray(new String[] {}); + } + + private void build() throws Exception { + if (useIJar || stampJar || sourceFiles) { + writeBuildFileForJavaToolchain(); + } - scratch.file("foo/extension.bzl", lines); + ImmutableList.Builder<String> lines = ImmutableList.builder(); + lines.add( + "result = provider()", + "def _impl(ctx):", + " ctx.actions.write(ctx.outputs.output_jar, 'JavaInfo API Test', is_executable=False) ", + " dp = [dep[java_common.provider] for dep in ctx.attr.dep]", + " dp_runtime = [dep[java_common.provider] for dep in ctx.attr.dep_runtime]", + " dp_exports = [dep[java_common.provider] for dep in ctx.attr.dep_exports]"); + lines.add(legacyJavaInfoConstructor ? legacyJavaInfo() : newJavaInfo()); + lines.add( + "my_rule = rule(", + " implementation = _impl,", + " attrs = {", + " 'dep' : attr.label_list(),", + " 'dep_runtime' : attr.label_list(),", + " 'dep_exports' : attr.label_list(),", + " 'output_jar' : attr.output(default=None, mandatory=True),", + " 'source_jars' : attr.label_list(allow_files=['.jar']),", + " 'sources' : attr.label_list(allow_files=['.java']),", + useIJar || stampJar || sourceFiles + ? " '_toolchain': attr.label(default = Label('//java/com/google/test:toolchain'))," + : "", + sourceFiles + ? " '_host_javabase': attr.label(default = Label('" + + HOST_JAVA_RUNTIME_LABEL + + "'))," + : "", + " }", + ")"); + + scratch.file("foo/extension.bzl", lines.build().toArray(new String[] {})); } } |