From 0ee4e386be2c5a89bca883643034485a448b8885 Mon Sep 17 00:00:00 2001 From: Ivan Gavrilovic Date: Fri, 29 Oct 2021 17:02:43 +0100 Subject: [PATCH] KGP - Fix flaky tests invoking javac through JDK APIs Tests invoking javac APIs were flaky because ClasspathAnalyzerTest was using Gradle's ProjectBuilder, which appends tools.jar to the system class loader. Other tests do not do that, and they invoke javac APIs directly. In some executions, this causes some javac classes to be loaded from the system class loader (the one patched by Gradle), while some of them will be loaded by UrlClassLoader which points to tools.jar in java.home. Having javac classes from different class loaders causes java.lang.IllegalAccessError as package private access across class loaders is not allowed. https://bugs.openjdk.java.net/browse/JDK-8068152 has more information on this issue. This change fixes the issue by fully removing usage of ProjectBuilder. Test: ClasspathAnalyzerTest --- .../kapt/incremental/ClasspathAnalyzer.kt | 2 +- .../kapt/incremental/ClasspathAnalyzerTest.kt | 30 ++++--------------- 2 files changed, 7 insertions(+), 25 deletions(-) diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/kapt/incremental/ClasspathAnalyzer.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/kapt/incremental/ClasspathAnalyzer.kt index 8fefab3550c..0f15783ffac 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/kapt/incremental/ClasspathAnalyzer.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/kapt/incremental/ClasspathAnalyzer.kt @@ -54,7 +54,7 @@ abstract class StructureTransformLegacyAction : TransformAction ZipOutputStream(jar.outputStream()).use { @@ -115,17 +111,15 @@ class ClasspathAnalyzerTest { } } val outputsB = TransformOutputsMock(tmp.newFolder()) - StructureTransformTestAction(jarB, tmp.newFolder("projectB")).transform(outputsB) + transform(jarB, outputsB) assertArrayEquals(outputsA.createdOutputs.single().readBytes(), outputsB.createdOutputs.single().readBytes()) } @Test fun emptyInput() { - val transformAction = StructureTransformTestAction(tmp.newFolder("input"), tmp.newFolder("project")) val outputs = TransformOutputsMock(tmp.newFolder()) - - transformAction.transform(outputs) + transform(tmp.newFolder("input"), outputs) val data = ClasspathEntryData.ClasspathEntrySerializer.loadFrom(outputs.createdOutputs.single()) assertTrue(data.classAbiHash.isEmpty()) @@ -149,10 +143,8 @@ class ClasspathAnalyzerTest { it.closeEntry() } } - val transformAction = StructureTransformTestAction(inputJar, tmp.newFolder("project")) val outputs = TransformOutputsMock(tmp.newFolder()) - - transformAction.transform(outputs) + transform(inputJar, outputs) val data = ClasspathEntryData.ClasspathEntrySerializer.loadFrom(outputs.createdOutputs.single()) assertEquals(setOf("test/A", "test/B", "test/C"), data.classAbiHash.keys) @@ -166,16 +158,6 @@ class ClasspathAnalyzerTest { } } -class StructureTransformTestAction(val input: File, val projectDir: File) : StructureTransformAction() { - private val project = ProjectBuilder.builder().withProjectDir(projectDir).build() - - override val inputArtifact: Provider = project.provider { project.objects.fileProperty().fileValue(input).get() } - - override fun getParameters(): TransformParameters.None { - error("Should not be called") - } -} - class TransformOutputsMock(val outputDir: File) : TransformOutputs { val createdOutputs = mutableListOf()