[Build] Make projectTest() extension compatible with configuration cache

Relates to #KT-44611
This commit is contained in:
Alexander Likhachev
2021-02-15 16:21:09 +03:00
parent ce49664366
commit da6544ae3c
+28 -14
View File
@@ -9,11 +9,13 @@
import org.gradle.api.Project import org.gradle.api.Project
import org.gradle.api.Task import org.gradle.api.Task
import org.gradle.api.file.FileSystemOperations
import org.gradle.api.internal.tasks.testing.filter.DefaultTestFilter import org.gradle.api.internal.tasks.testing.filter.DefaultTestFilter
import org.gradle.api.tasks.TaskProvider import org.gradle.api.tasks.TaskProvider
import org.gradle.api.tasks.testing.Test import org.gradle.api.tasks.testing.Test
import org.gradle.kotlin.dsl.extra import org.gradle.kotlin.dsl.extra
import org.gradle.kotlin.dsl.project import org.gradle.kotlin.dsl.project
import org.gradle.kotlin.dsl.support.serviceOf
import java.io.File import java.io.File
import java.lang.Character.isLowerCase import java.lang.Character.isLowerCase
import java.lang.Character.isUpperCase import java.lang.Character.isUpperCase
@@ -80,7 +82,13 @@ fun Project.projectTest(
shortenTempRootName: Boolean = false, shortenTempRootName: Boolean = false,
jUnit5Enabled: Boolean = false, jUnit5Enabled: Boolean = false,
body: Test.() -> Unit = {} body: Test.() -> Unit = {}
): TaskProvider<Test> = getOrCreateTask(taskName) { ): TaskProvider<Test> {
val shouldInstrument = project.providers.gradleProperty("kotlin.test.instrumentation.disable")
.forUseAtConfigurationTime().orNull?.toBoolean() != true
if (shouldInstrument) {
evaluationDependsOn(":test-instrumenter")
}
return getOrCreateTask<Test>(taskName) {
doFirst { doFirst {
val commandLineIncludePatterns = (filter as? DefaultTestFilter)?.commandLineIncludePatterns ?: mutableSetOf() val commandLineIncludePatterns = (filter as? DefaultTestFilter)?.commandLineIncludePatterns ?: mutableSetOf()
val patterns = filter.includePatterns + commandLineIncludePatterns val patterns = filter.includePatterns + commandLineIncludePatterns
@@ -140,10 +148,12 @@ fun Project.projectTest(
} }
} }
if (project.findProperty("kotlin.test.instrumentation.disable")?.toString()?.toBoolean() != true) { if (shouldInstrument) {
val instrumentationArgsProperty = project.providers.gradleProperty("kotlin.test.instrumentation.args")
val testInstrumenterOutputs = project.tasks.findByPath(":test-instrumenter:jar")!!.outputs.files
doFirst { doFirst {
val agent = tasks.findByPath(":test-instrumenter:jar")!!.outputs.files.singleFile val agent = testInstrumenterOutputs.singleFile
val args = project.findProperty("kotlin.test.instrumentation.args")?.let { "=$it" }.orEmpty() val args = instrumentationArgsProperty.orNull?.let { "=$it" }.orEmpty()
jvmArgs("-javaagent:$agent$args") jvmArgs("-javaagent:$agent$args")
} }
dependsOn(":test-instrumenter:jar") dependsOn(":test-instrumenter:jar")
@@ -159,40 +169,44 @@ fun Project.projectTest(
maxHeapSize = "1600m" maxHeapSize = "1600m"
systemProperty("idea.is.unit.test", "true") systemProperty("idea.is.unit.test", "true")
systemProperty("idea.home.path", intellijRootDir().canonicalPath) systemProperty("idea.home.path", project.intellijRootDir().canonicalPath)
systemProperty("java.awt.headless", "true") systemProperty("java.awt.headless", "true")
environment("NO_FS_ROOTS_ACCESS_CHECK", "true") environment("NO_FS_ROOTS_ACCESS_CHECK", "true")
environment("PROJECT_CLASSES_DIRS", testSourceSet.output.classesDirs.asPath) environment("PROJECT_CLASSES_DIRS", project.testSourceSet.output.classesDirs.asPath)
environment("PROJECT_BUILD_DIR", buildDir) environment("PROJECT_BUILD_DIR", project.buildDir)
systemProperty("jps.kotlin.home", rootProject.extra["distKotlinHomeDir"]!!) systemProperty("jps.kotlin.home", project.rootProject.extra["distKotlinHomeDir"]!!)
systemProperty("kotlin.ni", if (rootProject.hasProperty("newInferenceTests")) "true" else "false") systemProperty("kotlin.ni", if (project.rootProject.hasProperty("newInferenceTests")) "true" else "false")
systemProperty("org.jetbrains.kotlin.skip.muted.tests", if (rootProject.hasProperty("skipMutedTests")) "true" else "false") systemProperty("org.jetbrains.kotlin.skip.muted.tests", if (project.rootProject.hasProperty("skipMutedTests")) "true" else "false")
if (Platform[202].orHigher()) { if (Platform[202].orHigher()) {
systemProperty("idea.ignore.disabled.plugins", "true") systemProperty("idea.ignore.disabled.plugins", "true")
} }
var subProjectTempRoot: Path? = null var subProjectTempRoot: Path? = null
val projectName = project.name
val teamcity = project.rootProject.findProperty("teamcity") as? Map<*, *>
doFirst { doFirst {
val teamcity = rootProject.findProperty("teamcity") as? Map<*, *>
val systemTempRoot = val systemTempRoot =
// TC by default doesn't switch `teamcity.build.tempDir` to 'java.io.tmpdir' so it could cause to wasted disk space // TC by default doesn't switch `teamcity.build.tempDir` to 'java.io.tmpdir' so it could cause to wasted disk space
// Should be fixed soon on Teamcity side // Should be fixed soon on Teamcity side
(teamcity?.get("teamcity.build.tempDir") as? String) (teamcity?.get("teamcity.build.tempDir") as? String)
?: System.getProperty("java.io.tmpdir") ?: System.getProperty("java.io.tmpdir")
systemTempRoot.let { systemTempRoot.let {
val prefix = (project.name + "Project_" + taskName + "_").takeUnless { shortenTempRootName } val prefix = (projectName + "Project_" + taskName + "_").takeUnless { shortenTempRootName }
subProjectTempRoot = Files.createTempDirectory(File(systemTempRoot).toPath(), prefix) subProjectTempRoot = Files.createTempDirectory(File(systemTempRoot).toPath(), prefix)
systemProperty("java.io.tmpdir", subProjectTempRoot.toString()) systemProperty("java.io.tmpdir", subProjectTempRoot.toString())
} }
} }
val fs = project.serviceOf<FileSystemOperations>()
doLast { doLast {
subProjectTempRoot?.let { subProjectTempRoot?.let {
try { try {
fs.delete {
delete(it) delete(it)
}
} catch (e: Exception) { } catch (e: Exception) {
project.logger.warn("Can't delete test temp root folder $it", e.printStackTrace()) logger.warn("Can't delete test temp root folder $it", e.printStackTrace())
} }
} }
} }
@@ -202,7 +216,7 @@ fun Project.projectTest(
project.findProperty("kotlin.test.maxParallelForks")?.toString()?.toInt() project.findProperty("kotlin.test.maxParallelForks")?.toString()?.toInt()
?: (Runtime.getRuntime().availableProcessors() / if (kotlinBuildProperties.isTeamcityBuild) 2 else 4).coerceAtLeast(1) ?: (Runtime.getRuntime().availableProcessors() / if (kotlinBuildProperties.isTeamcityBuild) 2 else 4).coerceAtLeast(1)
} }
body() }.apply { configure(body) }
} }
private inline fun String.isFirstChar(f: (Char) -> Boolean) = isNotEmpty() && f(first()) private inline fun String.isFirstChar(f: (Char) -> Boolean) = isNotEmpty() && f(first())