Skip to content

Commit 03f7574

Browse files
author
Marcel Schnelle
authored
Manually include Kotlin class folders (#82)
* Extend KotlinDirectoryProvider to construct folders manually, if the Kotlin plugin is applied after JUnit 5
1 parent 631f27e commit 03f7574

File tree

3 files changed

+45
-3
lines changed
  • android-junit5-tests/src/test
  • android-junit5/src/main/kotlin/de/mannodermaus/gradle/plugins/junit5/providers

3 files changed

+45
-3
lines changed

android-junit5-tests/src/test/groovy/de/mannodermaus/gradle/plugins/junit5/FunctionalSpec.groovy

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -192,8 +192,8 @@ class FunctionalSpec extends Specification {
192192
def "Executes Kotlin tests in flavor-specific source set"() {
193193
given:
194194
androidPlugin(flavorNames: ["free"])
195-
kotlinPlugin()
196195
junit5Plugin()
196+
kotlinPlugin()
197197
javaFile()
198198
kotlinTest()
199199
kotlinTest("free", null)

android-junit5-tests/src/test/kotlin/de/mannodermaus/gradle/plugins/junit5/PluginSpec.kt

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,11 @@ import de.mannodermaus.gradle.plugins.junit5.internal.ConfigurationKind.ANDROID_
66
import de.mannodermaus.gradle.plugins.junit5.internal.ConfigurationScope.RUNTIME_ONLY
77
import de.mannodermaus.gradle.plugins.junit5.internal.android
88
import de.mannodermaus.gradle.plugins.junit5.internal.find
9+
import de.mannodermaus.gradle.plugins.junit5.providers.JavaDirectoryProvider
10+
import de.mannodermaus.gradle.plugins.junit5.providers.KotlinDirectoryProvider
911
import de.mannodermaus.gradle.plugins.junit5.tasks.AndroidJUnit5JacocoReport
1012
import de.mannodermaus.gradle.plugins.junit5.tasks.AndroidJUnit5UnitTest
13+
import de.mannodermaus.gradle.plugins.junit5.util.TaskUtils.argument
1114
import de.mannodermaus.gradle.plugins.junit5.util.TestEnvironment
1215
import de.mannodermaus.gradle.plugins.junit5.util.TestProjectFactory
1316
import de.mannodermaus.gradle.plugins.junit5.util.TestProjectFactory.TestProjectBuilder
@@ -505,6 +508,35 @@ class PluginSpec : Spek({
505508
}
506509
}
507510

511+
context("test folder detection") {
512+
// The order of applying the Kotlin plugin shouldn't interfere
513+
// with the detection of its source directories
514+
// (https://github.com/mannodermaus/android-junit5/issues/72)
515+
beforeEachTest { testProjectBuilder.applyKotlinPlugin() }
516+
517+
listOf("debug", "release").forEach { buildType ->
518+
519+
on("assembling the $buildType task") {
520+
val project = testProjectBuilder.buildAndEvaluate()
521+
val projectConfig = ProjectConfig(project)
522+
val task = project.tasks.get<AndroidJUnit5UnitTest>("junitPlatformTest${buildType.capitalize()}")
523+
val folders = argument(task, "--scan-class-path")?.split(":") ?: listOf()
524+
525+
val variant = projectConfig.unitTestVariants.find { it.name == buildType }
526+
require(variant != null)
527+
528+
listOf(
529+
JavaDirectoryProvider(variant!!),
530+
KotlinDirectoryProvider(project, variant)).forEach { provider ->
531+
532+
it("contains all class folders of the ${provider.javaClass.simpleName}") {
533+
assertThat(folders).containsAll(provider.classDirectories().map { it.absolutePath })
534+
}
535+
}
536+
}
537+
}
538+
}
539+
508540
context("jacoco integration") {
509541
beforeEachTest { testProjectBuilder.applyJacocoPlugin() }
510542

android-junit5/src/main/kotlin/de/mannodermaus/gradle/plugins/junit5/providers/Kotlin.kt

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,12 @@ package de.mannodermaus.gradle.plugins.junit5.providers
22

33
import com.android.build.gradle.api.BaseVariant
44
import com.android.builder.model.SourceProvider
5+
import de.mannodermaus.gradle.plugins.junit5.internal.agpLog
56
import de.mannodermaus.gradle.plugins.junit5.internal.unitTestVariant
67
import org.gradle.api.Project
78
import org.gradle.api.file.SourceDirectorySet
89
import org.gradle.api.internal.HasConvention
10+
import org.gradle.api.logging.LogLevel.WARN
911
import org.jetbrains.kotlin.gradle.plugin.KOTLIN_DSL_NAME
1012
import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet
1113
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
@@ -34,8 +36,16 @@ class KotlinDirectoryProvider(
3436
.toSet()
3537

3638
private fun classFoldersOf(variant: BaseVariant): Set<File> {
37-
val kotlinTask = project.tasks.findByName(variant.kotlinTaskName) ?: return emptySet()
38-
return setOf((kotlinTask as KotlinCompile).destinationDir)
39+
val kotlinTask = project.tasks.findByName(variant.kotlinTaskName)
40+
return if (kotlinTask != null) {
41+
// Read folder directly from the Kotlin task
42+
setOf((kotlinTask as KotlinCompile).destinationDir)
43+
} else {
44+
// If the Kotlin plugin is applied _after_ JUnit 5 in the build file,
45+
// fall back to the expected path… However, make sure to log a warning to users!
46+
project.logger.agpLog(WARN, "The kotlin-android plugin is currently applied after android-junit5! To guarantee full compatibility, please declare it above the JUnit 5 plugin.")
47+
setOf(File(project.buildDir, "tmp/kotlin-classes/${variant.name}"))
48+
}
3949
}
4050
}
4151

0 commit comments

Comments
 (0)