Refactor JavaCompileAction tests to avoid referring to APIs that don't exist in SpawnAction, in preparation for replacing the custom JavaCompileAction implementation with a regular SpawnAction. PiperOrigin-RevId: 214402809
diff --git a/src/java_tools/buildjar/java/com/google/devtools/build/buildjar/BUILD b/src/java_tools/buildjar/java/com/google/devtools/build/buildjar/BUILD index 7d88f13..4343b7d 100644 --- a/src/java_tools/buildjar/java/com/google/devtools/build/buildjar/BUILD +++ b/src/java_tools/buildjar/java/com/google/devtools/build/buildjar/BUILD
@@ -20,8 +20,11 @@ "InvalidCommandLineException.java", "OptionsParser.java", ], + visibility = [ + "//src/java_tools/buildjar:buildjar_package_group", + "//src/test/java/com/google/devtools/build/lib:__subpackages__", + ], deps = [ - ":JarOwner", "//third_party:guava", "//third_party:jsr305", ], @@ -69,7 +72,6 @@ ], ), deps = [ - ":JarOwner", ":invalid_command_line_exception", ":jarhelper", ":javac",
diff --git a/src/java_tools/buildjar/java/com/google/devtools/build/buildjar/OptionsParser.java b/src/java_tools/buildjar/java/com/google/devtools/build/buildjar/OptionsParser.java index 93bc862..872f2dd 100644 --- a/src/java_tools/buildjar/java/com/google/devtools/build/buildjar/OptionsParser.java +++ b/src/java_tools/buildjar/java/com/google/devtools/build/buildjar/OptionsParser.java
@@ -29,6 +29,7 @@ import java.util.HashSet; import java.util.Iterator; import java.util.LinkedHashMap; +import java.util.LinkedHashSet; import java.util.List; import java.util.Map; import java.util.NoSuchElementException; @@ -42,13 +43,13 @@ public final class OptionsParser { private final List<String> javacOpts = new ArrayList<>(); - private final Set<String> directJars = new HashSet<>(); + private final Set<String> directJars = new LinkedHashSet<>(); private String strictJavaDeps; private String fixDepsTool; private String outputDepsProtoFile; - private final Set<String> depsArtifacts = new HashSet<>(); + private final Set<String> depsArtifacts = new LinkedHashSet<>(); private boolean strictClasspathMode;
diff --git a/src/test/java/com/google/devtools/build/lib/BUILD b/src/test/java/com/google/devtools/build/lib/BUILD index 051cd77..fb1aabf 100644 --- a/src/test/java/com/google/devtools/build/lib/BUILD +++ b/src/test/java/com/google/devtools/build/lib/BUILD
@@ -1111,15 +1111,32 @@ ], ) +JAVA_COMPILE_ACTION_TEST_HELPER_SRCS = ["rules/java/JavaCompileActionTestHelper.java"] + +java_library( + name = "java_compile_action_test_helper", + testonly = 1, + srcs = JAVA_COMPILE_ACTION_TEST_HELPER_SRCS, + deps = [ + "//src/java_tools/buildjar/java/com/google/devtools/build/buildjar:optionsparser", + "//src/main/java/com/google/devtools/build/lib:build-base", + "//third_party:guava", + ], +) + java_test( name = "java-rules-tests", - srcs = glob(["rules/java/*.java"]), + srcs = glob( + ["rules/java/*.java"], + exclude = JAVA_COMPILE_ACTION_TEST_HELPER_SRCS, + ), tags = ["rules"], test_class = "com.google.devtools.build.lib.AllTests", deps = [ ":actions_testutil", ":analysis_testutil", ":guava_junit_truth", + ":java_compile_action_test_helper", ":testutil", "//src/main/java/com/google/devtools/build/lib:bazel-main", "//src/main/java/com/google/devtools/build/lib:bazel-rules",
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewTestCase.java b/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewTestCase.java index 2221dba..bbdef89 100644 --- a/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewTestCase.java +++ b/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewTestCase.java
@@ -165,6 +165,7 @@ import java.util.Arrays; import java.util.Collection; import java.util.Collections; +import java.util.HashSet; import java.util.Iterator; import java.util.LinkedHashSet; import java.util.List; @@ -1211,6 +1212,20 @@ root, owner); } + /** Returns the input {@link Artifact}s to the given {@link Action} with the given exec paths. */ + protected List<Artifact> getInputs(Action owner, Collection<String> execPaths) { + Set<String> expectedPaths = new HashSet<>(execPaths); + List<Artifact> result = new ArrayList<>(); + for (Artifact output : owner.getInputs()) { + if (expectedPaths.remove(output.getExecPathString())) { + result.add(output); + } + } + assertThat(expectedPaths) + .named("expected paths not found in: %s", Artifact.asExecPaths(owner.getInputs())) + .isEmpty(); + return result; + } /** * Gets a derived Artifact for testing in the {@link BuildConfiguration#getBinDirectory}. This
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 7a4394a..a82adce 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
@@ -19,6 +19,8 @@ import static com.google.common.truth.Truth.assertWithMessage; import static com.google.devtools.build.lib.actions.util.ActionsTestUtil.getFirstArtifactEndingWith; import static com.google.devtools.build.lib.actions.util.ActionsTestUtil.prettyArtifactNames; +import static com.google.devtools.build.lib.rules.java.JavaCompileActionTestHelper.getJavacArguments; +import static com.google.devtools.build.lib.rules.java.JavaCompileActionTestHelper.getProcessorpath; import static com.google.devtools.build.lib.testutil.MoreAsserts.assertThrows; import com.google.common.base.Joiner; @@ -242,11 +244,13 @@ JavaCompileAction javacAction = (JavaCompileAction) getGeneratingAction( getBinArtifact("libto_be_processed.jar", target)); - assertThat(javacAction.getProcessorNames()).contains("com.google.process.stuff"); - assertThat(javacAction.getProcessorNames()).hasSize(1); + assertThat(getProcessorNames(javacAction)).contains("com.google.process.stuff"); + assertThat(getProcessorNames(javacAction)).hasSize(1); - assertThat(ActionsTestUtil.baseNamesOf(javacAction.getProcessorpath())) - .isEqualTo("libplugin.jar libplugin_dep.jar"); + assertThat( + ActionsTestUtil.baseArtifactNames( + getInputs(javacAction, getProcessorpath(javacAction)))) + .containsExactly("libplugin.jar", "libplugin_dep.jar"); assertThat( actionsTestUtil() .predecessorClosureOf(getFilesToBuild(target), JavaSemantics.JAVA_SOURCE)) @@ -272,10 +276,12 @@ JavaCompileAction javacAction = (JavaCompileAction) getGeneratingAction( getBinArtifact("libto_be_processed.jar", target)); - assertThat(javacAction.getProcessorNames()).contains("com.google.process.stuff"); - assertThat(javacAction.getProcessorNames()).hasSize(1); - assertThat(ActionsTestUtil.baseNamesOf(javacAction.getProcessorpath())) - .isEqualTo("libplugin.jar libplugin_dep.jar"); + assertThat(getProcessorNames(javacAction)).contains("com.google.process.stuff"); + assertThat(getProcessorNames(javacAction)).hasSize(1); + assertThat( + ActionsTestUtil.baseArtifactNames( + getInputs(javacAction, getProcessorpath(javacAction)))) + .containsExactly("libplugin.jar", "libplugin_dep.jar"); assertThat( actionsTestUtil() .predecessorClosureOf(getFilesToBuild(target), JavaSemantics.JAVA_SOURCE)) @@ -1083,7 +1089,7 @@ ConfiguredTarget b1 = getConfiguredTarget("//java/com/google/android/neversayneveragain:b1"); Action b1DeployAction = actionsTestUtil().getActionForArtifactEndingWith( actionsTestUtil().artifactClosureOf(getFilesToBuild(b1)), "b1_deploy.jar"); - List<String> b1Inputs = ActionsTestUtil.prettyArtifactNames(b1DeployAction.getInputs()); + List<String> b1Inputs = prettyArtifactNames(b1DeployAction.getInputs()); assertThat(b1Inputs).containsNoneOf( "java/com/google/android/neversayneveragain/libl1.jar_desugared.jar", @@ -1100,7 +1106,7 @@ ConfiguredTarget b2 = getConfiguredTarget("//java/com/google/android/neversayneveragain:b2"); Action b2DeployAction = actionsTestUtil().getActionForArtifactEndingWith( actionsTestUtil().artifactClosureOf(getFilesToBuild(b2)), "b2_deploy.jar"); - List<String> b2Inputs = ActionsTestUtil.prettyArtifactNames(b2DeployAction.getInputs()); + List<String> b2Inputs = prettyArtifactNames(b2DeployAction.getInputs()); assertThat(b2Inputs).containsNoneOf( "java/com/google/android/neversayneveragain/libl1.jar_desugared.jar", @@ -1117,7 +1123,7 @@ ConfiguredTarget b3 = getConfiguredTarget("//java/com/google/android/neversayneveragain:b3"); Action b3DeployAction = actionsTestUtil().getActionForArtifactEndingWith( actionsTestUtil().artifactClosureOf(getFilesToBuild(b3)), "b3_deploy.jar"); - List<String> b3Inputs = ActionsTestUtil.prettyArtifactNames(b3DeployAction.getInputs()); + List<String> b3Inputs = prettyArtifactNames(b3DeployAction.getInputs()); assertThat(b3Inputs).containsAllOf( "java/com/google/android/neversayneveragain/_dx/l1/libl1.jar_desugared.jar", @@ -2808,7 +2814,7 @@ actionsTestUtil().getActionForArtifactEndingWith( actionsTestUtil().artifactClosureOf(deployAction.getInputs()), "liba.jar"); - assertThat(javacAction.buildCommandLine()).contains("-g:lines,source"); + assertThat(getJavacArguments(javacAction)).contains("-g:lines,source"); } @Test @@ -2822,7 +2828,8 @@ " srcs = ['A.java'])"); Iterable<String> commandLine = - ((JavaCompileAction) + getJavacArguments( + ((JavaCompileAction) actionsTestUtil() .getActionForArtifactEndingWith( actionsTestUtil() @@ -2831,8 +2838,7 @@ getFileConfiguredTarget("//java/foo:a_deploy.jar") .getArtifact()) .getInputs()), - "liba.jar")) - .buildCommandLine(); + "liba.jar"))); assertThat(commandLine).containsAllOf("--experimental_fix_deps_tool", "autofixer").inOrder(); } @@ -2846,7 +2852,8 @@ " srcs = ['A.java'])"); Iterable<String> commandLine = - ((JavaCompileAction) + getJavacArguments( + ((JavaCompileAction) actionsTestUtil() .getActionForArtifactEndingWith( actionsTestUtil() @@ -2855,8 +2862,7 @@ getFileConfiguredTarget("//java/foo:a_deploy.jar") .getArtifact()) .getInputs()), - "liba.jar")) - .buildCommandLine(); + "liba.jar"))); assertThat(commandLine).containsAllOf("--experimental_fix_deps_tool", "add_dep").inOrder(); } @@ -3766,7 +3772,7 @@ getFilesToBuild(binary), "_proguard.jar"); assertWithMessage("Proguard action does not contain expected inputs.") - .that(ActionsTestUtil.prettyArtifactNames(action.getInputs())) + .that(prettyArtifactNames(action.getInputs())) .containsAllOf( "java/com/google/android/hello/proguard-spec.pro", "java/com/google/android/hello/proguard-spec1.pro", @@ -3899,7 +3905,7 @@ SpawnAction action = (SpawnAction) actionsTestUtil().getActionForArtifactEndingWith( getFilesToBuild(getConfiguredTarget("//java/com/google/android/hello:b")), "_proguard.jar"); - assertThat(ActionsTestUtil.prettyArtifactNames(action.getInputs())).containsNoDuplicates(); + assertThat(prettyArtifactNames(action.getInputs())).containsNoDuplicates(); assertThat(Collections2.filter(action.getArguments(), arg -> arg.startsWith("@"))) .containsExactly( "@" + execPathEndingWith(action.getInputs(), "/proguard-spec.pro"), @@ -3920,7 +3926,7 @@ SpawnAction action = (SpawnAction) actionsTestUtil().getActionForArtifactEndingWith( getFilesToBuild(getConfiguredTarget("//java/com/google/android/hello:b")), "_proguard.jar"); - assertThat(ActionsTestUtil.prettyArtifactNames(action.getInputs())).containsNoDuplicates(); + assertThat(prettyArtifactNames(action.getInputs())).containsNoDuplicates(); assertThat(Collections2.filter(action.getArguments(), arg -> arg.startsWith("@"))) .containsExactly( "@java/com/google/android/hello/proguard-spec.pro", @@ -4018,7 +4024,7 @@ SpawnAction action = (SpawnAction) actionsTestUtil().getActionForArtifactEndingWith( getFilesToBuild(getConfiguredTarget("//java/com/google/android/hello:b")), "_proguard.jar"); - assertThat(ActionsTestUtil.prettyArtifactNames(action.getInputs())).containsNoDuplicates(); + assertThat(prettyArtifactNames(action.getInputs())).containsNoDuplicates(); return action; } @@ -4044,11 +4050,12 @@ assertProguardGenerated(getConfiguredTarget("//java/com/google/android/hello:b")); SpawnAction action = (SpawnAction) actionsTestUtil().getActionForArtifactEndingWith( getFilesToBuild(getConfiguredTarget("//java/com/google/android/hello:b")), "_proguard.jar"); - assertThat(prettyArtifactNames(action.getInputs())).contains( - "java/com/google/android/hello/proguard-spec.pro"); - assertThat(prettyArtifactNames(action.getInputs())).contains( - "java/com/google/android/hello/validated_proguard/l2/java/com/google/android/hello/library_spec.cfg_valid"); - assertThat(ActionsTestUtil.prettyArtifactNames(action.getInputs())).containsNoDuplicates(); + assertThat(prettyArtifactNames(action.getInputs())) + .contains("java/com/google/android/hello/proguard-spec.pro"); + assertThat(prettyArtifactNames(action.getInputs())) + .contains( + "java/com/google/android/hello/validated_proguard/l2/java/com/google/android/hello/library_spec.cfg_valid"); + assertThat(prettyArtifactNames(action.getInputs())).containsNoDuplicates(); } @Test @@ -4068,7 +4075,7 @@ assertProguardGenerated(binary); assertWithMessage("Generate proguard action does not contain expected input.") - .that(ActionsTestUtil.prettyArtifactNames(action.getInputs())) + .that(prettyArtifactNames(action.getInputs())) .contains("java/com/google/android/hello/res/values/strings.xml"); } @@ -4125,8 +4132,7 @@ ConfiguredTarget postprocess = getConfiguredTarget("//java/com/google/android:postprocess"); assertThat(postprocess).isNotNull(); assertThat( - ActionsTestUtil.prettyArtifactNames( - postprocess.getProvider(FilesToRunProvider.class).getFilesToRun())) + prettyArtifactNames(postprocess.getProvider(FilesToRunProvider.class).getFilesToRun())) .containsExactly("java/com/google/android/b1.apk"); } @@ -4153,9 +4159,7 @@ " attrs={'dep': attr.label(providers=[AndroidInstrumentationInfo])})"); ConfiguredTarget instr = getConfiguredTarget("//java/com/google/android/instr"); assertThat(instr).isNotNull(); - assertThat( - ActionsTestUtil.prettyArtifactNames( - instr.getProvider(FilesToRunProvider.class).getFilesToRun())) + assertThat(prettyArtifactNames(instr.getProvider(FilesToRunProvider.class).getFilesToRun())) .containsExactly( "java/com/google/android/instr/b1.apk", "java/com/google/android/instr/b2.apk"); }
diff --git a/src/test/java/com/google/devtools/build/lib/rules/android/AndroidBuildViewTestCase.java b/src/test/java/com/google/devtools/build/lib/rules/android/AndroidBuildViewTestCase.java index 7a424bf..41da328 100644 --- a/src/test/java/com/google/devtools/build/lib/rules/android/AndroidBuildViewTestCase.java +++ b/src/test/java/com/google/devtools/build/lib/rules/android/AndroidBuildViewTestCase.java
@@ -37,6 +37,7 @@ import com.google.devtools.build.lib.cmdline.Label; import com.google.devtools.build.lib.rules.android.deployinfo.AndroidDeployInfoOuterClass.AndroidDeployInfo; import com.google.devtools.build.lib.rules.java.JavaCompileAction; +import com.google.devtools.build.lib.rules.java.JavaCompileActionTestHelper; import com.google.devtools.build.lib.rules.java.JavaInfo; import com.google.devtools.build.lib.rules.java.JavaRuleOutputJarsProvider; import com.google.devtools.build.lib.skyframe.ConfiguredTargetAndData; @@ -215,11 +216,15 @@ return null; } + protected List<String> getProcessorNames(JavaCompileAction compileAction) throws Exception { + return JavaCompileActionTestHelper.getProcessorNames(compileAction); + } + protected List<String> getProcessorNames(String outputTarget) throws Exception { OutputFileConfiguredTarget out = (OutputFileConfiguredTarget) getFileConfiguredTarget(outputTarget); JavaCompileAction compileAction = (JavaCompileAction) getGeneratingAction(out.getArtifact()); - return compileAction.getProcessorNames(); + return getProcessorNames(compileAction); } // Returns an artifact that will be generated when a rule has resources.
diff --git a/src/test/java/com/google/devtools/build/lib/rules/android/AndroidDataBindingTest.java b/src/test/java/com/google/devtools/build/lib/rules/android/AndroidDataBindingTest.java index 9892da3..eab62c7 100644 --- a/src/test/java/com/google/devtools/build/lib/rules/android/AndroidDataBindingTest.java +++ b/src/test/java/com/google/devtools/build/lib/rules/android/AndroidDataBindingTest.java
@@ -15,6 +15,7 @@ import static com.google.common.truth.Truth.assertThat; import static com.google.devtools.build.lib.actions.util.ActionsTestUtil.getFirstArtifactEndingWith; +import static com.google.devtools.build.lib.actions.util.ActionsTestUtil.prettyArtifactNames; import com.google.common.collect.ImmutableList; import com.google.common.collect.Iterables; @@ -127,9 +128,9 @@ (JavaCompileAction) getGeneratingAction( getFirstArtifactEndingWith(allArtifacts, "lib_with_data_binding.jar")); - assertThat(libCompileAction.getProcessorNames()) + assertThat(getProcessorNames(libCompileAction)) .contains("android.databinding.annotationprocessor.ProcessDataBinding"); - assertThat(ActionsTestUtil.prettyArtifactNames(libCompileAction.getInputs())) + assertThat(prettyArtifactNames(libCompileAction.getInputs())) .containsAllOf( "java/android/library/databinding/lib_with_data_binding/layout-info.zip", "java/android/library/databinding/lib_with_data_binding/DataBindingInfo.java"); @@ -137,9 +138,9 @@ JavaCompileAction binCompileAction = (JavaCompileAction) getGeneratingAction(getFirstArtifactEndingWith(allArtifacts, "app.jar")); - assertThat(binCompileAction.getProcessorNames()) + assertThat(getProcessorNames(binCompileAction)) .contains("android.databinding.annotationprocessor.ProcessDataBinding"); - assertThat(ActionsTestUtil.prettyArtifactNames(binCompileAction.getInputs())) + assertThat(prettyArtifactNames(binCompileAction.getInputs())) .containsAllOf( "java/android/binary/databinding/app/layout-info.zip", "java/android/binary/databinding/app/DataBindingInfo.java"); @@ -236,7 +237,7 @@ JavaCompileAction binCompileAction = (JavaCompileAction) getGeneratingAction(getFirstArtifactEndingWith(allArtifacts, "app.jar")); - List<String> appJarInputs = ActionsTestUtil.prettyArtifactNames(binCompileAction.getInputs()); + List<String> appJarInputs = prettyArtifactNames(binCompileAction.getInputs()); String libWithResourcesMetadataBaseDir = "java/android/binary/databinding/app/" + "dependent-lib-artifacts/java/android/lib_with_resource_files/databinding/" @@ -275,7 +276,7 @@ .containsAllOf( "--processors", "android.databinding.annotationprocessor.ProcessDataBinding"); // The dummy .java file with annotations that trigger the annotation process is present: - assertThat(ActionsTestUtil.prettyArtifactNames(libCompileAction.getInputs())) + assertThat(prettyArtifactNames(libCompileAction.getInputs())) .contains( "java/android/lib_no_resource_files/databinding/lib_no_resource_files/" + "DataBindingInfo.java");
diff --git a/src/test/java/com/google/devtools/build/lib/rules/android/AndroidLibraryTest.java b/src/test/java/com/google/devtools/build/lib/rules/android/AndroidLibraryTest.java index 7d4fe45..b2e85b5 100644 --- a/src/test/java/com/google/devtools/build/lib/rules/android/AndroidLibraryTest.java +++ b/src/test/java/com/google/devtools/build/lib/rules/android/AndroidLibraryTest.java
@@ -17,6 +17,13 @@ import static com.google.common.collect.Iterables.getOnlyElement; import static com.google.common.truth.Truth.assertThat; import static com.google.common.truth.Truth.assertWithMessage; +import static com.google.devtools.build.lib.actions.util.ActionsTestUtil.prettyArtifactNames; +import static com.google.devtools.build.lib.rules.java.JavaCompileActionTestHelper.getClasspath; +import static com.google.devtools.build.lib.rules.java.JavaCompileActionTestHelper.getCompileTimeDependencyArtifacts; +import static com.google.devtools.build.lib.rules.java.JavaCompileActionTestHelper.getDirectJars; +import static com.google.devtools.build.lib.rules.java.JavaCompileActionTestHelper.getJavacArguments; +import static com.google.devtools.build.lib.rules.java.JavaCompileActionTestHelper.getProcessorpath; +import static com.google.devtools.build.lib.rules.java.JavaCompileActionTestHelper.getStrictJavaDepsMode; import com.google.common.base.Function; import com.google.common.base.Joiner; @@ -174,7 +181,7 @@ JavaCompileAction javacAction = (JavaCompileAction) getGeneratingActionForLabel("//java/android:liba.jar"); - String commandLine = Iterables.toString(javacAction.buildCommandLine()); + String commandLine = Iterables.toString(getJavacArguments(javacAction)); assertThat(commandLine).contains("--target_label, //java/android:a"); } @@ -185,7 +192,7 @@ "android_library(name = 'b', srcs = ['B.java'])"); Artifact artifact = getFileConfiguredTarget("//java/android/strict:libb.jar").getArtifact(); JavaCompileAction compileAction = (JavaCompileAction) getGeneratingAction(artifact); - assertThat(compileAction.getStrictJavaDepsMode()).isEqualTo(StrictDepsMode.OFF); + assertThat(getStrictJavaDepsMode(compileAction)).isEqualTo(StrictDepsMode.OFF); } @Test @@ -194,7 +201,7 @@ "android_library(name = 'b', srcs = ['B.java'])"); Artifact artifact = getFileConfiguredTarget("//java/android/strict:libb.jar").getArtifact(); JavaCompileAction compileAction = (JavaCompileAction) getGeneratingAction(artifact); - assertThat(compileAction.getStrictJavaDepsMode()).isEqualTo(StrictDepsMode.ERROR); + assertThat(getStrictJavaDepsMode(compileAction)).isEqualTo(StrictDepsMode.ERROR); } @Test @@ -204,7 +211,7 @@ "android_library(name = 'b', srcs = ['B.java'])"); Artifact artifact = getFileConfiguredTarget("//java/android/strict:libb.jar").getArtifact(); JavaCompileAction compileAction = (JavaCompileAction) getGeneratingAction(artifact); - assertThat(compileAction.getStrictJavaDepsMode()).isEqualTo(StrictDepsMode.WARN); + assertThat(getStrictJavaDepsMode(compileAction)).isEqualTo(StrictDepsMode.WARN); } @Test @@ -245,11 +252,13 @@ JavaCompileAction javacAction = (JavaCompileAction) getGeneratingAction(output.getArtifact()); - assertThat(javacAction.getProcessorNames()).contains("com.google.process.stuff"); - assertThat(javacAction.getProcessorNames()).hasSize(1); + assertThat(getProcessorNames(javacAction)).contains("com.google.process.stuff"); + assertThat(getProcessorNames(javacAction)).hasSize(1); - assertThat(ActionsTestUtil.baseNamesOf(javacAction.getProcessorpath())) - .isEqualTo("libplugin.jar libplugin_dep.jar"); + assertThat( + ActionsTestUtil.baseArtifactNames( + getInputs(javacAction, getProcessorpath(javacAction)))) + .containsExactly("libplugin.jar", "libplugin_dep.jar"); assertThat( actionsTestUtil() .predecessorClosureOf(getFilesToBuild(target), JavaSemantics.JAVA_SOURCE)) @@ -275,10 +284,12 @@ (OutputFileConfiguredTarget) getFileConfiguredTarget("//java/test:libto_be_processed.jar"); JavaCompileAction javacAction = (JavaCompileAction) getGeneratingAction(output.getArtifact()); - assertThat(javacAction.getProcessorNames()).contains("com.google.process.stuff"); - assertThat(javacAction.getProcessorNames()).hasSize(1); - assertThat(ActionsTestUtil.baseNamesOf(javacAction.getProcessorpath())) - .isEqualTo("libplugin.jar libplugin_dep.jar"); + assertThat(getProcessorNames(javacAction)).contains("com.google.process.stuff"); + assertThat(getProcessorNames(javacAction)).hasSize(1); + assertThat( + ActionsTestUtil.baseArtifactNames( + getInputs(javacAction, getProcessorpath(javacAction)))) + .containsExactly("libplugin.jar", "libplugin_dep.jar"); assertThat( actionsTestUtil() .predecessorClosureOf(getFilesToBuild(target), JavaSemantics.JAVA_SOURCE)) @@ -386,12 +397,12 @@ JavaCompileAction aAction = (JavaCompileAction) getGeneratingActionForLabel( "//java/deps:liba.jar"); - List<String> aOutputs = ActionsTestUtil.prettyArtifactNames(aAction.getOutputs()); + List<String> aOutputs = prettyArtifactNames(aAction.getOutputs()); assertThat(aOutputs).doesNotContain("java/deps/liba.jdeps"); JavaCompileAction bAction = (JavaCompileAction) getGeneratingActionForLabel( "//java/deps:libb.jar"); - List<String> bOutputs = ActionsTestUtil.prettyArtifactNames(bAction.getOutputs()); + List<String> bOutputs = prettyArtifactNames(bAction.getOutputs()); assertThat(bOutputs).contains("java/deps/libb.jdeps"); assertNoEvents(); } @@ -408,7 +419,7 @@ JavaCompileAction aAction = (JavaCompileAction) getGeneratingActionForLabel( "//java/classpath:liba.jar"); List<String> deps = - ActionsTestUtil.prettyArtifactNames(aAction.getCompileTimeDependencyArtifacts()); + prettyArtifactNames(getInputs(aAction, getCompileTimeDependencyArtifacts(aAction))); assertThat(deps) .containsExactly( "java/classpath/libc-hjar.jdeps", @@ -440,7 +451,7 @@ JavaCompileAction javacAction = (JavaCompileAction) getGeneratingActionForLabel("//java/exports:libc.jar"); - assertThat(ActionsTestUtil.prettyArtifactNames(javacAction.getDirectJars())) + assertThat(prettyArtifactNames(getInputs(javacAction, getDirectJars(javacAction)))) .containsExactly("java/exports/libb-hjar.jar", "java/exports/liba-hjar.jar"); assertNoEvents(); } @@ -1319,7 +1330,7 @@ JavaCompileAction javacAction = (JavaCompileAction) getGeneratingActionForLabel("//java/android:liba.jar"); - assertThat(javacAction.buildCommandLine()).contains("-g:lines,source"); + assertThat(getJavacArguments(javacAction)).contains("-g:lines,source"); } // Regression test for b/23079127 @@ -1334,7 +1345,7 @@ JavaCompileAction javacAction = (JavaCompileAction) getGeneratingActionForLabel("//java/strict:liba.jar"); - assertThat(ActionsTestUtil.prettyArtifactNames(javacAction.getDirectJars())) + assertThat(prettyArtifactNames(getInputs(javacAction, getDirectJars(javacAction)))) .containsExactly("java/strict/libb-hjar.jar"); } @@ -1359,7 +1370,7 @@ useConfiguration("--java_header_compilation"); Action a = getGeneratingActionForLabel("//java/test:liba.jar"); - List<String> inputs = ActionsTestUtil.prettyArtifactNames(a.getInputs()); + List<String> inputs = prettyArtifactNames(a.getInputs()); assertThat(inputs).doesNotContain("java/test/libb.jdeps"); assertThat(inputs).contains("java/test/libb-hjar.jdeps"); } @@ -1620,7 +1631,7 @@ .getActionForArtifactEndingWith(transitiveArtifacts, "proguard-spec.pro_valid")) .isNull(); assertWithMessage("Proguard validate action was not spawned.") - .that(ActionsTestUtil.prettyArtifactNames(action.getInputs())) + .that(prettyArtifactNames(action.getInputs())) .contains("java/com/google/android/hello/library_spec.cfg"); } @@ -1642,7 +1653,7 @@ "library_spec.cfg_valid"); assertWithMessage("Proguard validate action was not spawned.").that(action).isNotNull(); assertWithMessage("Proguard validate action was spawned without correct input.") - .that(ActionsTestUtil.prettyArtifactNames(action.getInputs())) + .that(prettyArtifactNames(action.getInputs())) .contains("java/com/google/android/hello/library_spec.cfg"); Action transitiveAction = actionsTestUtil() @@ -1655,7 +1666,7 @@ .that(transitiveAction) .isNotNull(); assertWithMessage("Proguard validate action was spawned without correct input.") - .that(ActionsTestUtil.prettyArtifactNames(transitiveAction.getInputs())) + .that(prettyArtifactNames(transitiveAction.getInputs())) .contains("java/com/google/android/hello/library_spec.cfg"); } @@ -1728,7 +1739,7 @@ JavaCompileAction javacAction = (JavaCompileAction) getGeneratingActionForLabel("//java/android:liba.jar"); - String commandLine = Iterables.toString(javacAction.buildCommandLine()); + String commandLine = Iterables.toString(getJavacArguments(javacAction)); assertThat(commandLine).contains("-g:lines,source"); } @@ -1749,7 +1760,7 @@ SpawnAction action = (SpawnAction) actionsTestUtil().getActionForArtifactEndingWith( actionsTestUtil().artifactClosureOf(aar), "aartest.aar"); assertThat(action).isNotNull(); - assertThat(ActionsTestUtil.prettyArtifactNames(getNonToolInputs(action))) + assertThat(prettyArtifactNames(getNonToolInputs(action))) .containsAllOf( "java/android/aartest/aartest_processed_manifest/AndroidManifest.xml", "java/android/aartest/aartest_symbols/R.txt", @@ -1771,7 +1782,7 @@ SpawnAction action = (SpawnAction) actionsTestUtil().getActionForArtifactEndingWith( actionsTestUtil().artifactClosureOf(aar), "aartest.aar"); assertThat(action).isNotNull(); - assertThat(ActionsTestUtil.prettyArtifactNames(getNonToolInputs(action))) + assertThat(prettyArtifactNames(getNonToolInputs(action))) .containsAllOf( "java/android/aartest/aartest_processed_manifest/AndroidManifest.xml", "java/android/aartest/aartest_symbols/R.txt", @@ -1935,12 +1946,12 @@ (JavaCompileAction) getGeneratingAction(getFileConfiguredTarget("//java/foo:liblib.jar").getArtifact()); - assertThat(ActionsTestUtil.prettyArtifactNames(javacAction.getDirectJars())) + assertThat(prettyArtifactNames(getInputs(javacAction, getDirectJars(javacAction)))) .containsExactly( "java/foo/lib_resources.jar", "java/foo/dep_resources.jar", "java/foo/libdep-hjar.jar") .inOrder(); - assertThat(ActionsTestUtil.prettyArtifactNames(javacAction.getClasspath())) + assertThat(prettyArtifactNames(getInputs(javacAction, getClasspath(javacAction)))) .containsExactly( "java/foo/lib_resources.jar", "java/foo/dep_resources.jar", "java/foo/libdep-hjar.jar") .inOrder();
diff --git a/src/test/java/com/google/devtools/build/lib/rules/android/BUILD b/src/test/java/com/google/devtools/build/lib/rules/android/BUILD index d7c256c..2408410 100644 --- a/src/test/java/com/google/devtools/build/lib/rules/android/BUILD +++ b/src/test/java/com/google/devtools/build/lib/rules/android/BUILD
@@ -76,6 +76,7 @@ "//src/main/protobuf:android_deploy_info_java_proto", "//src/test/java/com/google/devtools/build/lib:actions_testutil", "//src/test/java/com/google/devtools/build/lib:analysis_testutil", + "//src/test/java/com/google/devtools/build/lib:java_compile_action_test_helper", "//src/test/java/com/google/devtools/build/lib:packages_testutil", "//src/test/java/com/google/devtools/build/lib:testutil", "//third_party:guava", @@ -225,6 +226,7 @@ "//src/main/java/com/google/devtools/build/lib/vfs", "//src/test/java/com/google/devtools/build/lib:actions_testutil", "//src/test/java/com/google/devtools/build/lib:analysis_testutil", + "//src/test/java/com/google/devtools/build/lib:java_compile_action_test_helper", "//third_party:guava", "//third_party:junit4", "//third_party:truth", @@ -244,6 +246,7 @@ "//src/main/protobuf:android_deploy_info_java_proto", "//src/test/java/com/google/devtools/build/lib:actions_testutil", "//src/test/java/com/google/devtools/build/lib:analysis_testutil", + "//src/test/java/com/google/devtools/build/lib:java_compile_action_test_helper", "//src/test/java/com/google/devtools/build/lib:testutil", "//third_party:guava", "//third_party:junit4", @@ -299,6 +302,7 @@ "//src/main/java/com/google/devtools/build/lib/cmdline", "//src/main/protobuf:extra_actions_base_java_proto", "//src/test/java/com/google/devtools/build/lib:actions_testutil", + "//src/test/java/com/google/devtools/build/lib:java_compile_action_test_helper", "//src/test/java/com/google/devtools/build/lib:testutil", "//third_party:guava", "//third_party:junit4",
diff --git a/src/test/java/com/google/devtools/build/lib/rules/java/JavaCompileActionTestHelper.java b/src/test/java/com/google/devtools/build/lib/rules/java/JavaCompileActionTestHelper.java new file mode 100644 index 0000000..a5f0284 --- /dev/null +++ b/src/test/java/com/google/devtools/build/lib/rules/java/JavaCompileActionTestHelper.java
@@ -0,0 +1,130 @@ +// Copyright 2018 The Bazel Authors. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package com.google.devtools.build.lib.rules.java; + +import static com.google.common.base.Preconditions.checkArgument; +import static com.google.devtools.build.lib.rules.java.JavaCompileActionTestHelper.getJavacArguments; +import static com.google.devtools.build.lib.rules.java.JavaCompileActionTestHelper.getProcessorpath; + +import com.google.devtools.build.buildjar.OptionsParser; +import com.google.devtools.build.lib.analysis.actions.SpawnAction; +import com.google.devtools.build.lib.analysis.config.BuildConfiguration.StrictDepsMode; +import java.util.List; +import java.util.Set; + +/** + * A collection of utilities for extracting the values of command-line options passed to JavaBuilder + * from a Java compilation action , for testing. + */ +public final class JavaCompileActionTestHelper { + + public static Set<String> getDirectJars(SpawnAction javac) throws Exception { + return getOptions(javac).directJars(); + } + + public static List<String> getProcessorNames(SpawnAction javac) throws Exception { + return getOptions(javac).getProcessorNames(); + } + + public static List<String> getProcessorPath(SpawnAction javac) throws Exception { + return getProcessorpath(javac); + } + + public static List<String> getProcessorpath(SpawnAction javac) throws Exception { + return getOptions(javac).getProcessorPath(); + } + + public static List<String> getJavacOpts(SpawnAction javac) throws Exception { + return getOptions(javac).getJavacOpts(); + } + + public static List<String> getSourceFiles(SpawnAction javac) throws Exception { + return getOptions(javac).getSourceFiles(); + } + + public static List<String> getSourceJars(SpawnAction javac) throws Exception { + return getOptions(javac).getSourceJars(); + } + + public static StrictDepsMode getStrictJavaDepsMode(SpawnAction javac) throws Exception { + String strictJavaDeps = getOptions(javac).getStrictJavaDeps(); + return strictJavaDeps != null ? StrictDepsMode.valueOf(strictJavaDeps) : StrictDepsMode.OFF; + } + + public static List<String> getClasspath(SpawnAction javac) throws Exception { + return getOptions(javac).getClassPath(); + } + + public static Set<String> getCompileTimeDependencyArtifacts(SpawnAction javac) throws Exception { + return getOptions(javac).getDepsArtifacts(); + } + + public static String getFixDepsTool(SpawnAction javac) throws Exception { + return getOptions(javac).getFixDepsTool(); + } + + public static List<String> getBootClassPath(SpawnAction javac) throws Exception { + return getOptions(javac).getBootClassPath(); + } + + public static List<String> getSourcePathEntries(SpawnAction javac) throws Exception { + return getOptions(javac).getSourcePath(); + } + + public static List<String> getBootclasspath(SpawnAction javac) throws Exception { + return getOptions(javac).getBootClassPath(); + } + + public static List<String> getExtdir(SpawnAction javac) throws Exception { + return getOptions(javac).getExtClassPath(); + } + + /** Returns the JavaBuilder command line, up to the main class or deploy jar. */ + public static List<String> getJavacCommand(SpawnAction action) throws Exception { + List<String> args = action.getCommandLines().allArguments(); + return args.subList(0, mainClassIndex(args)); + } + + /** Returns the JavaBuilder options. */ + public static List<String> getJavacArguments(SpawnAction action) throws Exception { + List<String> args = action.getCommandLines().allArguments(); + return args.subList(mainClassIndex(args) + 1, args.size()); + } + + // Find the index of the last argument of the JavaBuilder command, and before the first option + // that is passed to JavaBuilder. + private static int mainClassIndex(List<String> args) { + for (int idx = 0; idx < args.size(); idx++) { + String arg = args.get(idx); + if (arg.equals("-jar")) { + return idx + 1; + } + if (arg.contains("JavaBuilder") && !arg.endsWith(".jar")) { + return idx; + } + } + throw new IllegalStateException(args.toString()); + } + + private static OptionsParser getOptions(SpawnAction javac) throws Exception { + checkArgument( + javac.getMnemonic().equals("Javac"), + "expected a Javac action, was %s", + javac.getMnemonic()); + return new OptionsParser(getJavacArguments(javac)); + } + + private JavaCompileActionTestHelper() {} +}
diff --git a/src/test/java/com/google/devtools/build/lib/rules/java/proto/SkylarkJavaLiteProtoLibraryTest.java b/src/test/java/com/google/devtools/build/lib/rules/java/proto/SkylarkJavaLiteProtoLibraryTest.java index ad2cb1d..deb9a3f 100644 --- a/src/test/java/com/google/devtools/build/lib/rules/java/proto/SkylarkJavaLiteProtoLibraryTest.java +++ b/src/test/java/com/google/devtools/build/lib/rules/java/proto/SkylarkJavaLiteProtoLibraryTest.java
@@ -18,6 +18,8 @@ import static com.google.common.truth.Truth.assertThat; import static com.google.devtools.build.lib.actions.Artifact.ROOT_RELATIVE_PATH_STRING; import static com.google.devtools.build.lib.actions.util.ActionsTestUtil.prettyArtifactNames; +import static com.google.devtools.build.lib.rules.java.JavaCompileActionTestHelper.getDirectJars; +import static com.google.devtools.build.lib.rules.java.JavaCompileActionTestHelper.getJavacArguments; import com.google.common.base.Function; import com.google.common.collect.ImmutableList; @@ -208,7 +210,8 @@ getGeneratingAction( getConfiguredTarget("//java/lib:lite_pb2"), "java/lib/libproto-lite.jar"); - List<String> commandLine = ImmutableList.copyOf(javacAction.buildCommandLine()); + List<String> commandLine = + ImmutableList.copyOf((Iterable<String>) getJavacArguments(javacAction)); MoreAsserts.assertContainsSublist(commandLine, "--target_label", "//java/lib:proto"); } @@ -258,8 +261,7 @@ List<String> directJars = prettyArtifactNames( - getProvider(JavaCompilationArgsProvider.class, litepb2) - .getRuntimeJars()); + getProvider(JavaCompilationArgsProvider.class, litepb2).getRuntimeJars()); assertThat(directJars) .containsExactly("cross/libbravo-lite.jar", "protobuf/libjavalite_runtime.jar"); } @@ -319,7 +321,7 @@ Artifact jar = Iterables.getOnlyElement(runtimeJars.get("x/libproto_lib-lite.jar")); JavaCompileAction action = (JavaCompileAction) getGeneratingAction(jar); - List<String> commandLine = ImmutableList.copyOf(action.buildCommandLine()); + List<String> commandLine = ImmutableList.copyOf((Iterable<String>) getJavacArguments(action)); assertThat(commandLine).contains("-protoMarkerForTest"); } @@ -549,14 +551,14 @@ JavaCompileAction action = (JavaCompileAction) getGeneratingAction(getConfiguredTarget("//x:foo_lite_pb"), "x/libfoo-lite.jar"); - assertThat(prettyArtifactNames(action.getDirectJars())).isEmpty(); + assertThat(prettyArtifactNames(getInputs(action, getDirectJars(action)))).isEmpty(); } { JavaCompileAction action = (JavaCompileAction) getGeneratingAction(getConfiguredTarget("//x:bar_lite_pb"), "x/libbar-lite.jar"); - assertThat(prettyArtifactNames(action.getDirectJars())).isEmpty(); + assertThat(prettyArtifactNames(getInputs(action, getDirectJars(action)))).isEmpty(); } }