From 8ddf419be597d819dc7863ffce0e2baf6a08734e Mon Sep 17 00:00:00 2001 From: Dmitriy Novozhilov Date: Tue, 8 Dec 2020 11:24:07 +0300 Subject: [PATCH] [Build] Fix gradle tests filter for JUnit 5 There is an a optimization in our `projectTest` config which filters out some compiled test classes if they didn't contain specified test (if user ran :test task with --tests flag). This optimization for one tests left only one .class file which contains test. But JUnit 5 for tests in inner classes (with @Nested annotation) requires not only target class, but and all it's containers Test: package.SomeTest$Nested.testMethod JUnit4: package/SomeTest$Nested.class JUnit5: - package/SomeTest.class - package/SomeTest$Nested.class --- buildSrc/src/main/kotlin/tasks.kt | 26 ++++++++++++++++++---- compiler/tests-common-new/build.gradle.kts | 2 +- 2 files changed, 23 insertions(+), 5 deletions(-) diff --git a/buildSrc/src/main/kotlin/tasks.kt b/buildSrc/src/main/kotlin/tasks.kt index 69ad840581a..efce0a21d66 100644 --- a/buildSrc/src/main/kotlin/tasks.kt +++ b/buildSrc/src/main/kotlin/tasks.kt @@ -76,6 +76,7 @@ fun Project.projectTest( taskName: String = "test", parallel: Boolean = false, shortenTempRootName: Boolean = false, + jUnit5Enabled: Boolean = false, body: Test.() -> Unit = {} ): TaskProvider = getOrCreateTask(taskName) { doFirst { @@ -109,12 +110,29 @@ fun Project.projectTest( } } - include { - val path = it.path - if (it.isDirectory) { + val parentNames = if (jUnit5Enabled) { + /* + * If we run test from inner test class with junit 5 we need + * to include all containing classes of our class + */ + val nestedNames = classFileNameWithoutExtension.split("$") + mutableListOf(nestedNames.first()).also { + for (s in nestedNames.subList(1, nestedNames.size)) { + it += "${it.last()}\$$s" + } + } + } else emptyList() + + include { treeElement -> + val path = treeElement.path + if (treeElement.isDirectory) { classFileNameWithoutExtension.startsWith(path) } else { - path == classFileName || (path.endsWith(".class") && path.startsWith("$classFileNameWithoutExtension$")) + if (jUnit5Enabled) { + path == classFileName || (path.endsWith(".class") && parentNames.any { path.startsWith(it) }) + } else { + path == classFileName || (path.endsWith(".class") && path.startsWith("$classFileNameWithoutExtension$")) + } } } } diff --git a/compiler/tests-common-new/build.gradle.kts b/compiler/tests-common-new/build.gradle.kts index c49bba60ea1..092fae7b00d 100644 --- a/compiler/tests-common-new/build.gradle.kts +++ b/compiler/tests-common-new/build.gradle.kts @@ -54,7 +54,7 @@ if (kotlinBuildProperties.isInJpsBuildIdeaSync) { } } -projectTest(parallel = true) { +projectTest(parallel = true, jUnit5Enabled = true) { dependsOn(":dist") workingDir = rootDir jvmArgs!!.removeIf { it.contains("-Xmx") } -- GitLab