jvm-abi-gen: Add tests for uses of private Kotlin classes from Java

This commit is contained in:
Steven Schäfer
2021-08-18 12:40:08 +02:00
committed by Alexander Udalov
parent 8de6a5224f
commit ec4d7b2bb6
16 changed files with 156 additions and 0 deletions
@@ -5,10 +5,14 @@
package org.jetbrains.kotlin.jvm.abi
import com.intellij.openapi.util.io.FileUtil
import junit.framework.TestCase
import org.jetbrains.kotlin.cli.common.ExitCode
import org.jetbrains.kotlin.cli.jvm.K2JVMCompiler
import org.jetbrains.kotlin.codegen.CodegenTestUtil
import org.jetbrains.kotlin.codegen.forTestCompile.ForTestCompileRuntime
import org.jetbrains.kotlin.config.Services
import org.jetbrains.kotlin.test.KotlinTestUtils
import java.io.File
import kotlin.io.path.ExperimentalPathApi
import kotlin.io.path.createTempDirectory
@@ -45,6 +49,9 @@ abstract class BaseJvmAbiTest : TestCase() {
val abiDir: File
get() = if (name == null) workingDir.resolve("abi") else workingDir.resolve("$name/abi")
val javaDestinationDir: File
get() = if (name == null) workingDir.resolve("javaOut") else workingDir.resolve("$name/javaOut")
override fun toString(): String =
"compilation '$name'"
}
@@ -76,6 +83,23 @@ abstract class BaseJvmAbiTest : TestCase() {
val errorLines = listOf("Could not compile $compilation", "Exit code: $exitCode", "Errors:") + messageCollector.errors
error(errorLines.joinToString("\n"))
}
// Compile Java files into both the destination and ABI directories in order make the
// results available to run and to downstream compilations.
val javaFiles = CodegenTestUtil.findJavaSourcesInDirectory(compilation.srcDir).map(::File)
if (javaFiles.isNotEmpty()) {
compilation.javaDestinationDir.mkdirs()
val javacOptions = listOf(
"-classpath",
(abiDependencies + compilation.destinationDir).joinToString(File.pathSeparator) { it.canonicalPath }
+ File.pathSeparator + ForTestCompileRuntime.runtimeJarForTests(),
"-d",
compilation.javaDestinationDir.canonicalPath
)
KotlinTestUtils.compileJavaFiles(javaFiles, javacOptions)
FileUtil.copyDir(compilation.javaDestinationDir, compilation.destinationDir)
FileUtil.copyDir(compilation.javaDestinationDir, compilation.abiDir)
}
}
protected open val useIrBackend: Boolean
@@ -80,6 +80,26 @@ public class CompileAgainstJvmAbiTestGenerated extends AbstractCompileAgainstJvm
runTest("plugins/jvm-abi-gen/testData/compile/kt-40340/");
}
@TestMetadata("privateAnnotationsFromJavaApp")
public void testPrivateAnnotationsFromJavaApp() throws Exception {
runTest("plugins/jvm-abi-gen/testData/compile/privateAnnotationsFromJavaApp/");
}
@TestMetadata("privateAnnotationsFromJavaLib")
public void testPrivateAnnotationsFromJavaLib() throws Exception {
runTest("plugins/jvm-abi-gen/testData/compile/privateAnnotationsFromJavaLib/");
}
@TestMetadata("privateClassesFromJavaApp")
public void testPrivateClassesFromJavaApp() throws Exception {
runTest("plugins/jvm-abi-gen/testData/compile/privateClassesFromJavaApp/");
}
@TestMetadata("privateClassesFromJavaLib")
public void testPrivateClassesFromJavaLib() throws Exception {
runTest("plugins/jvm-abi-gen/testData/compile/privateClassesFromJavaLib/");
}
@TestMetadata("privateOnlyConstructors")
public void testPrivateOnlyConstructors() throws Exception {
runTest("plugins/jvm-abi-gen/testData/compile/privateOnlyConstructors/");
@@ -80,6 +80,26 @@ public class IrCompileAgainstJvmAbiTestGenerated extends AbstractIrCompileAgains
runTest("plugins/jvm-abi-gen/testData/compile/kt-40340/");
}
@TestMetadata("privateAnnotationsFromJavaApp")
public void testPrivateAnnotationsFromJavaApp() throws Exception {
runTest("plugins/jvm-abi-gen/testData/compile/privateAnnotationsFromJavaApp/");
}
@TestMetadata("privateAnnotationsFromJavaLib")
public void testPrivateAnnotationsFromJavaLib() throws Exception {
runTest("plugins/jvm-abi-gen/testData/compile/privateAnnotationsFromJavaLib/");
}
@TestMetadata("privateClassesFromJavaApp")
public void testPrivateClassesFromJavaApp() throws Exception {
runTest("plugins/jvm-abi-gen/testData/compile/privateClassesFromJavaApp/");
}
@TestMetadata("privateClassesFromJavaLib")
public void testPrivateClassesFromJavaLib() throws Exception {
runTest("plugins/jvm-abi-gen/testData/compile/privateClassesFromJavaLib/");
}
@TestMetadata("privateOnlyConstructors")
public void testPrivateOnlyConstructors() throws Exception {
runTest("plugins/jvm-abi-gen/testData/compile/privateOnlyConstructors/");
@@ -80,6 +80,26 @@ public class LegacyCompileAgainstJvmAbiTestGenerated extends AbstractLegacyCompi
runTest("plugins/jvm-abi-gen/testData/compile/kt-40340/");
}
@TestMetadata("privateAnnotationsFromJavaApp")
public void testPrivateAnnotationsFromJavaApp() throws Exception {
runTest("plugins/jvm-abi-gen/testData/compile/privateAnnotationsFromJavaApp/");
}
@TestMetadata("privateAnnotationsFromJavaLib")
public void testPrivateAnnotationsFromJavaLib() throws Exception {
runTest("plugins/jvm-abi-gen/testData/compile/privateAnnotationsFromJavaLib/");
}
@TestMetadata("privateClassesFromJavaApp")
public void testPrivateClassesFromJavaApp() throws Exception {
runTest("plugins/jvm-abi-gen/testData/compile/privateClassesFromJavaApp/");
}
@TestMetadata("privateClassesFromJavaLib")
public void testPrivateClassesFromJavaLib() throws Exception {
runTest("plugins/jvm-abi-gen/testData/compile/privateClassesFromJavaLib/");
}
@TestMetadata("privateOnlyConstructors")
public void testPrivateOnlyConstructors() throws Exception {
runTest("plugins/jvm-abi-gen/testData/compile/privateOnlyConstructors/");
@@ -0,0 +1,7 @@
package app
import lib.J
fun runAppAndReturnOk(): String {
return J.value()
}
@@ -0,0 +1,8 @@
package lib;
@A(value = "OK")
public class J {
public static String value() {
return J.class.getAnnotation(A.class).value();
}
}
@@ -0,0 +1,4 @@
package lib
@Retention(AnnotationRetention.RUNTIME)
private annotation class A(val value: String)
@@ -0,0 +1,7 @@
package app
import lib.J
fun runAppAndReturnOk(): String {
return if (J::class.java.annotations.size == 1) "OK" else "Fail"
}
@@ -0,0 +1,4 @@
package lib;
@A
public class J {}
@@ -0,0 +1,4 @@
package lib
@Retention(AnnotationRetention.RUNTIME)
private annotation class A
@@ -0,0 +1,7 @@
package app
import lib.J
fun runAppAndReturnOk(): String {
return J.result()
}
@@ -0,0 +1,7 @@
package lib;
public class J {
public static String result() {
return new A().result();
}
}
@@ -0,0 +1,5 @@
package lib
private class A {
fun result() = "OK"
}
@@ -0,0 +1,7 @@
package app
import lib.J
fun runAppAndReturnOk(): String {
return J.result()
}
@@ -0,0 +1,7 @@
package lib;
public class J {
public static String result() {
return new A().result();
}
}
@@ -0,0 +1,5 @@
package lib
private class A {
fun result() = "OK"
}