Skip to content

Commit 46ea908

Browse files
lunakolySpace Team
authored and
Space Team
committed
[Tests] Ensure the temporary directories are cleared
This change may prevent OOMs. Context: https://jetbrains.slack.com/archives/C4U955N6B/p1685000899030279
1 parent 039b5fc commit 46ea908

File tree

3 files changed

+37
-9
lines changed

3 files changed

+37
-9
lines changed

analysis/analysis-test-framework/tests/org/jetbrains/kotlin/analysis/test/framework/base/AbstractAnalysisApiBasedTest.kt

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,10 @@ import org.jetbrains.kotlin.test.model.ResultingArtifact
3737
import org.jetbrains.kotlin.test.runners.AbstractKotlinCompilerTest
3838
import org.jetbrains.kotlin.test.services.*
3939
import org.jetbrains.kotlin.test.services.impl.TemporaryDirectoryManagerImpl
40+
import org.junit.jupiter.api.AfterEach
4041
import org.junit.jupiter.api.BeforeEach
4142
import org.junit.jupiter.api.TestInfo
43+
import java.io.IOException
4244
import java.nio.file.Path
4345
import java.nio.file.Paths
4446
import kotlin.io.path.exists
@@ -52,7 +54,13 @@ abstract class AbstractAnalysisApiBasedTest : TestWithDisposable() {
5254
protected lateinit var testDataPath: Path
5355
private set
5456

55-
private lateinit var testServices: TestServices
57+
private var _testServices: TestServices? = null
58+
59+
private var testServices: TestServices
60+
get() = _testServices ?: error("`_testServices` has not been initialized")
61+
set(value) {
62+
_testServices = value
63+
}
5664

5765
protected open fun configureTest(builder: TestConfigurationBuilder) {
5866
configurator.configureTest(builder, disposable)
@@ -148,6 +156,15 @@ abstract class AbstractAnalysisApiBasedTest : TestWithDisposable() {
148156
doTestByModuleStructure(moduleStructure, testServices)
149157
}
150158

159+
@AfterEach
160+
fun cleanupTemporaryDirectories() {
161+
try {
162+
_testServices?.temporaryDirectoryManager?.cleanupTemporaryDirectories()
163+
} catch (e: IOException) {
164+
println("Failed to clean temporary directories: ${e.message}\n${e.stackTrace}")
165+
}
166+
}
167+
151168
private fun createTestConfiguration(): TestConfiguration {
152169
val testConfiguration = testConfiguration(testDataPath.toString(), configure)
153170
Disposer.register(disposable, testConfiguration.rootDisposable)

compiler/test-infrastructure/tests/org/jetbrains/kotlin/test/TestRunner.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,8 @@ class TestRunner(private val testConfiguration: TestConfiguration) {
3030
} finally {
3131
try {
3232
testConfiguration.testServices.temporaryDirectoryManager.cleanupTemporaryDirectories()
33-
} catch (_: IOException) {
34-
// ignored
33+
} catch (e: IOException) {
34+
println("Failed to clean temporary directories: ${e.message}\n${e.stackTrace}")
3535
}
3636
beforeDispose(testConfiguration)
3737
Disposer.dispose(testConfiguration.rootDisposable)

compiler/tests-common-new/tests/org/jetbrains/kotlin/test/services/impl/TemporaryDirectoryManagerImpl.kt

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,22 +5,23 @@
55

66
package org.jetbrains.kotlin.test.services.impl
77

8-
import com.intellij.openapi.util.io.FileUtil
8+
import com.intellij.openapi.util.io.NioFiles
99
import org.jetbrains.kotlin.test.services.TemporaryDirectoryManager
1010
import org.jetbrains.kotlin.test.services.TestServices
1111
import org.jetbrains.kotlin.test.services.testInfo
1212
import org.jetbrains.kotlin.test.util.KtTestUtil
1313
import java.io.File
14+
import java.nio.file.Paths
1415
import java.util.*
1516

1617
class TemporaryDirectoryManagerImpl(testServices: TestServices) : TemporaryDirectoryManager(testServices) {
1718
private val cache = mutableMapOf<String, File>()
18-
private val rootTempDir: File = run {
19+
private val rootTempDir = lazy {
1920
val testInfo = testServices.testInfo
2021
val className = testInfo.className
2122
val methodName = testInfo.methodName
2223
if (!onWindows && className.length + methodName.length < 255) {
23-
return@run KtTestUtil.tmpDirForTest(className, methodName)
24+
return@lazy KtTestUtil.tmpDirForTest(className, methodName)
2425
}
2526

2627
// This code will simplify directory name for windows. This is needed because there can occur errors due to long name
@@ -32,15 +33,25 @@ class TemporaryDirectoryManagerImpl(testServices: TestServices) : TemporaryDirec
3233
}
3334

3435
override val rootDir: File
35-
get() = rootTempDir
36+
get() = rootTempDir.value
3637

3738
override fun getOrCreateTempDirectory(name: String): File {
38-
return cache.getOrPut(name) { KtTestUtil.tmpDir(rootTempDir, name) }
39+
return cache.getOrPut(name) { KtTestUtil.tmpDir(rootDir, name) }
3940
}
4041

4142
override fun cleanupTemporaryDirectories() {
4243
cache.clear()
43-
FileUtil.delete(rootTempDir)
44+
45+
if (rootTempDir.isInitialized()) {
46+
NioFiles.deleteRecursively(Paths.get(rootDir.path))
47+
}
48+
}
49+
50+
@Suppress("removal")
51+
fun finalize() {
52+
if (rootTempDir.isInitialized() && rootDir.exists()) {
53+
error("The temporary directory $rootDir has not been deleted by the time the corresponding ${this::class.simpleName} is finalized.")
54+
}
4455
}
4556

4657
companion object {

0 commit comments

Comments
 (0)