Skip to content

Commit c415fbc

Browse files
committed
Integrate Plugin with Instrumented Test companion library through config
The new ProductFlavor function "junit5InstrumentedTestsEnabled" connects the RunnerBuilder to JUnit 5 to run instrumented tests through the companion library "android-instrumentation-test"
1 parent ef9c0fc commit c415fbc

File tree

11 files changed

+216
-25
lines changed

11 files changed

+216
-25
lines changed

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

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,4 +77,34 @@ class AGP2PluginSpec extends BasePluginSpec {
7777
def runAllTask = project.tasks.getByName("jacocoTestReport")
7878
expectedVariantTasks.each { assert runAllTask.getDependsOn().contains(it) }
7979
}
80+
81+
def "Instrumentation Test Integration: Works with Product Flavors"() {
82+
when:
83+
Project project = factory.newProject(rootProject())
84+
.asAndroidApplication()
85+
.applyJunit5Plugin()
86+
.build()
87+
88+
project.android {
89+
productFlavors {
90+
paid {
91+
junit5InstrumentedTestsEnabled false
92+
}
93+
free {
94+
junit5InstrumentedTestsEnabled true
95+
}
96+
}
97+
}
98+
99+
project.evaluate()
100+
101+
then:
102+
def enabledFlavor = project.android.productFlavors.getByName("free")
103+
def enabledArgs = enabledFlavor.getTestInstrumentationRunnerArguments()
104+
assert enabledArgs.containsKey("runnerBuilder")
105+
106+
def disabledFlavor = project.android.productFlavors.getByName("paid")
107+
def disabledArgs = disabledFlavor.getTestInstrumentationRunnerArguments()
108+
assert !disabledArgs.containsKey("runnerBuilder")
109+
}
80110
}

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

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,4 +143,39 @@ class AGP3PluginSpec extends BasePluginSpec {
143143
project.tasks.findByName("jacocoTestReportDebug") == null
144144
project.tasks.findByName("jacocoTestReportRelease") == null
145145
}
146+
147+
def "Instrumentation Test Integration: Works with Product Flavors"() {
148+
when:
149+
Project project = factory.newProject(rootProject())
150+
.asAndroidApplication()
151+
.applyJunit5Plugin()
152+
.build()
153+
154+
project.android {
155+
// "All flavors must now belong to a named flavor dimension"
156+
flavorDimensions "price"
157+
158+
productFlavors {
159+
paid {
160+
dimension "price"
161+
junit5InstrumentedTestsEnabled false
162+
}
163+
free {
164+
dimension "price"
165+
junit5InstrumentedTestsEnabled true
166+
}
167+
}
168+
}
169+
170+
project.evaluate()
171+
172+
then:
173+
def enabledFlavor = project.android.productFlavors.getByName("free")
174+
def enabledArgs = enabledFlavor.getTestInstrumentationRunnerArguments()
175+
assert enabledArgs.containsKey("runnerBuilder")
176+
177+
def disabledFlavor = project.android.productFlavors.getByName("paid")
178+
def disabledArgs = disabledFlavor.getTestInstrumentationRunnerArguments()
179+
assert !disabledArgs.containsKey("runnerBuilder")
180+
}
146181
}

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

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -440,4 +440,24 @@ abstract class BasePluginSpec extends Specification {
440440
project.tasks.findByName("jacocoTestReportDebug") == null
441441
project.tasks.findByName("jacocoTestReportRelease") == null
442442
}
443+
444+
def "Instrumentation Test Integration: Enabled"() {
445+
when:
446+
Project project = factory.newProject(rootProject())
447+
.asAndroidApplication()
448+
.applyJunit5Plugin()
449+
.build()
450+
451+
project.android {
452+
defaultConfig {
453+
junit5InstrumentedTestsEnabled true
454+
}
455+
}
456+
457+
project.evaluate()
458+
459+
then:
460+
def args = project.android.defaultConfig.getTestInstrumentationRunnerArguments()
461+
assert args.containsKey("runnerBuilder")
462+
}
443463
}

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

Lines changed: 0 additions & 11 deletions
This file was deleted.
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package de.mannodermaus.gradle.plugins.junit5
2+
3+
import org.junit.Test
4+
5+
class CallableGroovyTests {
6+
@Test
7+
void callable() {
8+
def obj = new Callable({ 2 + 2 })
9+
assert obj() == 4
10+
}
11+
12+
@Test
13+
void callable1() {
14+
def obj = new Callable1<Boolean, Integer>({ state -> 2 + (state ? 1 : 0) })
15+
assert obj(true) == 3
16+
assert obj(false) == 2
17+
}
18+
}

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

