Kapt: Launch integration tests also under Java 9
This commit is contained in:
+1
-1
@@ -65,7 +65,7 @@ abstract class AbstractKotlinKapt3IntegrationTest : CodegenTestCase() {
|
|||||||
super.tearDown()
|
super.tearDown()
|
||||||
}
|
}
|
||||||
|
|
||||||
protected fun test(
|
protected open fun test(
|
||||||
name: String,
|
name: String,
|
||||||
vararg supportedAnnotations: String,
|
vararg supportedAnnotations: String,
|
||||||
options: Map<String, String> = emptyMap(),
|
options: Map<String, String> = emptyMap(),
|
||||||
|
|||||||
+2
-44
@@ -37,7 +37,6 @@ import org.jetbrains.kotlin.kapt3.javac.KaptJavaLog
|
|||||||
import org.jetbrains.kotlin.kapt3.parseJavaFiles
|
import org.jetbrains.kotlin.kapt3.parseJavaFiles
|
||||||
import org.jetbrains.kotlin.kapt3.stubs.ClassFileToSourceStubConverter
|
import org.jetbrains.kotlin.kapt3.stubs.ClassFileToSourceStubConverter
|
||||||
import org.jetbrains.kotlin.kapt3.util.KaptLogger
|
import org.jetbrains.kotlin.kapt3.util.KaptLogger
|
||||||
import org.jetbrains.kotlin.kapt3.util.isJava9OrLater
|
|
||||||
import org.jetbrains.kotlin.resolve.jvm.extensions.AnalysisHandlerExtension
|
import org.jetbrains.kotlin.resolve.jvm.extensions.AnalysisHandlerExtension
|
||||||
import org.jetbrains.kotlin.resolve.jvm.extensions.PartialAnalysisHandlerExtension
|
import org.jetbrains.kotlin.resolve.jvm.extensions.PartialAnalysisHandlerExtension
|
||||||
import org.jetbrains.kotlin.test.ConfigurationKind
|
import org.jetbrains.kotlin.test.ConfigurationKind
|
||||||
@@ -46,11 +45,8 @@ import org.jetbrains.kotlin.test.util.trimTrailingWhitespacesAndAddNewlineAtEOF
|
|||||||
import org.jetbrains.kotlin.utils.PathUtil
|
import org.jetbrains.kotlin.utils.PathUtil
|
||||||
import org.jetbrains.kotlin.utils.addToStdlib.firstIsInstance
|
import org.jetbrains.kotlin.utils.addToStdlib.firstIsInstance
|
||||||
import java.io.File
|
import java.io.File
|
||||||
import java.net.URL
|
|
||||||
import java.net.URLClassLoader
|
|
||||||
import java.nio.file.Files
|
import java.nio.file.Files
|
||||||
import java.util.*
|
import java.util.*
|
||||||
import java.util.concurrent.TimeUnit
|
|
||||||
import com.sun.tools.javac.util.List as JavacList
|
import com.sun.tools.javac.util.List as JavacList
|
||||||
|
|
||||||
abstract class AbstractKotlinKapt3Test : CodegenTestCase() {
|
abstract class AbstractKotlinKapt3Test : CodegenTestCase() {
|
||||||
@@ -159,7 +155,7 @@ abstract class AbstractKotlinKapt3Test : CodegenTestCase() {
|
|||||||
wholeFile: File)
|
wholeFile: File)
|
||||||
}
|
}
|
||||||
|
|
||||||
open class AbstractClassFileToSourceStubConverterTest : AbstractKotlinKapt3Test() {
|
open class AbstractClassFileToSourceStubConverterTest : AbstractKotlinKapt3Test(), Java9TestLauncher {
|
||||||
companion object {
|
companion object {
|
||||||
private val KOTLIN_METADATA_GROUP = "[a-z0-9]+ = (\\{.+?\\}|[0-9]+)"
|
private val KOTLIN_METADATA_GROUP = "[a-z0-9]+ = (\\{.+?\\}|[0-9]+)"
|
||||||
private val KOTLIN_METADATA_REGEX = "@kotlin\\.Metadata\\(($KOTLIN_METADATA_GROUP)(, $KOTLIN_METADATA_GROUP)*\\)".toRegex()
|
private val KOTLIN_METADATA_REGEX = "@kotlin\\.Metadata\\(($KOTLIN_METADATA_GROUP)(, $KOTLIN_METADATA_GROUP)*\\)".toRegex()
|
||||||
@@ -184,45 +180,7 @@ open class AbstractClassFileToSourceStubConverterTest : AbstractKotlinKapt3Test(
|
|||||||
|
|
||||||
override fun doTest(filePath: String) {
|
override fun doTest(filePath: String) {
|
||||||
super.doTest(filePath)
|
super.doTest(filePath)
|
||||||
|
doTestWithJdk9(AbstractClassFileToSourceStubConverterTest::class.java, filePath)
|
||||||
if (!isJava9OrLater) {
|
|
||||||
doTestWithJdk9(filePath)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun doTestWithJdk9(filePath: String) {
|
|
||||||
val jdk9Home = KotlinTestUtils.getJdk9HomeIfPossible() ?: run {
|
|
||||||
println("JDK9 not found, the test was skipped")
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
val javaExe = File(jdk9Home, "bin/java.exe").takeIf { it.exists() } ?: File(jdk9Home, "bin/java")
|
|
||||||
assert(javaExe.exists()) { "Can't find 'java' executable in $jdk9Home" }
|
|
||||||
|
|
||||||
val currentJavaHome = System.getProperty("java.home")
|
|
||||||
val classpath = collectClasspath(AbstractClassFileToSourceStubConverterTest::class.java.classLoader)
|
|
||||||
.filter { !it.path.startsWith(currentJavaHome) }
|
|
||||||
|
|
||||||
val process = ProcessBuilder(
|
|
||||||
javaExe.absolutePath,
|
|
||||||
"--illegal-access=warn",
|
|
||||||
"-ea",
|
|
||||||
"-classpath",
|
|
||||||
classpath.joinToString(File.pathSeparator),
|
|
||||||
AbstractClassFileToSourceStubConverterTest::class.java.name,
|
|
||||||
filePath
|
|
||||||
).inheritIO().start()
|
|
||||||
|
|
||||||
process.waitFor(3, TimeUnit.MINUTES)
|
|
||||||
if (process.exitValue() != 0) {
|
|
||||||
throw AssertionError("Java 9 test process exited with exit code ${process.exitValue()} \n")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun collectClasspath(classLoader: ClassLoader?): List<URL> = when (classLoader) {
|
|
||||||
is URLClassLoader -> classLoader.urLs.asList() + collectClasspath(classLoader.parent)
|
|
||||||
is ClassLoader -> collectClasspath(classLoader.parent)
|
|
||||||
else -> emptyList()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun check(kaptContext: KaptContext<GenerationState>, javaFiles: List<File>, txtFile: File, wholeFile: File) {
|
override fun check(kaptContext: KaptContext<GenerationState>, javaFiles: List<File>, txtFile: File, wholeFile: File) {
|
||||||
|
|||||||
+30
-1
@@ -20,11 +20,28 @@ import org.jetbrains.kotlin.kapt3.javac.KaptJavaFileObject
|
|||||||
import org.jetbrains.kotlin.resolve.jvm.extensions.AnalysisHandlerExtension
|
import org.jetbrains.kotlin.resolve.jvm.extensions.AnalysisHandlerExtension
|
||||||
import org.jetbrains.kotlin.utils.addToStdlib.firstIsInstance
|
import org.jetbrains.kotlin.utils.addToStdlib.firstIsInstance
|
||||||
import org.junit.Test
|
import org.junit.Test
|
||||||
|
import org.junit.runner.JUnitCore
|
||||||
|
import org.junit.runner.Request
|
||||||
import java.io.File
|
import java.io.File
|
||||||
|
import javax.annotation.processing.ProcessingEnvironment
|
||||||
|
import javax.annotation.processing.RoundEnvironment
|
||||||
import javax.lang.model.element.ElementKind
|
import javax.lang.model.element.ElementKind
|
||||||
import javax.lang.model.element.ExecutableElement
|
import javax.lang.model.element.ExecutableElement
|
||||||
|
import javax.lang.model.element.TypeElement
|
||||||
|
|
||||||
|
class KotlinKapt3IntegrationTests : AbstractKotlinKapt3IntegrationTest(), Java9TestLauncher {
|
||||||
|
override fun test(
|
||||||
|
name: String,
|
||||||
|
vararg supportedAnnotations: String,
|
||||||
|
options: Map<String, String>,
|
||||||
|
process: (Set<TypeElement>, RoundEnvironment, ProcessingEnvironment) -> Unit
|
||||||
|
) {
|
||||||
|
super.test(name, *supportedAnnotations, options = options, process = process)
|
||||||
|
|
||||||
|
doTestWithJdk9(SingleJUnitTestRunner::class.java,
|
||||||
|
KotlinKapt3IntegrationTests::class.java.name + "#test" + getTestName(false))
|
||||||
|
}
|
||||||
|
|
||||||
class KotlinKapt3IntegrationTests : AbstractKotlinKapt3IntegrationTest() {
|
|
||||||
@Test
|
@Test
|
||||||
fun testSimple() = test("Simple", "test.MyAnnotation") { set, roundEnv, _ ->
|
fun testSimple() = test("Simple", "test.MyAnnotation") { set, roundEnv, _ ->
|
||||||
assertEquals(1, set.size)
|
assertEquals(1, set.size)
|
||||||
@@ -119,4 +136,16 @@ class KotlinKapt3IntegrationTests : AbstractKotlinKapt3IntegrationTest() {
|
|||||||
assertEquals("someLong", constructors[1].parameters[1].simpleName.toString())
|
assertEquals("someLong", constructors[1].parameters[1].simpleName.toString())
|
||||||
assertEquals("someString", constructors[1].parameters[2].simpleName.toString())
|
assertEquals("someString", constructors[1].parameters[2].simpleName.toString())
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
internal class SingleJUnitTestRunner {
|
||||||
|
companion object {
|
||||||
|
@JvmStatic
|
||||||
|
fun main(args: Array<String>) {
|
||||||
|
val (className, methodName) = args.single().split('#')
|
||||||
|
val request = Request.method(Class.forName(className), methodName)
|
||||||
|
val result = JUnitCore().run(request)
|
||||||
|
System.exit(if (result.wasSuccessful()) 0 else 1)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,65 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2017 JetBrains s.r.o.
|
||||||
|
*
|
||||||
|
* 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 org.jetbrains.kotlin.kapt3.test
|
||||||
|
|
||||||
|
import org.jetbrains.kotlin.kapt3.util.isJava9OrLater
|
||||||
|
import org.jetbrains.kotlin.test.KotlinTestUtils
|
||||||
|
import java.io.File
|
||||||
|
import java.net.URL
|
||||||
|
import java.net.URLClassLoader
|
||||||
|
import java.util.concurrent.TimeUnit
|
||||||
|
|
||||||
|
interface Java9TestLauncher {
|
||||||
|
fun doTestWithJdk9(mainClass: Class<*>, arg: String) {
|
||||||
|
// Already under Java 9
|
||||||
|
if (isJava9OrLater) return
|
||||||
|
|
||||||
|
val jdk9Home = KotlinTestUtils.getJdk9HomeIfPossible() ?: run {
|
||||||
|
println("JDK9 not found, the test was skipped")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
val javaExe = File(jdk9Home, "bin/java.exe").takeIf { it.exists() } ?: File(jdk9Home, "bin/java")
|
||||||
|
assert(javaExe.exists()) { "Can't find 'java' executable in $jdk9Home" }
|
||||||
|
|
||||||
|
val currentJavaHome = System.getProperty("java.home")
|
||||||
|
val classpath = collectClasspath(AbstractClassFileToSourceStubConverterTest::class.java.classLoader)
|
||||||
|
.filter { !it.path.startsWith(currentJavaHome) }
|
||||||
|
|
||||||
|
val process = ProcessBuilder(
|
||||||
|
javaExe.absolutePath,
|
||||||
|
"--illegal-access=warn",
|
||||||
|
"-ea",
|
||||||
|
"-classpath",
|
||||||
|
classpath.joinToString(File.pathSeparator),
|
||||||
|
mainClass.name,
|
||||||
|
arg
|
||||||
|
).inheritIO().start()
|
||||||
|
|
||||||
|
process.waitFor(3, TimeUnit.MINUTES)
|
||||||
|
if (process.exitValue() != 0) {
|
||||||
|
throw AssertionError("Java 9 test process exited with exit code ${process.exitValue()} \n")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun collectClasspath(classLoader: ClassLoader?): List<URL> = when (classLoader) {
|
||||||
|
is URLClassLoader -> classLoader.urLs.asList() + collectClasspath(classLoader.parent)
|
||||||
|
is ClassLoader -> collectClasspath(classLoader.parent)
|
||||||
|
else -> emptyList()
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user