Skip to content

Commit

Permalink
Use ConTester to prove that the synchronized block is required (#4672)
Browse files Browse the repository at this point in the history
Relates to PR #4631
  • Loading branch information
davidburstrom committed May 29, 2022
1 parent 2f5b8f5 commit a8cde4f
Show file tree
Hide file tree
Showing 4 changed files with 24 additions and 0 deletions.
2 changes: 2 additions & 0 deletions detekt-parser/build.gradle.kts
Expand Up @@ -7,6 +7,8 @@ plugins {
dependencies {
api(libs.kotlin.compilerEmbeddable)
implementation(projects.detektPsiUtils)
implementation(libs.contester.breakpoint)
testImplementation(libs.contester.driver)
testImplementation(projects.detektTestUtils)
testImplementation(libs.assertj)
}
Expand Down
@@ -1,5 +1,6 @@
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.Extensions.getRootArea
import org.jetbrains.kotlin.com.intellij.openapi.project.Project
Expand All @@ -26,6 +27,9 @@ class DetektPomModel(project: Project) : UserDataHolderBase(), PomModel {
// Addresses https://github.com/detekt/detekt/issues/4609
synchronized(extensionArea) {
if (!extensionArea.hasExtensionPoint(extension)) {
ConTesterBreakpoint.defineBreakpoint("DetektPomModel.registerExtensionPoint") {
extensionArea == getRootArea()
}
extensionArea.registerExtensionPoint(
extension,
extensionClass,
Expand Down
@@ -1,5 +1,6 @@
package io.github.detekt.parser

import io.github.davidburstrom.contester.ConTesterDriver
import io.github.detekt.psi.BASE_PATH
import io.github.detekt.psi.LINE_SEPARATOR
import io.github.detekt.psi.RELATIVE_PATH
Expand All @@ -8,10 +9,24 @@ import org.assertj.core.api.Assertions.assertThat
import org.assertj.core.api.Assertions.assertThatIllegalArgumentException
import org.jetbrains.kotlin.com.intellij.psi.PsiErrorElement
import org.jetbrains.kotlin.psi.KtTreeVisitorVoid
import org.junit.jupiter.api.AfterEach
import org.junit.jupiter.api.Nested
import org.junit.jupiter.api.Test

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
inner class `Kotlin Compiler` {
Expand Down
3 changes: 3 additions & 0 deletions gradle/libs.versions.toml
Expand Up @@ -4,6 +4,7 @@ jacoco = "0.8.8"
kotlin = "1.6.21"
ktlint = "0.45.2"
junit = "5.8.2"
contester = "0.2.0"

[libraries]
githubRelease-gradle = "com.github.breadmoirai:github-release:2.3.7"
Expand Down Expand Up @@ -37,6 +38,8 @@ reflections = "org.reflections:reflections:0.10.2"
mockk = "io.mockk:mockk:1.12.4"
snakeyaml = "org.yaml:snakeyaml:1.30"
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]
binaryCompatibilityValidator = { id = "org.jetbrains.kotlinx.binary-compatibility-validator", version = "0.10.0" }
Expand Down

0 comments on commit a8cde4f

Please sign in to comment.