From 400ad6a01ef6fbad25f3377f10115b70ce422010 Mon Sep 17 00:00:00 2001 From: Dmitriy Novozhilov Date: Thu, 7 Apr 2022 15:01:50 +0400 Subject: [PATCH] [Test] Add ability to configure access to application disposable in test configuration This is needed to unbound CompilerConfigurationProvider from ApplicationEnvironmentDisposer, which depends on classes from JUnit 5. This will allow to safely use compiler test framework with base test framework different from JUnit 5 --- .../impl/barebone/test/AbstractFrontendApiTest.kt | 2 ++ .../tests/CodegenTestsOnAndroidGenerator.kt | 1 + .../test/services/ApplicationDisposableProvider.kt | 14 ++++++++++++++ .../kotlin/test/ApplicationEnvironmentDisposer.kt | 7 +++++++ .../test/builders/TestConfigurationBuilder.kt | 6 +++--- .../kotlin/test/impl/TestConfigurationImpl.kt | 6 +++--- .../test/runners/AbstractKotlinCompilerTest.kt | 4 +++- .../test/services/CompilerConfigurationProvider.kt | 8 ++++---- 8 files changed, 37 insertions(+), 11 deletions(-) create mode 100644 compiler/test-infrastructure/tests/org/jetbrains/kotlin/test/services/ApplicationDisposableProvider.kt diff --git a/analysis/analysis-api-impl-barebone/tests/org/jetbrains/kotlin/analysis/api/impl/barebone/test/AbstractFrontendApiTest.kt b/analysis/analysis-api-impl-barebone/tests/org/jetbrains/kotlin/analysis/api/impl/barebone/test/AbstractFrontendApiTest.kt index 48620bac10c..b861b89d376 100644 --- a/analysis/analysis-api-impl-barebone/tests/org/jetbrains/kotlin/analysis/api/impl/barebone/test/AbstractFrontendApiTest.kt +++ b/analysis/analysis-api-impl-barebone/tests/org/jetbrains/kotlin/analysis/api/impl/barebone/test/AbstractFrontendApiTest.kt @@ -21,6 +21,7 @@ import org.jetbrains.kotlin.config.CompilerConfiguration import org.jetbrains.kotlin.load.kotlin.PackagePartProvider import org.jetbrains.kotlin.platform.jvm.JvmPlatforms import org.jetbrains.kotlin.psi.KtFile +import org.jetbrains.kotlin.test.ExecutionListenerBasedDisposableProvider import org.jetbrains.kotlin.test.InTextDirectivesUtils import org.jetbrains.kotlin.test.TestInfrastructureInternals import org.jetbrains.kotlin.test.builders.TestConfigurationBuilder @@ -151,6 +152,7 @@ abstract class AbstractFrontendApiTest : TestWithDisposable() { useSourcePreprocessor(::ExpressionMarkersSourceFilePreprocessor) useAdditionalService { ExpressionMarkerProvider() } useAdditionalService(::TestKtModuleProvider) + useAdditionalService { ExecutionListenerBasedDisposableProvider() } configureTest(this) startingArtifactFactory = { ResultingArtifact.Source() } diff --git a/compiler/android-tests/tests/org/jetbrains/kotlin/android/tests/CodegenTestsOnAndroidGenerator.kt b/compiler/android-tests/tests/org/jetbrains/kotlin/android/tests/CodegenTestsOnAndroidGenerator.kt index 07af5068727..31fac8f1ff3 100644 --- a/compiler/android-tests/tests/org/jetbrains/kotlin/android/tests/CodegenTestsOnAndroidGenerator.kt +++ b/compiler/android-tests/tests/org/jetbrains/kotlin/android/tests/CodegenTestsOnAndroidGenerator.kt @@ -415,6 +415,7 @@ class CodegenTestsOnAndroidGenerator private constructor(private val pathManager assertions = JUnit5Assertions useAdditionalService(::TemporaryDirectoryManagerImpl) + useAdditionalService { ExecutionListenerBasedDisposableProvider() } useSourcePreprocessor(*AbstractKotlinCompilerTest.defaultPreprocessors.toTypedArray()) useDirectives(*AbstractKotlinCompilerTest.defaultDirectiveContainers.toTypedArray()) class AndroidTransformingPreprocessor(testServices: TestServices) : SourceFilePreprocessor(testServices) { diff --git a/compiler/test-infrastructure/tests/org/jetbrains/kotlin/test/services/ApplicationDisposableProvider.kt b/compiler/test-infrastructure/tests/org/jetbrains/kotlin/test/services/ApplicationDisposableProvider.kt new file mode 100644 index 00000000000..6fe8e40dde2 --- /dev/null +++ b/compiler/test-infrastructure/tests/org/jetbrains/kotlin/test/services/ApplicationDisposableProvider.kt @@ -0,0 +1,14 @@ +/* + * 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.kotlin.test.services + +import com.intellij.openapi.Disposable + +abstract class ApplicationDisposableProvider : TestService { + abstract fun getApplicationRootDisposable(): Disposable +} + +val TestServices.applicationDisposableProvider: ApplicationDisposableProvider by TestServices.testServiceAccessor() diff --git a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/ApplicationEnvironmentDisposer.kt b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/ApplicationEnvironmentDisposer.kt index be0bbed8116..9574e4ef022 100644 --- a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/ApplicationEnvironmentDisposer.kt +++ b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/ApplicationEnvironmentDisposer.kt @@ -9,6 +9,7 @@ import com.intellij.openapi.Disposable import com.intellij.openapi.application.ApplicationManager import com.intellij.openapi.util.Disposer import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment +import org.jetbrains.kotlin.test.services.ApplicationDisposableProvider import org.junit.platform.launcher.TestExecutionListener import org.junit.platform.launcher.TestPlan import java.lang.reflect.Field @@ -26,3 +27,9 @@ class ApplicationEnvironmentDisposer : TestExecutionListener { ourApplicationField.set(null, null) } } + +class ExecutionListenerBasedDisposableProvider : ApplicationDisposableProvider() { + override fun getApplicationRootDisposable(): Disposable { + return ApplicationEnvironmentDisposer.ROOT_DISPOSABLE + } +} diff --git a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/builders/TestConfigurationBuilder.kt b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/builders/TestConfigurationBuilder.kt index e3a61d39534..23caf3ff98a 100644 --- a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/builders/TestConfigurationBuilder.kt +++ b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/builders/TestConfigurationBuilder.kt @@ -46,7 +46,7 @@ class TestConfigurationBuilder { private val configurationsByNegativeTestDataCondition: MutableList Unit>> = mutableListOf() private val additionalServices: MutableList = mutableListOf() - private var compilerConfigurationProvider: ((Disposable, List) -> CompilerConfigurationProvider)? = null + private var compilerConfigurationProvider: ((TestServices, Disposable, List) -> CompilerConfigurationProvider)? = null private var runtimeClasspathProviders: MutableList> = mutableListOf() lateinit var testInfo: KotlinTestInfo @@ -184,7 +184,7 @@ class TestConfigurationBuilder { } @TestInfrastructureInternals - fun useCustomCompilerConfigurationProvider(provider: (Disposable, List) -> CompilerConfigurationProvider) { + fun useCustomCompilerConfigurationProvider(provider: (TestServices, Disposable, List) -> CompilerConfigurationProvider) { compilerConfigurationProvider = provider } @@ -286,7 +286,7 @@ class TestConfigurationBuilder { val additionalServices: List get() = builder.additionalServices - val compilerConfigurationProvider: ((Disposable, List) -> CompilerConfigurationProvider)? + val compilerConfigurationProvider: ((TestServices, Disposable, List) -> CompilerConfigurationProvider)? get() = builder.compilerConfigurationProvider val runtimeClasspathProviders: List> get() = builder.runtimeClasspathProviders diff --git a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/impl/TestConfigurationImpl.kt b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/impl/TestConfigurationImpl.kt index 6e16b68461b..fd439a61433 100644 --- a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/impl/TestConfigurationImpl.kt +++ b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/impl/TestConfigurationImpl.kt @@ -38,7 +38,7 @@ class TestConfigurationImpl( metaTestConfigurators: List>, afterAnalysisCheckers: List>, - compilerConfigurationProvider: ((Disposable, List) -> CompilerConfigurationProvider)?, + compilerConfigurationProvider: ((TestServices, Disposable, List) -> CompilerConfigurationProvider)?, runtimeClasspathProviders: List>, override val metaInfoHandlerEnabled: Boolean, @@ -103,8 +103,8 @@ class TestConfigurationImpl( register(SourceFileProvider::class, sourceFileProvider) val environmentProvider = - compilerConfigurationProvider?.invoke(rootDisposable, this@TestConfigurationImpl.environmentConfigurators) - ?: CompilerConfigurationProviderImpl(rootDisposable, this@TestConfigurationImpl.environmentConfigurators) + compilerConfigurationProvider?.invoke(this, rootDisposable, this@TestConfigurationImpl.environmentConfigurators) + ?: CompilerConfigurationProviderImpl(this, rootDisposable, this@TestConfigurationImpl.environmentConfigurators) register(CompilerConfigurationProvider::class, environmentProvider) register(AssertionsService::class, assertions) diff --git a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/runners/AbstractKotlinCompilerTest.kt b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/runners/AbstractKotlinCompilerTest.kt index cbe42093ad2..61811830d32 100644 --- a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/runners/AbstractKotlinCompilerTest.kt +++ b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/runners/AbstractKotlinCompilerTest.kt @@ -7,6 +7,7 @@ package org.jetbrains.kotlin.test.runners import com.intellij.testFramework.TestDataFile import org.jetbrains.kotlin.test.Constructor +import org.jetbrains.kotlin.test.ExecutionListenerBasedDisposableProvider import org.jetbrains.kotlin.test.builders.TestConfigurationBuilder import org.jetbrains.kotlin.test.builders.testRunner import org.jetbrains.kotlin.test.directives.ConfigurationDirectives @@ -39,7 +40,9 @@ abstract class AbstractKotlinCompilerTest { } val defaultConfiguration: TestConfigurationBuilder.() -> Unit = { + assertions = JUnit5Assertions useAdditionalService(::TemporaryDirectoryManagerImpl) + useAdditionalService { ExecutionListenerBasedDisposableProvider() } useSourcePreprocessor(*defaultPreprocessors.toTypedArray()) useDirectives(*defaultDirectiveContainers.toTypedArray()) configureDebugFlags() @@ -48,7 +51,6 @@ abstract class AbstractKotlinCompilerTest { } protected val configuration: TestConfigurationBuilder.() -> Unit = { - assertions = JUnit5Assertions defaultConfiguration() configure(this) } diff --git a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/services/CompilerConfigurationProvider.kt b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/services/CompilerConfigurationProvider.kt index 7e094308d04..eba169f450e 100644 --- a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/services/CompilerConfigurationProvider.kt +++ b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/services/CompilerConfigurationProvider.kt @@ -26,7 +26,6 @@ import org.jetbrains.kotlin.platform.js.isJs import org.jetbrains.kotlin.platform.jvm.isJvm import org.jetbrains.kotlin.platform.konan.isNative import org.jetbrains.kotlin.psi.KtFile -import org.jetbrains.kotlin.test.ApplicationEnvironmentDisposer import org.jetbrains.kotlin.test.TestInfrastructureInternals import org.jetbrains.kotlin.test.directives.JsEnvironmentConfigurationDirectives import org.jetbrains.kotlin.test.model.FrontendKinds @@ -34,7 +33,7 @@ import org.jetbrains.kotlin.test.model.TestFile import org.jetbrains.kotlin.test.model.TestModule import java.io.File -abstract class CompilerConfigurationProvider : TestService { +abstract class CompilerConfigurationProvider(val testServices: TestServices) : TestService { abstract val testRootDisposable: Disposable protected abstract fun getKotlinCoreEnvironment(module: TestModule): KotlinCoreEnvironment @@ -65,9 +64,10 @@ abstract class CompilerConfigurationProvider : TestService { val TestServices.compilerConfigurationProvider: CompilerConfigurationProvider by TestServices.testServiceAccessor() open class CompilerConfigurationProviderImpl( + testServices: TestServices, override val testRootDisposable: Disposable, val configurators: List -) : CompilerConfigurationProvider() { +) : CompilerConfigurationProvider(testServices) { private val cache: MutableMap = mutableMapOf() override fun getKotlinCoreEnvironment(module: TestModule): KotlinCoreEnvironment { @@ -88,7 +88,7 @@ open class CompilerConfigurationProviderImpl( else -> error("Unknown platform: $platform") } val applicationEnvironment = KotlinCoreEnvironment.getOrCreateApplicationEnvironmentForTests( - ApplicationEnvironmentDisposer.ROOT_DISPOSABLE, + testServices.applicationDisposableProvider.getApplicationRootDisposable(), CompilerConfiguration() ) val initialConfiguration = createCompilerConfiguration(module)