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();
     }
   }