[Serialization] Migrate all tests to new test infrastructure

This commit is contained in:
Dmitriy Novozhilov
2022-08-24 17:33:39 +03:00
committed by teamcity
parent 4dd7437df1
commit a2ffba275c
47 changed files with 388 additions and 511 deletions
@@ -1,79 +0,0 @@
/*
* Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlinx.serialization
import org.jetbrains.kotlin.fir.extensions.FirExtensionRegistrarAdapter
import org.jetbrains.kotlin.test.TargetBackend
import org.jetbrains.kotlin.test.backend.BlackBoxCodegenSuppressor
import org.jetbrains.kotlin.test.backend.handlers.IrTextDumpHandler
import org.jetbrains.kotlin.test.backend.handlers.IrTreeVerifierHandler
import org.jetbrains.kotlin.test.backend.handlers.JvmBoxRunner
import org.jetbrains.kotlin.test.backend.ir.JvmIrBackendFacade
import org.jetbrains.kotlin.test.builders.TestConfigurationBuilder
import org.jetbrains.kotlin.test.builders.fir2IrStep
import org.jetbrains.kotlin.test.builders.irHandlersStep
import org.jetbrains.kotlin.test.builders.jvmArtifactsHandlersStep
import org.jetbrains.kotlin.test.directives.FirDiagnosticsDirectives
import org.jetbrains.kotlin.test.model.TestModule
import org.jetbrains.kotlin.test.runners.AbstractKotlinCompilerTest
import org.jetbrains.kotlin.test.runners.AbstractKotlinCompilerWithTargetBackendTest
import org.jetbrains.kotlin.test.runners.baseFirDiagnosticTestConfiguration
import org.jetbrains.kotlin.test.services.RuntimeClasspathProvider
import org.jetbrains.kotlinx.serialization.compiler.fir.FirSerializationExtensionRegistrar
import java.io.File
abstract class AbstractSerializationFirMembersTest: AbstractKotlinCompilerTest() {
private val librariesList = listOf(getSerializationCoreLibraryJar()!!, getSerializationLibraryJar("kotlinx.serialization.json.Json")!!)
override fun TestConfigurationBuilder.configuration() {
baseFirDiagnosticTestConfiguration()
defaultDirectives {
+FirDiagnosticsDirectives.ENABLE_PLUGIN_PHASES
+FirDiagnosticsDirectives.FIR_DUMP
}
configureForKotlinxSerialization(librariesList) {
FirExtensionRegistrarAdapter.registerExtension(FirSerializationExtensionRegistrar())
}
}
}
open class AbstractSerializationFirBlackBoxTest : AbstractKotlinCompilerWithTargetBackendTest(TargetBackend.JVM_IR) {
private val librariesList = listOf(getSerializationCoreLibraryJar()!!, getSerializationLibraryJar("kotlinx.serialization.json.Json")!!)
override fun TestConfigurationBuilder.configuration() {
baseFirDiagnosticTestConfiguration()
configureForKotlinxSerialization(librariesList) {
FirExtensionRegistrarAdapter.registerExtension(FirSerializationExtensionRegistrar())
}
useCustomRuntimeClasspathProviders({ ts ->
object : RuntimeClasspathProvider(ts) {
override fun runtimeClassPaths(module: TestModule): List<File> {
return librariesList
}
}
})
defaultDirectives {
+FirDiagnosticsDirectives.ENABLE_PLUGIN_PHASES
}
fir2IrStep()
irHandlersStep {
useHandlers(
::IrTextDumpHandler,
::IrTreeVerifierHandler,
)
}
facadeStep(::JvmIrBackendFacade)
jvmArtifactsHandlersStep {
useHandlers(::JvmBoxRunner)
}
useAfterAnalysisCheckers(::BlackBoxCodegenSuppressor)
}
}
@@ -1,21 +0,0 @@
/*
* Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlinx.serialization
import org.jetbrains.kotlin.test.builders.TestConfigurationBuilder
import org.jetbrains.kotlin.test.runners.codegen.AbstractIrBlackBoxCodegenTest
open class AbstractSerializationIrBoxTest : AbstractIrBlackBoxCodegenTest() {
private val coreLibraryPath = getSerializationCoreLibraryJar()
private val jsonLibraryPath = getSerializationLibraryJar("kotlinx.serialization.json.Json")
override fun configure(builder: TestConfigurationBuilder) {
super.configure(builder)
val librariesPaths = listOf(coreLibraryPath!!, jsonLibraryPath!!)
builder.configureForKotlinxSerialization(librariesPaths)
}
}
@@ -1,33 +0,0 @@
/*
* Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlinx.serialization
import org.jetbrains.kotlin.ObsoleteTestInfrastructure
import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment
import org.jetbrains.kotlin.cli.jvm.config.JvmClasspathRoot
import org.jetbrains.kotlin.codegen.AbstractAsmLikeInstructionListingTest
import org.jetbrains.kotlin.compiler.plugin.registerExtensionsForTest
import org.jetbrains.kotlin.test.TargetBackend
import org.jetbrains.kotlinx.serialization.compiler.extensions.SerializationComponentRegistrar
import java.io.File
@OptIn(ObsoleteTestInfrastructure::class)
abstract class AbstractSerializationIrBytecodeListingTest : AbstractAsmLikeInstructionListingTest() {
private val coreLibraryPath = getSerializationCoreLibraryJar()
override fun getExpectedTextFileName(wholeFile: File): String {
return wholeFile.nameWithoutExtension + ".ir.txt"
}
override val backend = TargetBackend.JVM_IR
override fun setupEnvironment(environment: KotlinCoreEnvironment) {
registerExtensionsForTest(environment.project, environment.configuration) {
SerializationComponentRegistrar.registerExtensions(this)
}
environment.updateClasspath(listOf(JvmClasspathRoot(coreLibraryPath!!)))
}
}
@@ -1,25 +0,0 @@
/*
* Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlinx.serialization
import org.jetbrains.kotlin.ObsoleteTestInfrastructure
import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment
import org.jetbrains.kotlin.cli.jvm.config.JvmClasspathRoot
import org.jetbrains.kotlin.codegen.AbstractAsmLikeInstructionListingTest
import org.jetbrains.kotlin.compiler.plugin.registerExtensionsForTest
import org.jetbrains.kotlinx.serialization.compiler.extensions.SerializationComponentRegistrar
@OptIn(ObsoleteTestInfrastructure::class)
abstract class AbstractSerializationPluginBytecodeListingTest : AbstractAsmLikeInstructionListingTest() {
private val coreLibraryPath = getSerializationCoreLibraryJar()
override fun setupEnvironment(environment: KotlinCoreEnvironment) {
registerExtensionsForTest(environment.project, environment.configuration) {
SerializationComponentRegistrar.registerExtensions(this)
}
environment.updateClasspath(listOf(JvmClasspathRoot(coreLibraryPath!!)))
}
}
@@ -1,25 +0,0 @@
/*
* Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlinx.serialization
import org.jetbrains.kotlin.ObsoleteTestInfrastructure
import org.jetbrains.kotlin.checkers.AbstractDiagnosticsTest
import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment
import org.jetbrains.kotlin.cli.jvm.config.JvmClasspathRoot
import org.jetbrains.kotlin.compiler.plugin.registerExtensionsForTest
import org.jetbrains.kotlinx.serialization.compiler.extensions.SerializationComponentRegistrar
@OptIn(ObsoleteTestInfrastructure::class)
abstract class AbstractSerializationPluginDiagnosticTest : AbstractDiagnosticsTest() {
private val coreLibraryPath = getSerializationCoreLibraryJar()
override fun setupEnvironment(environment: KotlinCoreEnvironment) {
registerExtensionsForTest(environment.project, environment.configuration) {
SerializationComponentRegistrar.registerExtensions(this)
}
environment.updateClasspath(listOf(JvmClasspathRoot(coreLibraryPath!!)))
}
}
@@ -1,17 +0,0 @@
/*
* Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlinx.serialization
import org.jetbrains.kotlin.test.builders.TestConfigurationBuilder
import org.jetbrains.kotlin.test.runners.codegen.AbstractIrBlackBoxCodegenTest
open class AbstractSerializationWithoutRuntimeIrBoxTest : AbstractIrBlackBoxCodegenTest() {
override fun configure(builder: TestConfigurationBuilder) {
super.configure(builder)
builder.configureForKotlinxSerialization(emptyList())
}
}
@@ -5,29 +5,30 @@
package org.jetbrains.kotlinx.serialization
import junit.framework.TestCase
import org.jetbrains.kotlin.cli.jvm.config.addJvmClasspathRoots
import org.jetbrains.kotlin.compiler.plugin.CompilerPluginRegistrar.ExtensionStorage
import org.jetbrains.kotlin.config.CompilerConfiguration
import org.jetbrains.kotlin.test.builders.TestConfigurationBuilder
import org.jetbrains.kotlin.test.model.TestModule
import org.jetbrains.kotlin.test.services.EnvironmentConfigurator
import org.jetbrains.kotlin.test.services.RuntimeClasspathProvider
import org.jetbrains.kotlin.utils.PathUtil
import org.jetbrains.kotlinx.serialization.compiler.diagnostic.VersionReader
import org.jetbrains.kotlinx.serialization.compiler.extensions.SerializationComponentRegistrar
import org.junit.Test
import org.junit.jupiter.api.Assertions.assertNotNull
import org.junit.jupiter.api.Assertions.assertTrue
import org.junit.jupiter.api.Test
import java.io.File
import kotlin.test.assertTrue
class RuntimeLibraryInClasspathTest {
private val coreLibraryPath = getSerializationCoreLibraryJar()
companion object {
val coreLibraryPath = getSerializationLibraryJar("kotlinx.serialization.KSerializer")
val jsonLibraryPath = getSerializationLibraryJar("kotlinx.serialization.json.Json")
private fun getSerializationLibraryJar(classToDetect: String): File? = try {
PathUtil.getResourcePathForClass(Class.forName(classToDetect))
} catch (e: ClassNotFoundException) {
null
}
}
@Test
fun testRuntimeLibraryExists() {
TestCase.assertNotNull(
assertNotNull(
coreLibraryPath,
"kotlinx-serialization runtime library is not found. Make sure it is present in test classpath",
coreLibraryPath
)
}
@@ -38,38 +39,3 @@ class RuntimeLibraryInClasspathTest {
assertTrue(version.implementationVersionMatchSupported(), "Runtime version too low")
}
}
internal fun getSerializationCoreLibraryJar(): File? = getSerializationLibraryJar("kotlinx.serialization.KSerializer")
internal fun getSerializationLibraryJar(classToDetect: String): File? = try {
PathUtil.getResourcePathForClass(Class.forName(classToDetect))
} catch (e: ClassNotFoundException) {
null
}
internal fun TestConfigurationBuilder.configureForKotlinxSerialization(librariesPaths: List<File>, registerAdditionalExtensions: ExtensionStorage.() -> Unit = {}) {
useConfigurators(
{ services ->
object : EnvironmentConfigurator(services) {
override fun configureCompilerConfiguration(
configuration: CompilerConfiguration,
module: TestModule
) {
configuration.addJvmClasspathRoots(librariesPaths)
}
override fun ExtensionStorage.registerCompilerExtensions(module: TestModule, configuration: CompilerConfiguration) {
SerializationComponentRegistrar.registerExtensions(this)
registerAdditionalExtensions()
}
}
})
useCustomRuntimeClasspathProviders(
{
object : RuntimeClasspathProvider(it) {
override fun runtimeClassPaths(module: TestModule): List<File> = librariesPaths
}
}
)
}
@@ -6,52 +6,47 @@
package org.jetbrains.kotlinx.serialization
import org.jetbrains.kotlin.generators.generateTestGroupSuiteWithJUnit5
import org.jetbrains.kotlin.generators.impl.generateTestGroupSuite
import org.jetbrains.kotlinx.serialization.runners.*
fun main(args: Array<String>) {
System.setProperty("java.awt.headless", "true")
generateTestGroupSuite {
testGroup(
"plugins/kotlinx-serialization/tests-gen",
"plugins/kotlinx-serialization/testData"
) {
testClass<AbstractSerializationPluginDiagnosticTest> {
model("diagnostics")
}
testClass<AbstractSerializationPluginBytecodeListingTest> {
model("codegen")
}
testClass<AbstractSerializationIrBytecodeListingTest> {
model("codegen")
}
}
}
val excludedFirTestdataPattern = "^(.+)\\.fir\\.kts?\$"
generateTestGroupSuiteWithJUnit5(args) {
testGroup(
"plugins/kotlinx-serialization/tests-gen",
"plugins/kotlinx-serialization/testData"
) {
// ------------------------------- diagnostics -------------------------------
testClass<AbstractSerializationPluginDiagnosticTest>() {
model("diagnostics", excludedPattern = excludedFirTestdataPattern)
}
// ------------------------------- asm instructions -------------------------------
testClass<AbstractSerializationAsmLikeInstructionsListingTest> {
model("codegen")
}
testClass<AbstractSerializationIrAsmLikeInstructionsListingTest> {
model("codegen")
}
// ------------------------------- box -------------------------------
// New test infrastructure ONLY
testClass<AbstractSerializationIrBoxTest> {
model("boxIr")
}
testClass<AbstractSerializationFirBlackBoxTest> {
model("boxIr")
model("firMembers")
}
testClass<AbstractSerializationWithoutRuntimeIrBoxTest> {
model("boxWithoutRuntime")
}
testClass<AbstractSerializationFirMembersTest> {
model("firMembers")
}
testClass<AbstractSerializationFirBlackBoxTest> {
model("firMembers")
}
}
}
}
@@ -0,0 +1,34 @@
/*
* Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlinx.serialization.runners
import org.jetbrains.kotlin.test.builders.TestConfigurationBuilder
import org.jetbrains.kotlin.test.directives.AsmLikeInstructionListingDirectives
import org.jetbrains.kotlin.test.runners.codegen.AbstractAsmLikeInstructionListingTest
import org.jetbrains.kotlin.test.runners.codegen.AbstractIrAsmLikeInstructionListingTest
import org.jetbrains.kotlinx.serialization.configureForKotlinxSerialization
open class AbstractSerializationAsmLikeInstructionsListingTest : AbstractAsmLikeInstructionListingTest() {
override fun configure(builder: TestConfigurationBuilder) {
super.configure(builder)
builder.enableDifference()
builder.configureForKotlinxSerialization()
}
}
open class AbstractSerializationIrAsmLikeInstructionsListingTest : AbstractIrAsmLikeInstructionListingTest() {
override fun configure(builder: TestConfigurationBuilder) {
super.configure(builder)
builder.enableDifference()
builder.configureForKotlinxSerialization()
}
}
private fun TestConfigurationBuilder.enableDifference() {
defaultDirectives {
+AsmLikeInstructionListingDirectives.IR_DIFFERENCE
}
}
@@ -0,0 +1,33 @@
/*
* Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlinx.serialization.runners
import org.jetbrains.kotlin.test.builders.TestConfigurationBuilder
import org.jetbrains.kotlin.test.directives.FirDiagnosticsDirectives.FIR_DUMP
import org.jetbrains.kotlin.test.runners.codegen.AbstractFirBlackBoxCodegenTest
import org.jetbrains.kotlin.test.runners.codegen.AbstractIrBlackBoxCodegenTest
import org.jetbrains.kotlinx.serialization.configureForKotlinxSerialization
open class AbstractSerializationIrBoxTest : AbstractIrBlackBoxCodegenTest() {
override fun configure(builder: TestConfigurationBuilder) {
super.configure(builder)
builder.configureForKotlinxSerialization()
}
}
open class AbstractSerializationWithoutRuntimeIrBoxTest : AbstractIrBlackBoxCodegenTest() {
override fun configure(builder: TestConfigurationBuilder) {
super.configure(builder)
builder.configureForKotlinxSerialization(noLibraries = true)
}
}
open class AbstractSerializationFirBlackBoxTest : AbstractFirBlackBoxCodegenTest() {
override fun configure(builder: TestConfigurationBuilder) {
super.configure(builder)
builder.configureForKotlinxSerialization()
}
}
@@ -0,0 +1,17 @@
/*
* Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlinx.serialization.runners
import org.jetbrains.kotlin.test.builders.TestConfigurationBuilder
import org.jetbrains.kotlin.test.runners.AbstractDiagnosticTest
import org.jetbrains.kotlinx.serialization.configureForKotlinxSerialization
abstract class AbstractSerializationPluginDiagnosticTest : AbstractDiagnosticTest() {
override fun configure(builder: TestConfigurationBuilder) {
super.configure(builder)
builder.configureForKotlinxSerialization()
}
}
@@ -0,0 +1,53 @@
/*
* Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlinx.serialization
import org.jetbrains.kotlin.cli.jvm.config.addJvmClasspathRoots
import org.jetbrains.kotlin.compiler.plugin.CompilerPluginRegistrar
import org.jetbrains.kotlin.config.CompilerConfiguration
import org.jetbrains.kotlin.fir.extensions.FirExtensionRegistrarAdapter
import org.jetbrains.kotlin.test.bind
import org.jetbrains.kotlin.test.builders.TestConfigurationBuilder
import org.jetbrains.kotlin.test.model.TestModule
import org.jetbrains.kotlin.test.services.EnvironmentConfigurator
import org.jetbrains.kotlin.test.services.RuntimeClasspathProvider
import org.jetbrains.kotlin.test.services.TestServices
import org.jetbrains.kotlinx.serialization.compiler.extensions.SerializationComponentRegistrar
import org.jetbrains.kotlinx.serialization.compiler.fir.FirSerializationExtensionRegistrar
import java.io.File
private val librariesPaths = listOfNotNull(RuntimeLibraryInClasspathTest.coreLibraryPath, RuntimeLibraryInClasspathTest.jsonLibraryPath)
class SerializationEnvironmentConfigurator(
testServices: TestServices,
private val noLibraries: Boolean
) : EnvironmentConfigurator(testServices) {
override fun configureCompilerConfiguration(configuration: CompilerConfiguration, module: TestModule) {
if (noLibraries) return
configuration.addJvmClasspathRoots(librariesPaths)
}
override fun CompilerPluginRegistrar.ExtensionStorage.registerCompilerExtensions(
module: TestModule,
configuration: CompilerConfiguration
) {
SerializationComponentRegistrar.registerExtensions(this)
FirExtensionRegistrarAdapter.registerExtension(FirSerializationExtensionRegistrar())
}
}
class SerializationRuntimeClasspathProvider(testServices: TestServices) : RuntimeClasspathProvider(testServices) {
override fun runtimeClassPaths(module: TestModule): List<File> {
return librariesPaths
}
}
fun TestConfigurationBuilder.configureForKotlinxSerialization(noLibraries: Boolean = false) {
useConfigurators(::SerializationEnvironmentConfigurator.bind(noLibraries))
if (!noLibraries) {
useCustomRuntimeClasspathProviders(::SerializationRuntimeClasspathProvider)
}
}