Use ConTester to prove that the synchronized block is required (#4672)

Relates to PR https://github.com/detekt/detekt/pull/4631
This commit is contained in:
davidburstrom
2022-05-29 17:32:01 +02:00
committed by GitHub
parent 2f5b8f5933
commit a8cde4fb35
4 changed files with 24 additions and 0 deletions

View File

@@ -7,6 +7,8 @@ plugins {
dependencies { dependencies {
api(libs.kotlin.compilerEmbeddable) api(libs.kotlin.compilerEmbeddable)
implementation(projects.detektPsiUtils) implementation(projects.detektPsiUtils)
implementation(libs.contester.breakpoint)
testImplementation(libs.contester.driver)
testImplementation(projects.detektTestUtils) testImplementation(projects.detektTestUtils)
testImplementation(libs.assertj) testImplementation(libs.assertj)
} }

View File

@@ -1,5 +1,6 @@
package io.github.detekt.parser package io.github.detekt.parser
import io.github.davidburstrom.contester.ConTesterBreakpoint
import org.jetbrains.kotlin.com.intellij.openapi.extensions.ExtensionPoint import org.jetbrains.kotlin.com.intellij.openapi.extensions.ExtensionPoint
import org.jetbrains.kotlin.com.intellij.openapi.extensions.Extensions.getRootArea import org.jetbrains.kotlin.com.intellij.openapi.extensions.Extensions.getRootArea
import org.jetbrains.kotlin.com.intellij.openapi.project.Project import org.jetbrains.kotlin.com.intellij.openapi.project.Project
@@ -26,6 +27,9 @@ class DetektPomModel(project: Project) : UserDataHolderBase(), PomModel {
// Addresses https://github.com/detekt/detekt/issues/4609 // Addresses https://github.com/detekt/detekt/issues/4609
synchronized(extensionArea) { synchronized(extensionArea) {
if (!extensionArea.hasExtensionPoint(extension)) { if (!extensionArea.hasExtensionPoint(extension)) {
ConTesterBreakpoint.defineBreakpoint("DetektPomModel.registerExtensionPoint") {
extensionArea == getRootArea()
}
extensionArea.registerExtensionPoint( extensionArea.registerExtensionPoint(
extension, extension,
extensionClass, extensionClass,

View File

@@ -1,5 +1,6 @@
package io.github.detekt.parser package io.github.detekt.parser
import io.github.davidburstrom.contester.ConTesterDriver
import io.github.detekt.psi.BASE_PATH import io.github.detekt.psi.BASE_PATH
import io.github.detekt.psi.LINE_SEPARATOR import io.github.detekt.psi.LINE_SEPARATOR
import io.github.detekt.psi.RELATIVE_PATH import io.github.detekt.psi.RELATIVE_PATH
@@ -8,10 +9,24 @@ import org.assertj.core.api.Assertions.assertThat
import org.assertj.core.api.Assertions.assertThatIllegalArgumentException import org.assertj.core.api.Assertions.assertThatIllegalArgumentException
import org.jetbrains.kotlin.com.intellij.psi.PsiErrorElement import org.jetbrains.kotlin.com.intellij.psi.PsiErrorElement
import org.jetbrains.kotlin.psi.KtTreeVisitorVoid import org.jetbrains.kotlin.psi.KtTreeVisitorVoid
import org.junit.jupiter.api.AfterEach
import org.junit.jupiter.api.Nested import org.junit.jupiter.api.Nested
import org.junit.jupiter.api.Test import org.junit.jupiter.api.Test
class KtCompilerSpec { class KtCompilerSpec {
@AfterEach
internal fun tearDown() {
ConTesterDriver.cleanUp()
}
@Test
fun `parallel construction of KtCompilers should be thread safe`() {
val thread1 = ConTesterDriver.thread { KtCompiler() }
val thread2 = ConTesterDriver.thread { KtCompiler() }
ConTesterDriver.runToBreakpoint(thread1, "DetektPomModel.registerExtensionPoint")
ConTesterDriver.runUntilBlockedOrTerminated(thread2)
ConTesterDriver.join(thread1)
}
@Nested @Nested
inner class `Kotlin Compiler` { inner class `Kotlin Compiler` {

View File

@@ -4,6 +4,7 @@ jacoco = "0.8.8"
kotlin = "1.6.21" kotlin = "1.6.21"
ktlint = "0.45.2" ktlint = "0.45.2"
junit = "5.8.2" junit = "5.8.2"
contester = "0.2.0"
[libraries] [libraries]
githubRelease-gradle = "com.github.breadmoirai:github-release:2.3.7" githubRelease-gradle = "com.github.breadmoirai:github-release:2.3.7"
@@ -37,6 +38,8 @@ reflections = "org.reflections:reflections:0.10.2"
mockk = "io.mockk:mockk:1.12.4" mockk = "io.mockk:mockk:1.12.4"
snakeyaml = "org.yaml:snakeyaml:1.30" snakeyaml = "org.yaml:snakeyaml:1.30"
jcommander = "com.beust:jcommander:1.82" jcommander = "com.beust:jcommander:1.82"
contester-breakpoint = { module = "io.github.davidburstrom.contester:contester-breakpoint", version.ref = "contester" }
contester-driver = { module = "io.github.davidburstrom.contester:contester-driver", version.ref = "contester" }
[plugins] [plugins]
binaryCompatibilityValidator = { id = "org.jetbrains.kotlinx.binary-compatibility-validator", version = "0.10.0" } binaryCompatibilityValidator = { id = "org.jetbrains.kotlinx.binary-compatibility-validator", version = "0.10.0" }