From 274b7bb0b0940ad7e9b34c221c6e3cede43e54ac Mon Sep 17 00:00:00 2001 From: Alexey Tsvetkov Date: Fri, 18 Mar 2016 17:29:32 +0300 Subject: [PATCH] Test: turn off thread leaks assertion for android gradle tests ThreadTracker compares active threads before and after compilation. In test mode if those sets are different, it was throwing an exception. By some reason that is not obviously linked with kotlin, the exception was thrown for every android test. As a temporary solution I added a property 'kotlin.gradle.test.assertThreadLeaks' that controls this assertion and turned it off for android tests only. --- .../kotlin/gradle/plugin/ThreadTracker.kt | 16 ++++----- .../jetbrains/kotlin/gradle/BaseGradleIT.kt | 35 ++++++++++++------- .../kotlin/gradle/KotlinAndroidGradleIT.kt | 6 ++-- 3 files changed, 35 insertions(+), 22 deletions(-) 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")