From 5382e681801766572b6cadf5135e7dbb1098fdd7 Mon Sep 17 00:00:00 2001 From: Dmitriy Novozhilov Date: Tue, 12 Jan 2021 12:16:13 +0300 Subject: [PATCH] [Test] Properly delete temporary directories after test run --- .../kotlin/test/util/KtTestUtil.java | 5 ++++ .../org/jetbrains/kotlin/test/TestRunner.kt | 6 ++++ .../test/services/SourceFileProvider.kt | 6 ++-- .../services/TemporaryDirectoryManager.kt | 19 +++++++++++++ .../test/builders/TestConfigurationBuilder.kt | 3 +- .../runners/AbstractKotlinCompilerTest.kt | 3 ++ .../JvmForeignAnnotationsConfigurator.kt | 2 +- .../impl/TemporaryDirectoryManagerImpl.kt | 28 +++++++++++++++++++ .../test/services/jvm/CompiledJarManager.kt | 8 ++---- 9 files changed, 69 insertions(+), 11 deletions(-) create mode 100644 compiler/test-infrastructure/tests/org/jetbrains/kotlin/test/services/TemporaryDirectoryManager.kt create mode 100644 compiler/tests-common-new/tests/org/jetbrains/kotlin/test/services/impl/TemporaryDirectoryManagerImpl.kt diff --git a/compiler/test-infrastructure-utils/tests/org/jetbrains/kotlin/test/util/KtTestUtil.java b/compiler/test-infrastructure-utils/tests/org/jetbrains/kotlin/test/util/KtTestUtil.java index 2f096006e55..58f0b31c2a5 100644 --- a/compiler/test-infrastructure-utils/tests/org/jetbrains/kotlin/test/util/KtTestUtil.java +++ b/compiler/test-infrastructure-utils/tests/org/jetbrains/kotlin/test/util/KtTestUtil.java @@ -48,6 +48,11 @@ public class KtTestUtil { return normalizeFile(FileUtil.createTempDirectory(name, "", false)); } + @NotNull + public static File tmpDir(@NotNull File parentDir, @NotNull String name) throws IOException { + return normalizeFile(FileUtil.createTempDirectory(parentDir, name, "", false)); + } + @NotNull public static File tmpDirForReusableFolder(String name) throws IOException { return normalizeFile(FileUtil.createTempDirectory(new File(System.getProperty("java.io.tmpdir")), name, "", true)); diff --git a/compiler/test-infrastructure/tests/org/jetbrains/kotlin/test/TestRunner.kt b/compiler/test-infrastructure/tests/org/jetbrains/kotlin/test/TestRunner.kt index b4c2ea323b7..2d4a619e550 100644 --- a/compiler/test-infrastructure/tests/org/jetbrains/kotlin/test/TestRunner.kt +++ b/compiler/test-infrastructure/tests/org/jetbrains/kotlin/test/TestRunner.kt @@ -9,6 +9,7 @@ import com.intellij.openapi.util.Disposer import com.intellij.testFramework.TestDataFile import org.jetbrains.kotlin.test.model.* import org.jetbrains.kotlin.test.services.* +import java.io.IOException class TestRunner(private val testConfiguration: TestConfiguration) { private val failedAssertions = mutableListOf() @@ -17,6 +18,11 @@ class TestRunner(private val testConfiguration: TestConfiguration) { try { runTestImpl(testDataFileName) } finally { + try { + testConfiguration.testServices.temporaryDirectoryManager.cleanupTemporaryDirectories() + } catch (_: IOException) { + // ignored + } Disposer.dispose(testConfiguration.rootDisposable) } } diff --git a/compiler/test-infrastructure/tests/org/jetbrains/kotlin/test/services/SourceFileProvider.kt b/compiler/test-infrastructure/tests/org/jetbrains/kotlin/test/services/SourceFileProvider.kt index a22b1e5c91d..8078c162ea1 100644 --- a/compiler/test-infrastructure/tests/org/jetbrains/kotlin/test/services/SourceFileProvider.kt +++ b/compiler/test-infrastructure/tests/org/jetbrains/kotlin/test/services/SourceFileProvider.kt @@ -25,9 +25,9 @@ abstract class SourceFileProvider : TestService { val TestServices.sourceFileProvider: SourceFileProvider by TestServices.testServiceAccessor() -class SourceFileProviderImpl(val preprocessors: List) : SourceFileProvider() { - override val kotlinSourceDirectory: File = KtTestUtil.tmpDir("kotlin-files") - override val javaSourceDirectory: File = KtTestUtil.tmpDir("java-files") +class SourceFileProviderImpl(val testServices: TestServices, val preprocessors: List) : SourceFileProvider() { + override val kotlinSourceDirectory: File = testServices.createTempDirectory("kotlin-files") + override val javaSourceDirectory: File = testServices.createTempDirectory("java-files") private val contentOfFiles = mutableMapOf() private val realFileMap = mutableMapOf() diff --git a/compiler/test-infrastructure/tests/org/jetbrains/kotlin/test/services/TemporaryDirectoryManager.kt b/compiler/test-infrastructure/tests/org/jetbrains/kotlin/test/services/TemporaryDirectoryManager.kt new file mode 100644 index 00000000000..902ff2e4f33 --- /dev/null +++ b/compiler/test-infrastructure/tests/org/jetbrains/kotlin/test/services/TemporaryDirectoryManager.kt @@ -0,0 +1,19 @@ +/* + * 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.kotlin.test.services + +import java.io.File + +abstract class TemporaryDirectoryManager(protected val testServices: TestServices) : TestService { + abstract fun createTempDirectory(name: String): File + abstract fun cleanupTemporaryDirectories() +} + +val TestServices.temporaryDirectoryManager: TemporaryDirectoryManager by TestServices.testServiceAccessor() + +fun TestServices.createTempDirectory(name: String): File { + return temporaryDirectoryManager.createTempDirectory(name) +} 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 c1b0c0001a8..91cbadbe99e 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 @@ -151,7 +151,8 @@ class TestConfigurationBuilder { afterAnalysisCheckers, metaInfoHandlerEnabled, directives, - defaultRegisteredDirectivesBuilder.build() + defaultRegisteredDirectivesBuilder.build(), + additionalServices ) } } 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 fb04a27b64e..9941c436440 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 @@ -12,6 +12,8 @@ import org.jetbrains.kotlin.test.builders.testRunner import org.jetbrains.kotlin.test.directives.ConfigurationDirectives import org.jetbrains.kotlin.test.directives.LanguageSettingsDirectives import org.jetbrains.kotlin.test.preprocessors.MetaInfosCleanupPreprocessor +import org.jetbrains.kotlin.test.services.* +import org.jetbrains.kotlin.test.services.impl.TemporaryDirectoryManagerImpl import org.jetbrains.kotlin.test.services.JUnit5Assertions import org.jetbrains.kotlin.test.services.SourceFilePreprocessor import org.jetbrains.kotlin.test.services.KotlinTestInfo @@ -34,6 +36,7 @@ abstract class AbstractKotlinCompilerTest { private val configuration: TestConfigurationBuilder.() -> Unit = { assertions = JUnit5Assertions + useAdditionalService(::TemporaryDirectoryManagerImpl) useSourcePreprocessor(*defaultPreprocessors.toTypedArray()) useDirectives(*defaultDirectiveContainers.toTypedArray()) configureDebugFlags() diff --git a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/services/configuration/JvmForeignAnnotationsConfigurator.kt b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/services/configuration/JvmForeignAnnotationsConfigurator.kt index 3054825246e..e6b7ddd7ca6 100644 --- a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/services/configuration/JvmForeignAnnotationsConfigurator.kt +++ b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/services/configuration/JvmForeignAnnotationsConfigurator.kt @@ -103,7 +103,7 @@ open class JvmForeignAnnotationsConfigurator(testServices: TestServices) : Envir class JvmForeignAnnotationsAgainstCompiledJavaConfigurator(testServices: TestServices) : JvmForeignAnnotationsConfigurator(testServices) { @OptIn(ExperimentalStdlibApi::class) override fun configureCompilerConfiguration(configuration: CompilerConfiguration, module: TestModule, project: MockProject) { - val compiledJavaPath = KtTestUtil.tmpDir("java-compiled-files") + val compiledJavaPath = testServices.createTempDirectory("java-compiled-files") val foreignAnnotations = createJarWithForeignAnnotations(module) val testAnnotations = compileTestAnnotations(foreignAnnotations) diff --git a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/services/impl/TemporaryDirectoryManagerImpl.kt b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/services/impl/TemporaryDirectoryManagerImpl.kt new file mode 100644 index 00000000000..b08c6928499 --- /dev/null +++ b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/services/impl/TemporaryDirectoryManagerImpl.kt @@ -0,0 +1,28 @@ +/* + * 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.kotlin.test.services.impl + +import com.intellij.openapi.util.io.FileUtil +import org.jetbrains.kotlin.test.services.TemporaryDirectoryManager +import org.jetbrains.kotlin.test.services.TestServices +import org.jetbrains.kotlin.test.services.testInfo +import org.jetbrains.kotlin.test.util.KtTestUtil +import java.io.File + +class TemporaryDirectoryManagerImpl(testServices: TestServices) : TemporaryDirectoryManager(testServices) { + private val rootTempDir: File = run { + val testInfo = testServices.testInfo + KtTestUtil.tmpDirForTest(testInfo.className, testInfo.methodName) + } + + override fun createTempDirectory(name: String): File { + return KtTestUtil.tmpDir(rootTempDir, name) + } + + override fun cleanupTemporaryDirectories() { + FileUtil.delete(rootTempDir) + } +} diff --git a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/services/jvm/CompiledJarManager.kt b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/services/jvm/CompiledJarManager.kt index 05a7f3da099..f33601b1709 100644 --- a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/services/jvm/CompiledJarManager.kt +++ b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/services/jvm/CompiledJarManager.kt @@ -10,19 +10,15 @@ import org.jetbrains.kotlin.cli.common.CLIConfigurationKeys import org.jetbrains.kotlin.cli.common.output.writeAll import org.jetbrains.kotlin.test.model.ArtifactKinds import org.jetbrains.kotlin.test.model.TestModule -import org.jetbrains.kotlin.test.services.TestService -import org.jetbrains.kotlin.test.services.TestServices -import org.jetbrains.kotlin.test.services.compilerConfigurationProvider -import org.jetbrains.kotlin.test.services.dependencyProvider +import org.jetbrains.kotlin.test.services.* import java.io.File -import java.nio.file.Files class CompiledJarManager(val testServices: TestServices) : TestService { private val jarCache = mutableMapOf() fun getCompiledJarForModule(module: TestModule): File { return jarCache.getOrPut(module) { - val outputDir = Files.createTempDirectory("module_${module.name}").toFile() + val outputDir = testServices.createTempDirectory("module_${module.name}") val classFileFactory = testServices.dependencyProvider.getArtifact(module, ArtifactKinds.Jvm).classFileFactory val outputFileCollection = SimpleOutputFileCollection(classFileFactory.currentOutput) val messageCollector = testServices.compilerConfigurationProvider.getCompilerConfiguration(module)