Skip to content

Commit e396da1

Browse files
committed
Add unit tests for write-filters task & fix a bug with generating the filters file for instrumentation tests
1 parent 9819a6c commit e396da1

File tree

5 files changed

+126
-6
lines changed

5 files changed

+126
-6
lines changed

plugin/android-junit5/src/main/kotlin/de/mannodermaus/gradle/plugins/junit5/tasks/AndroidJUnit5WriteFilters.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -83,8 +83,8 @@ public abstract class AndroidJUnit5WriteFilters : DefaultTask() {
8383
.bufferedWriter()
8484
.use { writer ->
8585
// This format is a nod towards the real JUnit 5 ConsoleLauncher's arguments
86-
includeTags.forEach { tag -> writer.write("-t $tag") }
87-
excludeTags.forEach { tag -> writer.write("-T $tag") }
86+
includeTags.forEach { tag -> writer.appendLine("-t $tag") }
87+
excludeTags.forEach { tag -> writer.appendLine("-T $tag") }
8888
}
8989
}
9090
}

plugin/android-junit5/src/test/kotlin/de/mannodermaus/gradle/plugins/junit5/plugin/InstrumentationSupportTests.kt

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,16 @@ class InstrumentationSupportTests {
165165
assertThat(project).configuration("androidTestRuntimeOnly").hasDependency(runnerLibrary())
166166
}
167167

168+
@Test
169+
fun `register the filter-write tasks`() {
170+
project.addJUnitJupiterApi()
171+
project.evaluate()
172+
173+
// AGP only registers androidTest tasks for the debug build type
174+
assertThat(project).task("writeFiltersDebugAndroidTest").exists()
175+
assertThat(project).task("writeFiltersReleaseAndroidTest").doesNotExist()
176+
}
177+
168178
/* Private */
169179

170180
private fun Project.addJUnitJupiterApi() {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
package de.mannodermaus.gradle.plugins.junit5.tasks
2+
3+
import com.google.common.truth.Truth.assertThat
4+
import de.mannodermaus.gradle.plugins.junit5.internal.config.INSTRUMENTATION_FILTER_RES_FILE_NAME
5+
import de.mannodermaus.gradle.plugins.junit5.plugin.TestProjectProviderExtension
6+
import de.mannodermaus.gradle.plugins.junit5.util.assertAll
7+
import de.mannodermaus.gradle.plugins.junit5.util.evaluate
8+
import org.gradle.api.Project
9+
import org.junit.jupiter.api.BeforeEach
10+
import org.junit.jupiter.api.Test
11+
import org.junit.jupiter.api.extension.RegisterExtension
12+
import java.io.File
13+
import java.nio.file.Paths
14+
import kotlin.io.path.readLines
15+
16+
class AndroidJUnit5WriteFiltersTests {
17+
@RegisterExtension
18+
@JvmField
19+
val projectExtension = TestProjectProviderExtension()
20+
21+
private lateinit var project: Project
22+
23+
@BeforeEach
24+
fun beforeEach() {
25+
project = projectExtension.newProject()
26+
.asAndroidApplication()
27+
.applyJUnit5Plugin(true) { junitPlatform ->
28+
junitPlatform.filters().includeTags("included")
29+
junitPlatform.filters().excludeTags("excluded", "another-group")
30+
}
31+
.build()
32+
project.evaluate()
33+
}
34+
35+
@Test
36+
fun `generates file structure correctly`() {
37+
// Expect a 'raw' folder inside the output, then the actual filters file in that sub-folder
38+
val output = project.runTaskAndGetOutputFolder()
39+
40+
File(output, "raw").apply {
41+
assertAll(
42+
"output contains 'raw' folder",
43+
{ assertThat(exists()).isTrue() },
44+
{ assertThat(isDirectory).isTrue() },
45+
)
46+
47+
File(this, INSTRUMENTATION_FILTER_RES_FILE_NAME).apply {
48+
assertAll(
49+
"'raw' folder contains filters file'",
50+
{ assertThat(exists()).isTrue() },
51+
{ assertThat(isFile).isTrue() },
52+
)
53+
}
54+
}
55+
}
56+
57+
@Test
58+
fun `file contains expected content`() {
59+
val output = project.runTaskAndGetOutputFolder()
60+
val file = Paths.get(output.absolutePath, "raw", INSTRUMENTATION_FILTER_RES_FILE_NAME)
61+
62+
val content = file.readLines()
63+
assertThat(content).containsExactly(
64+
"-t included",
65+
"-T excluded",
66+
"-T another-group",
67+
)
68+
}
69+
70+
/* Private */
71+
72+
private fun Project.runTaskAndGetOutputFolder(): File {
73+
val task = project.tasks.getByName("writeFiltersDebugAndroidTest") as AndroidJUnit5WriteFilters
74+
task.execute()
75+
return requireNotNull(task.outputFolder)
76+
}
77+
}

plugin/android-junit5/src/test/kotlin/de/mannodermaus/gradle/plugins/junit5/util/GradleTruth.kt

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,10 @@ package de.mannodermaus.gradle.plugins.junit5.util
33
import com.google.common.truth.FailureMetadata
44
import com.google.common.truth.Subject
55
import com.google.common.truth.Truth
6+
import com.google.common.truth.Truth.assertThat
67
import com.google.common.truth.Truth.assertWithMessage
78
import org.gradle.api.Project
9+
import org.gradle.api.Task
810
import org.gradle.api.artifacts.Configuration
911

1012
/* Methods */
@@ -22,6 +24,10 @@ class ProjectSubject(
2224
fun configuration(name: String): ConfigurationSubject = check("configuration()")
2325
.about(::ConfigurationSubject)
2426
.that(actual?.configurations?.getByName(name))
27+
28+
fun task(name: String): TaskSubject = check("task()")
29+
.about(::TaskSubject)
30+
.that(actual?.tasks?.findByName(name))
2531
}
2632

2733
class ConfigurationSubject(
@@ -66,3 +72,16 @@ class ConfigurationSubject(
6672
).that(hasMatch).isEqualTo(expectExists)
6773
}
6874
}
75+
76+
class TaskSubject(
77+
metadata: FailureMetadata,
78+
private val actual: Task?,
79+
) : Subject(metadata, actual) {
80+
fun exists() {
81+
assertThat(actual).isNotNull()
82+
}
83+
84+
fun doesNotExist() {
85+
assertThat(actual).isNull()
86+
}
87+
}