Lines changed: 0 additions & 11 deletions
This file was deleted.
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package de.mannodermaus.gradle.plugins.junit5
2+
3+
import org.junit.Test
4+
5+
class CallableKotlinTests {
6+
@Test
7+
fun callable() {
8+
val obj = Callable { 2 + 2 }
9+
assert(obj() == 4)
10+
}
11+
12+
@Test
13+
fun callable1() {
14+
val obj = Callable1<Boolean, Int> { state -> 2 + if (state) 1 else 0 }
15+
assert(obj(true) == 3)
16+
assert(obj(false) == 2)
17+
}
18+
}

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

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,3 +18,15 @@ const val JUNIT_PLATFORM_VERSION_PROP = "junitPlatformVersion"
1818
const val JUNIT_JUPITER_VERSION_PROP = "junitJupiterVersion"
1919
const val JUNIT_VINTAGE_VERSION_PROP = "junitVintageVersion"
2020
const val JUNIT4_VERSION_PROP = "junit4Version"
21+
22+
// Instrumentation Test integration
23+
const val RUNNER_BUILDER_ARG = "runnerBuilder"
24+
const val JUNIT5_RUNNER_BUILDER_CLASS_NAME = "de.mannodermaus.junit5.AndroidJUnit5Builder"
25+
26+
// Dependency Handler Names
27+
const val DEP_HANDLER_NAME_JUNIT5 = "junit5"
28+
const val DEP_HANDLER_NAME_PARAMETERIZED = "junit5Params"
29+
const val DEP_HANDLER_NAME_RUNTIME = "junit5EmbeddedRuntime"
30+
31+
// Configuration Names
32+
const val PARAM_NAME_ENABLE_INSTRUMENTED_TESTS = "junit5InstrumentedTestsEnabled"

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

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import com.android.build.gradle.BaseExtension
44
import com.android.build.gradle.api.BaseVariant
55
import com.android.build.gradle.api.UnitTestVariant
66
import com.android.build.gradle.internal.api.TestedVariant
7+
import com.android.builder.model.ProductFlavor
78
import de.mannodermaus.gradle.plugins.junit5.tasks.AndroidJUnit5JacocoReport
89
import de.mannodermaus.gradle.plugins.junit5.tasks.AndroidJUnit5UnitTest
910
import groovy.lang.Closure
@@ -135,6 +136,17 @@ val DependencyHandler.ext: ExtraPropertiesExtension
135136
ExtraPropertiesExtension.EXTENSION_NAME) as ExtraPropertiesExtension
136137
}
137138

139+
/**
140+
* Access the extra properties of a ProductFlavor.
141+
* Equivalent to "ProductFlavor#ext" in Groovy.
142+
*/
143+
val ProductFlavor.ext: ExtraPropertiesExtension
144+
get() {
145+
val aware = this as ExtensionAware
146+
return aware.extensions.getByName(
147+
ExtraPropertiesExtension.EXTENSION_NAME) as ExtraPropertiesExtension
148+
}
149+
138150
val BaseVariant.unitTestVariant: UnitTestVariant
139151
get() {
140152
if (this !is TestedVariant) {
@@ -205,3 +217,29 @@ class Callable(private val body: () -> Any) : Closure<Any>(null) {
205217
/** Groovy's call syntax */
206218
fun doCall(): Any = body()
207219
}
220+
221+
/**
222+
* Multi-language functional construct,
223+
* mapped to Groovy's dynamic Closures as well as Kotlin's invoke syntax.
224+
*
225+
* A [Callable] can be invoked with the short-hand
226+
* function syntax from both Kotlin & Groovy:
227+
*
228+
* <code><pre>
229+
* val callable = Callable { 2 + 2 }
230+
* val result = callable() // result == 4
231+
* </pre></code>
232+
*
233+
* <code><pre>
234+
* def callable = new Callable({ 2 + 2 })
235+
* def result = callable() // result == 4
236+
* </pre></code>
237+
*/
238+
@Suppress("unused")
239+
class Callable1<in T : Any, R>(private val body: (T) -> R) : Closure<R>(null) {
240+
/** Kotlin's call syntax */
241+
operator fun invoke(arg: T): R = body(arg)
242+
243+
/** Groovy's call syntax */
244+
fun doCall(arg: T): R = body(arg)
245+
}

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

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package de.mannodermaus.gradle.plugins.junit5
22

33
import com.android.build.gradle.api.BaseVariant
4+
import de.mannodermaus.gradle.plugins.junit5.integrations.attachInstrumentationTestSupport
45
import de.mannodermaus.gradle.plugins.junit5.providers.DirectoryProvider
56
import de.mannodermaus.gradle.plugins.junit5.providers.JavaDirectoryProvider
67
import de.mannodermaus.gradle.plugins.junit5.providers.KotlinDirectoryProvider
@@ -47,6 +48,9 @@ class AndroidJUnitPlatformPlugin : Plugin<Project> {
4748
}
4849
createExtension<AndroidJUnit5JacocoReport.Extension>(JACOCO_EXTENSION_NAME)
4950
}
51+
52+
// Connect with integration libraries
53+
attachInstrumentationTestSupport()
5054
}
5155

5256
private fun Project.configureDependencies() {
@@ -68,7 +72,7 @@ class AndroidJUnitPlatformPlugin : Plugin<Project> {
6872
}
6973

7074
// Create the dependency handlers for JUnit 5
71-
project.dependencies.ext["junit5"] = Callable {
75+
project.dependencies.ext[DEP_HANDLER_NAME_JUNIT5] = Callable {
7276
withDependencies(defaults) {
7377
listOf(
7478
it.others.junit4,
@@ -85,11 +89,11 @@ class AndroidJUnitPlatformPlugin : Plugin<Project> {
8589
}
8690
}
8791

88-
project.dependencies.ext["junit5Params"] = Callable {
92+
project.dependencies.ext[DEP_HANDLER_NAME_PARAMETERIZED] = Callable {
8993
withDependencies(defaults) { it.jupiter.params }
9094
}
9195

92-
project.dependencies.ext["junit5EmbeddedRuntime"] = Callable {
96+
project.dependencies.ext[DEP_HANDLER_NAME_RUNTIME] = Callable {
9397
withDependencies(defaults) { it.others.embeddedRuntime }
9498
}
9599
}

0 commit comments

Comments
 (0)