Skip to content

Commit

Permalink
Workaround for gradle/gradle#17783
Browse files Browse the repository at this point in the history
  • Loading branch information
3flex committed Nov 16, 2021
1 parent b8882c0 commit fbaf1eb
Showing 1 changed file with 34 additions and 0 deletions.
Expand Up @@ -5,11 +5,19 @@ import io.gitlab.arturbosch.detekt.testkit.DslGradleRunner
import io.gitlab.arturbosch.detekt.testkit.ProjectLayout
import io.gitlab.arturbosch.detekt.testkit.triggerEvaluation
import org.assertj.core.api.Assertions.assertThat
import org.gradle.api.Project
import org.gradle.api.internal.project.DefaultProject
import org.gradle.api.provider.Provider
import org.gradle.build.event.BuildEventsListenerRegistry
import org.gradle.internal.service.DefaultServiceRegistry
import org.gradle.internal.service.scopes.ProjectScopeServices
import org.gradle.kotlin.dsl.apply
import org.gradle.kotlin.dsl.repositories
import org.gradle.tooling.events.OperationCompletionListener
import org.jetbrains.kotlin.gradle.plugin.KotlinPluginWrapper
import org.spekframework.spek2.Spek
import org.spekframework.spek2.style.specification.describe
import java.util.concurrent.atomic.AtomicReference

object DetektJvmSpec : Spek({
describe("When applying detekt in a JVM project") {
Expand All @@ -20,6 +28,7 @@ object DetektJvmSpec : Spek({
buildFileName = "build.gradle",
baselineFiles = listOf("detekt-baseline.xml", "detekt-baseline-main.xml", "detekt-baseline-test.xml"),
projectScript = {
addFakeService()
apply<KotlinPluginWrapper>()
apply<DetektPlugin>()
repositories {
Expand Down Expand Up @@ -137,3 +146,28 @@ object DetektJvmSpec : Spek({
}
}
})

internal class FakeBuildEventsListenerRegistry : BuildEventsListenerRegistry {
override fun onTaskCompletion(provider: Provider<out OperationCompletionListener>) {
// Unit
}
}

// https://github.com/gradle/gradle/issues/17783
@Suppress("TooGenericExceptionThrown")
private fun Project.addFakeService() {
try {
val projectScopeServices = (this as DefaultProject).services as ProjectScopeServices
val state = ProjectScopeServices::class.java.superclass.getDeclaredField("state")
state.isAccessible = true
val stateValue = state.get(projectScopeServices) as AtomicReference<Any>
val enumClass = Class.forName(DefaultServiceRegistry::class.java.name + "\$State")
stateValue.set(enumClass.enumConstants[0])

// add service and set state so that future mutations are not allowed
projectScopeServices.add(BuildEventsListenerRegistry::class.java, FakeBuildEventsListenerRegistry())
stateValue.set(enumClass.enumConstants[1])
} catch (e: Throwable) {
throw RuntimeException(e)
}
}

0 comments on commit fbaf1eb

Please sign in to comment.