Skip to content

Commit c71e090

Browse files
gavra0Space
authored and
Space
committed
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
1 parent 73120b9 commit c71e090

File tree

2 files changed

+8
-27
lines changed

2 files changed

+8
-27
lines changed

libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/kapt/incremental/ClasspathAnalyzer.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ abstract class StructureTransformLegacyAction : TransformAction<TransformParamet
5454
}
5555
}
5656

57-
private fun transform(input: File, outputs: TransformOutputs) {
57+
internal fun transform(input: File, outputs: TransformOutputs) {
5858
val data = if (input.isDirectory) {
5959
visitDirectory(input)
6060
} else {

libraries/tools/kotlin-gradle-plugin/src/test/kotlin/org/jetbrains/kotlin/gradle/internal/kapt/incremental/ClasspathAnalyzerTest.kt

Lines changed: 7 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,6 @@
66
package org.jetbrains.kotlin.gradle.internal.kapt.incremental
77

88
import org.gradle.api.artifacts.transform.TransformOutputs
9-
import org.gradle.api.artifacts.transform.TransformParameters
10-
import org.gradle.api.file.FileSystemLocation
11-
import org.gradle.api.provider.Provider
12-
import org.gradle.testfixtures.ProjectBuilder
139
import org.jetbrains.org.objectweb.asm.ClassWriter
1410
import org.jetbrains.org.objectweb.asm.Opcodes
1511
import org.junit.Assert.*
@@ -39,7 +35,7 @@ class ClasspathAnalyzerTest {
3935
}
4036
}
4137
val outputs = TransformOutputsMock(tmp.newFolder())
42-
StructureTransformTestAction(classesDir, tmp.newFolder("project")).transform(outputs)
38+
transform(classesDir, outputs)
4339

4440
val data = ClasspathEntryData.ClasspathEntrySerializer.loadFrom(outputs.createdOutputs.single())
4541
assertEquals(setOf("test/A", "test/B"), data.classAbiHash.keys)
@@ -75,7 +71,7 @@ class ClasspathAnalyzerTest {
7571
}
7672
}
7773
val outputs = TransformOutputsMock(tmp.newFolder())
78-
StructureTransformTestAction(inputJar, tmp.newFolder("project")).transform(outputs)
74+
transform(inputJar, outputs)
7975

8076
val data = ClasspathEntryData.ClasspathEntrySerializer.loadFrom(outputs.createdOutputs.single())
8177
assertEquals(setOf("test/A", "test/B"), data.classAbiHash.keys)
@@ -101,7 +97,7 @@ class ClasspathAnalyzerTest {
10197
}
10298
}
10399
val outputsA = TransformOutputsMock(tmp.newFolder())
104-
StructureTransformTestAction(jarA, tmp.newFolder("projectA")).transform(outputsA)
100+
transform(jarA, outputsA)
105101

106102
val jarB = tmp.newFile("inputB.jar").also { jar ->
107103
ZipOutputStream(jar.outputStream()).use {
@@ -115,17 +111,15 @@ class ClasspathAnalyzerTest {
115111
}
116112
}
117113
val outputsB = TransformOutputsMock(tmp.newFolder())
118-
StructureTransformTestAction(jarB, tmp.newFolder("projectB")).transform(outputsB)
114+
transform(jarB, outputsB)
119115

120116
assertArrayEquals(outputsA.createdOutputs.single().readBytes(), outputsB.createdOutputs.single().readBytes())
121117
}
122118

123119
@Test
124120
fun emptyInput() {
125-
val transformAction = StructureTransformTestAction(tmp.newFolder("input"), tmp.newFolder("project"))
126121
val outputs = TransformOutputsMock(tmp.newFolder())
127-
128-
transformAction.transform(outputs)
122+
transform(tmp.newFolder("input"), outputs)
129123

130124
val data = ClasspathEntryData.ClasspathEntrySerializer.loadFrom(outputs.createdOutputs.single())
131125
assertTrue(data.classAbiHash.isEmpty())
@@ -149,10 +143,8 @@ class ClasspathAnalyzerTest {
149143
it.closeEntry()
150144
}
151145
}
152-
val transformAction = StructureTransformTestAction(inputJar, tmp.newFolder("project"))
153146
val outputs = TransformOutputsMock(tmp.newFolder())
154-
155-
transformAction.transform(outputs)
147+
transform(inputJar, outputs)
156148

157149
val data = ClasspathEntryData.ClasspathEntrySerializer.loadFrom(outputs.createdOutputs.single())
158150
assertEquals(setOf("test/A", "test/B", "test/C"), data.classAbiHash.keys)
@@ -166,17 +158,6 @@ class ClasspathAnalyzerTest {
166158
}
167159
}
168160

169-
class StructureTransformTestAction(val input: File, val projectDir: File) : StructureTransformAction() {
170-
private val project = ProjectBuilder.builder().withProjectDir(projectDir).build()
171-
172-
override val inputArtifact: Provider<FileSystemLocation> = project.provider { project.objects.fileProperty().fileValue(input).get() }
173-
174-
override fun getParameters(): TransformParameters.None? {
175-
//no need for StructureTransformAction and so for test
176-
return null
177-
}
178-
}
179-
180161
class TransformOutputsMock(val outputDir: File) : TransformOutputs {
181162
val createdOutputs = mutableListOf<File>()
182163

@@ -192,4 +173,4 @@ class TransformOutputsMock(val outputDir: File) : TransformOutputs {
192173
return newDir
193174
}
194175

195-
}
176+
}

0 commit comments

Comments
 (0)