[Serialization] Reorganize module structure

This commit is contained in:
Dmitriy Novozhilov
2022-08-22 11:49:45 +03:00
parent 0a8cefc8a5
commit cc00dcc038
150 changed files with 493 additions and 322 deletions
@@ -0,0 +1,79 @@
/*
* 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)
}
}
@@ -0,0 +1,21 @@
/*
* 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)
}
}
@@ -0,0 +1,33 @@
/*
* 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!!)))
}
}
@@ -0,0 +1,25 @@
/*
* 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!!)))
}
}
@@ -0,0 +1,25 @@
/*
* 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!!)))
}
}
@@ -0,0 +1,17 @@
/*
* 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())
}
}
@@ -0,0 +1,75 @@
/*
* Copyright 2010-2020 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 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 java.io.File
import kotlin.test.assertTrue
class RuntimeLibraryInClasspathTest {
private val coreLibraryPath = getSerializationCoreLibraryJar()
@Test
fun testRuntimeLibraryExists() {
TestCase.assertNotNull(
"kotlinx-serialization runtime library is not found. Make sure it is present in test classpath",
coreLibraryPath
)
}
@Test
fun testRuntimeHasSufficientVersion() {
val version = VersionReader.getVersionsFromManifest(coreLibraryPath!!)
assertTrue(version.currentCompilerMatchRequired(), "Runtime version too high")
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
}
}
)
}
@@ -0,0 +1,57 @@
/*
* 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.generators.generateTestGroupSuiteWithJUnit5
import org.jetbrains.kotlin.generators.impl.generateTestGroupSuite
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")
}
}
}
generateTestGroupSuiteWithJUnit5(args) {
testGroup(
"plugins/kotlinx-serialization/tests-gen",
"plugins/kotlinx-serialization/testData"
) {
// New test infrastructure ONLY
testClass<AbstractSerializationIrBoxTest> {
model("boxIr")
}
testClass<AbstractSerializationWithoutRuntimeIrBoxTest> {
model("boxWithoutRuntime")
}
testClass<AbstractSerializationFirMembersTest> {
model("firMembers")
}
testClass<AbstractSerializationFirBlackBoxTest> {
model("firMembers")
}
}
}
}