Test mixed Kotlin and Java compilation with private classes

Exercise the real Javac action with a file-private Kotlin class removed from the ABI jar.
diff --git a/src/test/data/jvm/jvm_target/BUILD b/src/test/data/jvm/jvm_target/BUILD
index 264efb4..bdc000d 100644
--- a/src/test/data/jvm/jvm_target/BUILD
+++ b/src/test/data/jvm/jvm_target/BUILD
@@ -21,6 +21,7 @@
 # Pin java_language_version so the test is independent of the repository's global Java config.
 java_language_version_env(
     name = "mixed_jvm8_java11",
+    extra_toolchains = ["//src/test/starlark/rules:remove_private_classes_toolchain"],
     java_language_version = "11",
     target = ":mixed_jvm8",
 )
diff --git a/src/test/data/jvm/jvm_target/Mixed.kt b/src/test/data/jvm/jvm_target/Mixed.kt
index 53cc07c..1f16afb 100644
--- a/src/test/data/jvm/jvm_target/Mixed.kt
+++ b/src/test/data/jvm/jvm_target/Mixed.kt
@@ -1,5 +1,9 @@
 package mixed
 
+private class PrivateKotlinClass {
+  fun greet(): String = "hi"
+}
+
 class Mixed {
   fun greet(): String = MixedJava.greet()
 }
diff --git a/src/test/data/jvm/jvm_target/MixedJava.java b/src/test/data/jvm/jvm_target/MixedJava.java
index 4241739..90ff2db 100644
--- a/src/test/data/jvm/jvm_target/MixedJava.java
+++ b/src/test/data/jvm/jvm_target/MixedJava.java
@@ -2,6 +2,6 @@
 
 public final class MixedJava {
   public static String greet() {
-    return "hi";
+    return new PrivateKotlinClass().greet();
   }
 }
diff --git a/src/test/data/jvm/jvm_target/java_language_version.bzl b/src/test/data/jvm/jvm_target/java_language_version.bzl
index 8bfc2e0..9ced3ce 100644
--- a/src/test/data/jvm/jvm_target/java_language_version.bzl
+++ b/src/test/data/jvm/jvm_target/java_language_version.bzl
@@ -1,12 +1,18 @@
-"""Build a target with `//command_line_option:java_language_version` pinned to a fixed value."""
+"""Build a target with a pinned Java language version and optional extra toolchains."""
 
-def _pin_java_language_version_impl(_settings, attr):
-    return {"//command_line_option:java_language_version": attr.java_language_version}
+def _pin_java_language_version_impl(settings, attr):
+    return {
+        "//command_line_option:extra_toolchains": settings["//command_line_option:extra_toolchains"] + attr.extra_toolchains,
+        "//command_line_option:java_language_version": attr.java_language_version,
+    }
 
 _pin_java_language_version = transition(
     implementation = _pin_java_language_version_impl,
-    inputs = [],
-    outputs = ["//command_line_option:java_language_version"],
+    inputs = ["//command_line_option:extra_toolchains"],
+    outputs = [
+        "//command_line_option:extra_toolchains",
+        "//command_line_option:java_language_version",
+    ],
 )
 
 def _java_language_version_env_impl(ctx):
@@ -19,9 +25,10 @@
     )]
 
 java_language_version_env = rule(
-    doc = "Forwards `target`, built with --java_language_version pinned to `java_language_version`.",
+    doc = "Forwards `target`, built with a pinned Java language version and extra toolchains.",
     implementation = _java_language_version_env_impl,
     attrs = {
+        "extra_toolchains": attr.string_list(default = []),
         "java_language_version": attr.string(mandatory = True),
         "target": attr.label(mandatory = True, cfg = _pin_java_language_version),
         "_allowlist_function_transition": attr.label(
diff --git a/src/test/kotlin/io/bazel/kotlin/JavacJvmTargetAssertionTest.kt b/src/test/kotlin/io/bazel/kotlin/JavacJvmTargetAssertionTest.kt
index 1e831f6..52444ca 100644
--- a/src/test/kotlin/io/bazel/kotlin/JavacJvmTargetAssertionTest.kt
+++ b/src/test/kotlin/io/bazel/kotlin/JavacJvmTargetAssertionTest.kt
@@ -23,9 +23,10 @@
   fun javaHalfIsCompiledForTheKotlincJvmTarget() {
     jarTestCase(
       "mixed_jvm8.jar",
-      description = "In a mixed Kotlin/Java target the Java sources must compile to the same " +
-        "bytecode version as the kotlinc jvm_target",
+      description = "In a mixed Kotlin/Java target Java must compile against file-private Kotlin " +
+        "classes and use the same bytecode version as the kotlinc jvm_target",
     ) {
+      assertContainsEntries("mixed/PrivateKotlinClass.class")
       // The Java half must follow the kotlinc jvm_target (1.8 -> major 52), not the pinned default.
       assertEquals(
         52,
diff --git a/src/test/starlark/rules/BUILD.bazel b/src/test/starlark/rules/BUILD.bazel
index 1b75f6d..be364dc 100644
--- a/src/test/starlark/rules/BUILD.bazel
+++ b/src/test/starlark/rules/BUILD.bazel
@@ -17,7 +17,7 @@
     name = "associates_tests",
 )
 
-# Only used by associates_tests, which pulls it in with --extra_toolchains.
+# Only used by tests that enable private-class removal through --extra_toolchains.
 define_kt_toolchain(
     name = "remove_private_classes_toolchain",
     experimental_remove_private_classes_in_abi_jars = True,