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.
This commit is contained in:
Alexey Tsvetkov
2016-03-18 17:29:32 +03:00
parent cbf8dca28d
commit 274b7bb0b0
3 changed files with 35 additions and 22 deletions
@@ -1,22 +1,18 @@
package org.jetbrains.kotlin.gradle.plugin package org.jetbrains.kotlin.gradle.plugin
import org.gradle.api.Project
import org.gradle.api.invocation.Gradle import org.gradle.api.invocation.Gradle
import org.gradle.api.logging.Logging import org.gradle.api.logging.Logging
import org.junit.Assert import java.util.*
import java.util.HashSet
public class ThreadTracker { class ThreadTracker {
val log = Logging.getLogger(this.javaClass) val log = Logging.getLogger(this.javaClass)
private var before: Collection<Thread>? = getThreads() private var before: Collection<Thread>? = getThreads()
private fun getThreads(): Collection<Thread> = Thread.getAllStackTraces().keys private fun getThreads(): Collection<Thread> = Thread.getAllStackTraces().keys
public fun checkThreadLeak(gradle: Gradle?) { fun checkThreadLeak(gradle: Gradle?) {
try { try {
val testThreads = gradle != null && val testThreads = gradle != null && gradle.rootProject.hasProperty(ASSERT_THREAD_LEAKS_PROPERTY)
gradle.rootProject.hasProperty("kotlin.gradle.test") &&
!gradle.rootProject.hasProperty("kotlin.gradle.noThreadTest")
Thread.sleep(if (testThreads) 200L else 50L) Thread.sleep(if (testThreads) 200L else 50L)
@@ -39,4 +35,8 @@ public class ThreadTracker {
before = null before = null
} }
} }
companion object {
const val ASSERT_THREAD_LEAKS_PROPERTY = "kotlin.gradle.test.assertThreadLeaks"
}
} }
@@ -3,6 +3,7 @@ package org.jetbrains.kotlin.gradle
import com.google.common.io.Files import com.google.common.io.Files
import com.intellij.openapi.util.io.FileUtil import com.intellij.openapi.util.io.FileUtil
import org.gradle.api.logging.LogLevel 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.createGradleCommand
import org.jetbrains.kotlin.gradle.util.runProcess import org.jetbrains.kotlin.gradle.util.runProcess
import org.junit.After 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 // 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 inner class Project(val projectName: String, val wrapperVersion: String = "1.4", val minLogLevel: LogLevel = LogLevel.DEBUG) {
open val resourcesRoot = File(resourcesRootFile, "testProject/$projectName") open val resourcesRoot = File(resourcesRootFile, "testProject/$projectName")
@@ -193,17 +201,20 @@ abstract class BaseGradleIT {
private fun Project.createBuildCommand(params: Array<out String>, options: BuildOptions): List<String> = private fun Project.createBuildCommand(params: Array<out String>, options: BuildOptions): List<String> =
createGradleCommand(createGradleTailParameters(options, params)) createGradleCommand(createGradleTailParameters(options, params))
protected fun Project.createGradleTailParameters(options: BuildOptions, params: Array<out String> = arrayOf()): List<String> = protected fun Project.createGradleTailParameters(options: BuildOptions, tasks: Array<out String> = arrayOf()): List<String> =
params.asList() + tasks.toMutableList().apply {
listOf("-PpathToKotlinPlugin=" + File("local-repo").absolutePath, add("--stacktrace")
if (options.daemonOptionSupported) add("--${minLogLevel.name.toLowerCase()}")
if (options.withDaemon) "--daemon" if (options.daemonOptionSupported) {
else "--no-daemon" add(if (options.withDaemon) "--daemon" else "--no-daemon")
else null, }
"--stacktrace",
"--${minLogLevel.name.toLowerCase()}", add("-PpathToKotlinPlugin=" + File("local-repo").absolutePath)
"-Pkotlin.gradle.test=true") if (options.assertThreadLeaks) {
.filterNotNull() add("-P${ThreadTracker.ASSERT_THREAD_LEAKS_PROPERTY}=true")
}
}
private fun String.normalize() = this.lineSequence().joinToString(SYSTEM_LINE_SEPARATOR) private fun String.normalize() = this.lineSequence().joinToString(SYSTEM_LINE_SEPARATOR)
@@ -1,12 +1,14 @@
package org.jetbrains.kotlin.gradle package org.jetbrains.kotlin.gradle
import org.junit.Test
import org.junit.Ignore import org.junit.Ignore
import org.jetbrains.kotlin.gradle.BaseGradleIT.Project import org.junit.Test
@Ignore("Requires Android SDK") @Ignore("Requires Android SDK")
class KotlinAndroidGradleIT: BaseGradleIT() { class KotlinAndroidGradleIT: BaseGradleIT() {
override fun defaultBuildOptions() =
BuildOptions(withDaemon = true, assertThreadLeaks = false)
@Test @Test
fun testSimpleCompile() { fun testSimpleCompile() {
val project = Project("AndroidProject", "2.3") val project = Project("AndroidProject", "2.3")