[Build] Make projectTest() extension compatible with configuration cache
Relates to #KT-44611
This commit is contained in:
@@ -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())
|
||||||
|
|||||||
Reference in New Issue
Block a user