plugin/android-junit5/src/test/kotlin/de/mannodermaus/gradle/plugins/junit5/util/projects/PluginSpecProjectCreator.kt

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package de.mannodermaus.gradle.plugins.junit5.util.projects
22

3+
import de.mannodermaus.gradle.plugins.junit5.dsl.AndroidJUnitPlatformExtension
34
import de.mannodermaus.gradle.plugins.junit5.internal.extensions.android
5+
import de.mannodermaus.gradle.plugins.junit5.internal.extensions.junitPlatform
46
import de.mannodermaus.gradle.plugins.junit5.util.TestEnvironment
57
import de.mannodermaus.gradle.plugins.junit5.util.applyPlugin
68
import de.mannodermaus.gradle.plugins.junit5.util.evaluate
@@ -40,7 +42,7 @@ class PluginSpecProjectCreator(private val environment: TestEnvironment) {
4042

4143
private var projectType = Type.Unset
4244
private var appId = "com.example.android"
43-
private var applyJUnit5Plugin = true
45+
private var applyJUnit5Plugin: ((AndroidJUnitPlatformExtension) -> Unit)? = {}
4446
private var applyJacocoPlugin = false
4547
private var applyKotlinPlugin = false
4648

@@ -60,8 +62,12 @@ class PluginSpecProjectCreator(private val environment: TestEnvironment) {
6062

6163
fun asAndroidLibrary() = setProjectTypeIfUnsetTo(Type.Library)
6264

63-
fun applyJUnit5Plugin(state: Boolean = true) = apply {
64-
this.applyJUnit5Plugin = state
65+
fun applyJUnit5Plugin(state: Boolean = true, configuration: ((AndroidJUnitPlatformExtension) -> Unit)? = null) = apply {
66+
this.applyJUnit5Plugin = if (state) {
67+
configuration ?: {}
68+
} else {
69+
null
70+
}
6571
}
6672

6773
fun applyJacocoPlugin(state: Boolean = true) = apply {
@@ -93,7 +99,7 @@ class PluginSpecProjectCreator(private val environment: TestEnvironment) {
9399
project.applyPlugin("kotlin-android")
94100
}
95101

96-
if (applyJUnit5Plugin) {
102+
if (applyJUnit5Plugin != null) {
97103
project.applyPlugin("de.mannodermaus.android-junit5")
98104
}
99105

@@ -116,6 +122,14 @@ class PluginSpecProjectCreator(private val environment: TestEnvironment) {
116122
// swallow this particular error
117123
}
118124

125+
// Configure JUnit 5 with custom configuration clause, if any
126+
try {
127+
applyJUnit5Plugin?.invoke(project.junitPlatform)
128+
} catch (e: UnknownDomainObjectException) {
129+
// Expected when the JUnit 5 plugin is not applied to a project;
130+
// swallow this particular error
131+
}
132+
119133
return project
120134
}
121135

0 commit comments

Comments
 (0)