diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/ThreadTracker.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/ThreadTracker.kt index b220f290b12..53f9458c64d 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/ThreadTracker.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/ThreadTracker.kt @@ -1,22 +1,18 @@ package org.jetbrains.kotlin.gradle.plugin -import org.gradle.api.Project import org.gradle.api.invocation.Gradle import org.gradle.api.logging.Logging -import org.junit.Assert -import java.util.HashSet +import java.util.* -public class ThreadTracker { +class ThreadTracker { val log = Logging.getLogger(this.javaClass) private var before: Collection? = getThreads() private fun getThreads(): Collection = Thread.getAllStackTraces().keys - public fun checkThreadLeak(gradle: Gradle?) { + fun checkThreadLeak(gradle: Gradle?) { try { - val testThreads = gradle != null && - gradle.rootProject.hasProperty("kotlin.gradle.test") && - !gradle.rootProject.hasProperty("kotlin.gradle.noThreadTest") + val testThreads = gradle != null && gradle.rootProject.hasProperty(ASSERT_THREAD_LEAKS_PROPERTY) Thread.sleep(if (testThreads) 200L else 50L) @@ -39,4 +35,8 @@ public class ThreadTracker { before = null } } + + companion object { + const val ASSERT_THREAD_LEAKS_PROPERTY = "kotlin.gradle.test.assertThreadLeaks" + } } \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/test/kotlin/org/jetbrains/kotlin/gradle/BaseGradleIT.kt b/libraries/tools/kotlin-gradle-plugin/src/test/kotlin/org/jetbrains/kotlin/gradle/BaseGradleIT.kt index 95acbc641ce..b49de931737 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/test/kotlin/org/jetbrains/kotlin/gradle/BaseGradleIT.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/test/kotlin/org/jetbrains/kotlin/gradle/BaseGradleIT.kt @@ -3,6 +3,7 @@ package org.jetbrains.kotlin.gradle import com.google.common.io.Files import com.intellij.openapi.util.io.FileUtil import org.gradle.api.logging.LogLevel +import org.jetbrains.kotlin.gradle.plugin.ThreadTracker import org.jetbrains.kotlin.gradle.util.createGradleCommand import org.jetbrains.kotlin.gradle.util.runProcess import org.junit.After @@ -66,7 +67,14 @@ abstract class BaseGradleIT { } // the second parameter is for using with ToolingAPI, that do not like --daemon/--no-daemon options at all - data class BuildOptions(val withDaemon: Boolean = false, val daemonOptionSupported: Boolean = true) + data class BuildOptions( + val withDaemon: Boolean = false, + val daemonOptionSupported: Boolean = true, + /** + * @see [ThreadTracker] + */ + val assertThreadLeaks: Boolean = true + ) open inner class Project(val projectName: String, val wrapperVersion: String = "1.4", val minLogLevel: LogLevel = LogLevel.DEBUG) { open val resourcesRoot = File(resourcesRootFile, "testProject/$projectName") @@ -193,17 +201,20 @@ abstract class BaseGradleIT { private fun Project.createBuildCommand(params: Array, options: BuildOptions): List = createGradleCommand(createGradleTailParameters(options, params)) - protected fun Project.createGradleTailParameters(options: BuildOptions, params: Array = arrayOf()): List = - params.asList() + - listOf("-PpathToKotlinPlugin=" + File("local-repo").absolutePath, - if (options.daemonOptionSupported) - if (options.withDaemon) "--daemon" - else "--no-daemon" - else null, - "--stacktrace", - "--${minLogLevel.name.toLowerCase()}", - "-Pkotlin.gradle.test=true") - .filterNotNull() + protected fun Project.createGradleTailParameters(options: BuildOptions, tasks: Array = arrayOf()): List = + tasks.toMutableList().apply { + add("--stacktrace") + add("--${minLogLevel.name.toLowerCase()}") + if (options.daemonOptionSupported) { + add(if (options.withDaemon) "--daemon" else "--no-daemon") + } + + add("-PpathToKotlinPlugin=" + File("local-repo").absolutePath) + if (options.assertThreadLeaks) { + add("-P${ThreadTracker.ASSERT_THREAD_LEAKS_PROPERTY}=true") + } + + } private fun String.normalize() = this.lineSequence().joinToString(SYSTEM_LINE_SEPARATOR) diff --git a/libraries/tools/kotlin-gradle-plugin/src/test/kotlin/org/jetbrains/kotlin/gradle/KotlinAndroidGradleIT.kt b/libraries/tools/kotlin-gradle-plugin/src/test/kotlin/org/jetbrains/kotlin/gradle/KotlinAndroidGradleIT.kt index 91e277694eb..b30116d0705 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/test/kotlin/org/jetbrains/kotlin/gradle/KotlinAndroidGradleIT.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/test/kotlin/org/jetbrains/kotlin/gradle/KotlinAndroidGradleIT.kt @@ -1,12 +1,14 @@ package org.jetbrains.kotlin.gradle -import org.junit.Test import org.junit.Ignore -import org.jetbrains.kotlin.gradle.BaseGradleIT.Project +import org.junit.Test @Ignore("Requires Android SDK") class KotlinAndroidGradleIT: BaseGradleIT() { + override fun defaultBuildOptions() = + BuildOptions(withDaemon = true, assertThreadLeaks = false) + @Test fun testSimpleCompile() { val project = Project("AndroidProject", "2.3")