aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJiaxiang Chen <jiaxiang@google.com>2022-09-01 09:42:30 -0700
committerJiaxiang Chen <roaringacw@gmail.com>2022-11-01 00:32:35 -0700
commit26745cc592aedaafc4feb24c6977f6d397a4ffb3 (patch)
treebab1bb490d5034476a9c9f6ef5ff0485816366fe
parent5d18ed32e8caf3ecd9952071aa99fa9ebe00825e (diff)
downloadksp-26745cc592aedaafc4feb24c6977f6d397a4ffb3.tar.gz
AA: support multiple module test for AA.
old test framework implementation has MockApplication created multiple times, causing issues with AA stand alone mode initialization. using a cli compiler from another class loader to avoid this issue.
-rw-r--r--kotlin-analysis-api/src/test/kotlin/com/google/devtools/ksp/impl/test/AbstractKSPAATest.kt49
-rw-r--r--test-utils/src/main/kotlin/com/google/devtools/ksp/testutils/AbstractKSPTest.kt2
2 files changed, 50 insertions, 1 deletions
diff --git a/kotlin-analysis-api/src/test/kotlin/com/google/devtools/ksp/impl/test/AbstractKSPAATest.kt b/kotlin-analysis-api/src/test/kotlin/com/google/devtools/ksp/impl/test/AbstractKSPAATest.kt
index e2d622ce..7a98d817 100644
--- a/kotlin-analysis-api/src/test/kotlin/com/google/devtools/ksp/impl/test/AbstractKSPAATest.kt
+++ b/kotlin-analysis-api/src/test/kotlin/com/google/devtools/ksp/impl/test/AbstractKSPAATest.kt
@@ -25,15 +25,24 @@ import com.google.devtools.ksp.testutils.AbstractKSPTest
import org.jetbrains.kotlin.analysis.api.standalone.buildStandaloneAnalysisAPISession
import org.jetbrains.kotlin.cli.common.config.addKotlinSourceRoot
import org.jetbrains.kotlin.cli.common.config.addKotlinSourceRoots
+import org.jetbrains.kotlin.cli.jvm.K2JVMCompiler
import org.jetbrains.kotlin.cli.jvm.config.addJavaSourceRoot
import org.jetbrains.kotlin.config.CommonConfigurationKeys
+import org.jetbrains.kotlin.test.compileJavaFiles
+import org.jetbrains.kotlin.test.kotlinPathsForDistDirectoryForTests
import org.jetbrains.kotlin.test.model.FrontendKinds
import org.jetbrains.kotlin.test.model.TestModule
+import org.jetbrains.kotlin.test.services.JUnit5Assertions
import org.jetbrains.kotlin.test.services.TestServices
import org.jetbrains.kotlin.test.services.compilerConfigurationProvider
import org.jetbrains.kotlin.test.services.isKtFile
import org.jetbrains.kotlin.test.services.javaFiles
+import org.jetbrains.kotlin.test.util.KtTestUtil
+import org.jetbrains.kotlin.utils.PathUtil
+import java.io.ByteArrayOutputStream
import java.io.File
+import java.io.PrintStream
+import java.net.URLClassLoader
import java.nio.file.Files
abstract class AbstractKSPAATest : AbstractKSPTest(FrontendKinds.FIR) {
@@ -50,6 +59,46 @@ abstract class AbstractKSPAATest : AbstractKSPTest(FrontendKinds.FIR) {
}
}
+ private fun compileKotlin(sourcesPath: String, outDir: File) {
+ val classpath = mutableListOf<String>()
+ if (File(sourcesPath).isDirectory) {
+ classpath += sourcesPath
+ }
+ classpath += PathUtil.kotlinPathsForDistDirectoryForTests.stdlibPath.path
+
+ val args = mutableListOf(
+ sourcesPath,
+ "-d", outDir.absolutePath,
+ "-no-stdlib",
+ "-classpath", classpath.joinToString(File.pathSeparator)
+ )
+ runJvmCompiler(args)
+ }
+
+ private fun runJvmCompiler(args: List<String>) {
+ val outStream = ByteArrayOutputStream()
+ val compilerClass = URLClassLoader(arrayOf(), javaClass.classLoader).loadClass(K2JVMCompiler::class.java.name)
+ val compiler = compilerClass.newInstance()
+ val execMethod = compilerClass.getMethod("exec", PrintStream::class.java, Array<String>::class.java)
+ execMethod.invoke(compiler, PrintStream(outStream), args.toTypedArray())
+ }
+
+ override fun compileModule(module: TestModule, testServices: TestServices) {
+ module.writeKtFiles()
+ val javaFiles = module.writeJavaFiles()
+ compileKotlin(module.kotlinSrc.path, module.outDir)
+ val dependencies = module.allDependencies.map { outDirForModule(it.moduleName) }
+ val classpath = (dependencies + KtTestUtil.getAnnotationsJar() + module.outDir)
+ .joinToString(File.pathSeparator) { it.absolutePath }
+ val options = listOf(
+ "-classpath", classpath,
+ "-d", module.outDir.path
+ )
+ if (javaFiles.isNotEmpty()) {
+ compileJavaFiles(javaFiles, options, assertions = JUnit5Assertions)
+ }
+ }
+
override fun runTest(
testServices: TestServices,
mainModule: TestModule,
diff --git a/test-utils/src/main/kotlin/com/google/devtools/ksp/testutils/AbstractKSPTest.kt b/test-utils/src/main/kotlin/com/google/devtools/ksp/testutils/AbstractKSPTest.kt
index 1c455f74..b2d89bfb 100644
--- a/test-utils/src/main/kotlin/com/google/devtools/ksp/testutils/AbstractKSPTest.kt
+++ b/test-utils/src/main/kotlin/com/google/devtools/ksp/testutils/AbstractKSPTest.kt
@@ -160,7 +160,7 @@ abstract class AbstractKSPTest(frontend: FrontendKind<*>) : DisposableTest() {
// dist/kotlinc/lib/*
//
// No, sourceFileProvider doesn't group files by module unfortunately. Let's do it by ourselves.
- fun compileModule(module: TestModule, testServices: TestServices) {
+ open fun compileModule(module: TestModule, testServices: TestServices) {
val javaFiles = module.writeJavaFiles()
val compilerConfiguration = testServices.compilerConfigurationProvider.getCompilerConfiguration(module)
val dependencies = module.allDependencies.map { outDirForModule(it.moduleName) }