From 4705f13b39b2054539550c1dbbfa1cf16f7e5409 Mon Sep 17 00:00:00 2001 From: "Alexander.Likhachev" Date: Tue, 15 Aug 2023 12:18:44 +0200 Subject: [PATCH] [BT] Add a test for KT-61206 --- .../kotlin-build-tools-api/build.gradle.kts | 16 +++++++++++- .../kotlin/SharedApiClassesClassLoaderTest.kt | 25 +++++++++++++++++++ 2 files changed, 40 insertions(+), 1 deletion(-) create mode 100644 compiler/build-tools/kotlin-build-tools-api/src/test/kotlin/SharedApiClassesClassLoaderTest.kt diff --git a/compiler/build-tools/kotlin-build-tools-api/build.gradle.kts b/compiler/build-tools/kotlin-build-tools-api/build.gradle.kts index 300fa2f9da0..af48bb31dc3 100644 --- a/compiler/build-tools/kotlin-build-tools-api/build.gradle.kts +++ b/compiler/build-tools/kotlin-build-tools-api/build.gradle.kts @@ -1,3 +1,5 @@ +import org.jetbrains.kotlin.gradle.tasks.KotlinCompile + plugins { kotlin("jvm") id("jps-compatible") @@ -8,6 +10,8 @@ configureKotlinCompileTasksGradleCompatibility() dependencies { compileOnly(kotlinStdlib()) + testApiJUnit5() + testImplementation(kotlinStdlib()) } kotlin { @@ -16,4 +20,14 @@ kotlin { publish() -standardPublicJars() \ No newline at end of file +standardPublicJars() + +tasks.named("compileTestKotlin") { + compilerOptions { + optIn.add("org.jetbrains.kotlin.buildtools.api.ExperimentalBuildToolsApi") + } +} + +projectTest(jUnitMode = JUnitMode.JUnit5) { + useJUnitPlatform() +} \ No newline at end of file diff --git a/compiler/build-tools/kotlin-build-tools-api/src/test/kotlin/SharedApiClassesClassLoaderTest.kt b/compiler/build-tools/kotlin-build-tools-api/src/test/kotlin/SharedApiClassesClassLoaderTest.kt new file mode 100644 index 00000000000..d82cc9cf9ba --- /dev/null +++ b/compiler/build-tools/kotlin-build-tools-api/src/test/kotlin/SharedApiClassesClassLoaderTest.kt @@ -0,0 +1,25 @@ +import org.jetbrains.kotlin.buildtools.api.CompilationService +import org.jetbrains.kotlin.buildtools.api.SharedApiClassesClassLoader +import org.junit.jupiter.api.DisplayName +import org.junit.jupiter.api.Test +import org.junit.jupiter.api.assertThrows + +/* + * Copyright 2010-2023 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. + */ + +class SharedApiClassesClassLoaderTest { + @DisplayName("No application classes are leaked into the `SharedApiClassesClassLoader`") + @Test + fun testNoLeakedApplicationClasses() { + val possibleLeakedClass = "org.junit.jupiter.api.Test" + ClassLoader.getSystemClassLoader() + .loadClass(possibleLeakedClass) // Ensure that the class is there. Otherwise, ClassNotFoundException will be thrown. + val sharedApiClassesClassLoader = SharedApiClassesClassLoader() + assertThrows("`$possibleLeakedClass` is present in the system classloader, but must not be present in the custom classloader") { + sharedApiClassesClassLoader.loadClass(possibleLeakedClass) + } + sharedApiClassesClassLoader.loadClass(CompilationService::class.java.name) // The build tools API classes are still available + } +} \ No newline at end of file