Skip to content

Commit f70a69f

Browse files
committed
ci: derive android test lanes
1 parent af630ed commit f70a69f

29 files changed

Lines changed: 113 additions & 137 deletions

.github/workflows/ui-tests.yml

Lines changed: 6 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -120,29 +120,12 @@ jobs:
120120
121121
IFS=',' read -ra requested_suites <<< "$suites"
122122
for suite in "${requested_suites[@]}"; do
123-
case "$suite" in
124-
ComposeUiTest)
125-
task="connectedDevDebugComposeAndroidTest"
126-
;;
127-
DeviceIntegrationTest)
128-
task="connectedDevDebugDeviceIntegrationAndroidTest"
129-
;;
130-
CoreServiceIntegrationTest)
131-
task="connectedDevDebugCoreServiceIntegrationAndroidTest"
132-
;;
133-
DeviceStorageIntegrationTest)
134-
task="connectedDevDebugDeviceStorageIntegrationAndroidTest"
135-
;;
136-
DeviceUiIntegrationTest)
137-
task="connectedDevDebugDeviceUiIntegrationAndroidTest"
138-
;;
139-
*)
140-
echo "::error::Unknown Android test annotation '$suite'. Use all, ComposeUiTest, DeviceIntegrationTest, CoreServiceIntegrationTest, DeviceStorageIntegrationTest, or DeviceUiIntegrationTest."
141-
exit 1
142-
;;
143-
esac
144-
145-
./gradlew "$task"
123+
if [[ "$suite" == *.* || ! "$suite" =~ ^[A-Z][A-Za-z0-9]*AndroidTest$ ]]; then
124+
echo "::error::Invalid Android test annotation '$suite'. Use all or comma-separated simple annotation names such as DeviceUiIntegrationAndroidTest."
125+
exit 1
126+
fi
127+
128+
./gradlew connectedDevDebugAndroidTest -PbitkitAndroidTestAnnotation="$suite"
146129
done
147130
148131
- name: Upload UI test report

app/build.gradle.kts

Lines changed: 44 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -48,32 +48,47 @@ val bcp47Locales = listOf(
4848
)
4949
val e2eBackendEnv = System.getenv("E2E_BACKEND") ?: "local"
5050
val e2eHomegateUrlEnv = System.getenv("E2E_HOMEGATE_URL") ?: "http://127.0.0.1:6288"
51-
val coreServiceIntegrationTestAnnotation = "to.bitkit.test.annotations.CoreServiceIntegrationTest"
52-
val composeUiTestAnnotation = "to.bitkit.test.annotations.ComposeUiTest"
53-
val deviceIntegrationTestAnnotation = "to.bitkit.test.annotations.DeviceIntegrationTest"
54-
val deviceStorageIntegrationTestAnnotation = "to.bitkit.test.annotations.DeviceStorageIntegrationTest"
55-
val deviceUiIntegrationTestAnnotation = "to.bitkit.test.annotations.DeviceUiIntegrationTest"
56-
val requestedTaskNames = gradle.startParameter.taskNames.map { it.substringAfterLast(":") }
57-
val bitkitAndroidTestSuite = providers.gradleProperty("bitkitAndroidTestSuite").orNull
58-
val bitkitAndroidTestAnnotation = when {
59-
requestedTaskNames.any { it == "connectedDevDebugComposeAndroidTest" } -> composeUiTestAnnotation
60-
requestedTaskNames.any { it == "connectedDevDebugCoreServiceIntegrationAndroidTest" } -> {
61-
coreServiceIntegrationTestAnnotation
51+
val androidTestAnnotationPackage = "to.bitkit.test.annotations"
52+
val androidTestAnnotationSuffix = "AndroidTest"
53+
val androidTestTaskPrefix = "connectedDevDebug"
54+
val androidTestTaskSuffix = "AndroidTest"
55+
val androidTestAnnotationNames = file("src/androidTest/java/to/bitkit/test/annotations")
56+
.listFiles()
57+
?.mapNotNull { file ->
58+
file.nameWithoutExtension.takeIf {
59+
file.isFile &&
60+
file.extension == "kt" &&
61+
it.endsWith(androidTestAnnotationSuffix)
62+
}
6263
}
63-
requestedTaskNames.any { it == "connectedDevDebugDeviceStorageIntegrationAndroidTest" } -> {
64-
deviceStorageIntegrationTestAnnotation
64+
?.sorted()
65+
.orEmpty()
66+
val requestedTaskNames = gradle.startParameter.taskNames.map { it.substringAfterLast(":") }
67+
68+
fun androidTestTaskName(annotationName: String): String {
69+
val taskInfix = annotationName.removeSuffix(androidTestAnnotationSuffix)
70+
return "$androidTestTaskPrefix$taskInfix$androidTestTaskSuffix"
71+
}
72+
73+
val requestedAndroidTestAnnotation = providers.gradleProperty("bitkitAndroidTestAnnotation")
74+
.orNull
75+
?.trim()
76+
?.takeIf { it.isNotEmpty() }
77+
?.also {
78+
require('.' !in it) {
79+
"Use a simple Android test annotation name, e.g. 'DeviceUiIntegrationAndroidTest'."
80+
}
81+
require(it in androidTestAnnotationNames) {
82+
"Unsupported bitkitAndroidTestAnnotation '$it'. Supported annotations: " +
83+
androidTestAnnotationNames.joinToString(", ")
84+
}
6585
}
66-
requestedTaskNames.any { it == "connectedDevDebugDeviceUiIntegrationAndroidTest" } -> {
67-
deviceUiIntegrationTestAnnotation
86+
val bitkitAndroidTestAnnotationName = requestedAndroidTestAnnotation
87+
?: requestedTaskNames.firstNotNullOfOrNull { taskName ->
88+
androidTestAnnotationNames.firstOrNull { androidTestTaskName(it) == taskName }
6889
}
69-
requestedTaskNames.any { it == "connectedDevDebugDeviceIntegrationAndroidTest" } -> deviceIntegrationTestAnnotation
70-
bitkitAndroidTestSuite == "compose" -> composeUiTestAnnotation
71-
bitkitAndroidTestSuite == "core-service" -> coreServiceIntegrationTestAnnotation
72-
bitkitAndroidTestSuite == "device-storage" -> deviceStorageIntegrationTestAnnotation
73-
bitkitAndroidTestSuite == "device-ui" -> deviceUiIntegrationTestAnnotation
74-
bitkitAndroidTestSuite == "integration" -> deviceIntegrationTestAnnotation
75-
bitkitAndroidTestSuite == null -> null
76-
else -> error("Unsupported bitkitAndroidTestSuite '$bitkitAndroidTestSuite'")
90+
val bitkitAndroidTestAnnotation = bitkitAndroidTestAnnotationName?.let {
91+
"$androidTestAnnotationPackage.$it"
7792
}
7893

7994
android {
@@ -393,34 +408,12 @@ tasks.withType<Test>().configureEach {
393408
jvmArgs("-XX:+EnableDynamicAgentLoading")
394409
}
395410

396-
tasks.register("connectedDevDebugComposeAndroidTest") {
397-
group = "verification"
398-
description = "Runs devDebug Android tests annotated as Compose UI tests."
399-
dependsOn("connectedDevDebugAndroidTest")
400-
}
401-
402-
tasks.register("connectedDevDebugDeviceIntegrationAndroidTest") {
403-
group = "verification"
404-
description = "Runs devDebug Android tests annotated as device integration tests."
405-
dependsOn("connectedDevDebugAndroidTest")
406-
}
407-
408-
tasks.register("connectedDevDebugCoreServiceIntegrationAndroidTest") {
409-
group = "verification"
410-
description = "Runs devDebug Android tests annotated as core service integration tests."
411-
dependsOn("connectedDevDebugAndroidTest")
412-
}
413-
414-
tasks.register("connectedDevDebugDeviceStorageIntegrationAndroidTest") {
415-
group = "verification"
416-
description = "Runs devDebug Android tests annotated as device storage integration tests."
417-
dependsOn("connectedDevDebugAndroidTest")
418-
}
419-
420-
tasks.register("connectedDevDebugDeviceUiIntegrationAndroidTest") {
421-
group = "verification"
422-
description = "Runs devDebug Android tests annotated as device UI integration tests."
423-
dependsOn("connectedDevDebugAndroidTest")
411+
androidTestAnnotationNames.forEach { annotationName ->
412+
tasks.register(androidTestTaskName(annotationName)) {
413+
group = "verification"
414+
description = "Runs devDebug Android tests annotated with '$annotationName'."
415+
dependsOn("connectedDevDebugAndroidTest")
416+
}
424417
}
425418

426419
// endregion

app/src/androidTest/java/to/bitkit/data/keychain/KeychainTest.kt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,16 +14,16 @@ import org.junit.runner.RunWith
1414
import to.bitkit.data.AppDb
1515
import to.bitkit.data.entities.ConfigEntity
1616
import to.bitkit.test.BaseAndroidTest
17-
import to.bitkit.test.annotations.DeviceIntegrationTest
18-
import to.bitkit.test.annotations.DeviceStorageIntegrationTest
17+
import to.bitkit.test.annotations.DeviceIntegrationAndroidTest
18+
import to.bitkit.test.annotations.DeviceStorageIntegrationAndroidTest
1919
import kotlin.test.assertEquals
2020
import kotlin.test.assertFailsWith
2121
import kotlin.test.assertNull
2222
import kotlin.test.assertTrue
2323

2424
@RunWith(AndroidJUnit4::class)
25-
@DeviceIntegrationTest
26-
@DeviceStorageIntegrationTest
25+
@DeviceIntegrationAndroidTest
26+
@DeviceStorageIntegrationAndroidTest
2727
class KeychainTest : BaseAndroidTest() {
2828

2929
private val appContext by lazy { ApplicationProvider.getApplicationContext<Context>() }

app/src/androidTest/java/to/bitkit/services/BlocktankTest.kt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,17 +15,17 @@ import org.junit.Before
1515
import org.junit.Rule
1616
import org.junit.Test
1717
import to.bitkit.env.Env
18-
import to.bitkit.test.annotations.CoreServiceIntegrationTest
19-
import to.bitkit.test.annotations.DeviceIntegrationTest
18+
import to.bitkit.test.annotations.CoreServiceIntegrationAndroidTest
19+
import to.bitkit.test.annotations.DeviceIntegrationAndroidTest
2020
import javax.inject.Inject
2121
import kotlin.test.assertEquals
2222
import kotlin.test.assertNotEquals
2323
import kotlin.test.assertNotNull
2424
import kotlin.test.assertTrue
2525

2626
@HiltAndroidTest
27-
@DeviceIntegrationTest
28-
@CoreServiceIntegrationTest
27+
@DeviceIntegrationAndroidTest
28+
@CoreServiceIntegrationAndroidTest
2929
class BlocktankTest {
3030
@get:Rule
3131
var hiltRule = HiltAndroidRule(this)

app/src/androidTest/java/to/bitkit/services/OnchainServiceTests.kt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,15 @@ import org.junit.Test
88
import org.junit.runner.RunWith
99
import org.lightningdevkit.ldknode.Network
1010
import to.bitkit.models.toDerivationPath
11-
import to.bitkit.test.annotations.CoreServiceIntegrationTest
12-
import to.bitkit.test.annotations.DeviceIntegrationTest
11+
import to.bitkit.test.annotations.CoreServiceIntegrationAndroidTest
12+
import to.bitkit.test.annotations.DeviceIntegrationAndroidTest
1313
import kotlin.test.assertEquals
1414
import kotlin.test.assertNotNull
1515
import kotlin.test.assertTrue
1616

1717
@RunWith(AndroidJUnit4::class)
18-
@DeviceIntegrationTest
19-
@CoreServiceIntegrationTest
18+
@DeviceIntegrationAndroidTest
19+
@CoreServiceIntegrationAndroidTest
2020
class OnchainServiceTests {
2121
private lateinit var onchainService: OnchainService
2222

app/src/androidTest/java/to/bitkit/services/RoutingFeeEstimationTest.kt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,8 @@ import to.bitkit.data.CacheStore
1818
import to.bitkit.data.keychain.Keychain
1919
import to.bitkit.env.Env
2020
import to.bitkit.repositories.WalletRepo
21-
import to.bitkit.test.annotations.CoreServiceIntegrationTest
22-
import to.bitkit.test.annotations.DeviceIntegrationTest
21+
import to.bitkit.test.annotations.CoreServiceIntegrationAndroidTest
22+
import to.bitkit.test.annotations.DeviceIntegrationAndroidTest
2323
import to.bitkit.utils.LdkError
2424
import javax.inject.Inject
2525
import kotlin.test.assertEquals
@@ -29,8 +29,8 @@ import kotlin.test.assertTrue
2929

3030
@HiltAndroidTest
3131
@RunWith(AndroidJUnit4::class)
32-
@DeviceIntegrationTest
33-
@CoreServiceIntegrationTest
32+
@DeviceIntegrationAndroidTest
33+
@CoreServiceIntegrationAndroidTest
3434
class RoutingFeeEstimationTest {
3535

3636
companion object {

app/src/androidTest/java/to/bitkit/services/TxBumpingTests.kt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,8 @@ import org.junit.runner.RunWith
1515
import to.bitkit.data.keychain.Keychain
1616
import to.bitkit.env.Env
1717
import to.bitkit.repositories.WalletRepo
18-
import to.bitkit.test.annotations.CoreServiceIntegrationTest
19-
import to.bitkit.test.annotations.DeviceIntegrationTest
18+
import to.bitkit.test.annotations.CoreServiceIntegrationAndroidTest
19+
import to.bitkit.test.annotations.DeviceIntegrationAndroidTest
2020
import javax.inject.Inject
2121
import kotlin.test.assertEquals
2222
import kotlin.test.assertFalse
@@ -25,8 +25,8 @@ import kotlin.test.assertTrue
2525

2626
@HiltAndroidTest
2727
@RunWith(AndroidJUnit4::class)
28-
@DeviceIntegrationTest
29-
@CoreServiceIntegrationTest
28+
@DeviceIntegrationAndroidTest
29+
@CoreServiceIntegrationAndroidTest
3030
class TxBumpingTests {
3131

3232
@get:Rule

app/src/androidTest/java/to/bitkit/services/UtxoSelectionTests.kt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,8 @@ import org.lightningdevkit.ldknode.CoinSelectionAlgorithm
1616
import to.bitkit.data.keychain.Keychain
1717
import to.bitkit.env.Env
1818
import to.bitkit.repositories.WalletRepo
19-
import to.bitkit.test.annotations.CoreServiceIntegrationTest
20-
import to.bitkit.test.annotations.DeviceIntegrationTest
19+
import to.bitkit.test.annotations.CoreServiceIntegrationAndroidTest
20+
import to.bitkit.test.annotations.DeviceIntegrationAndroidTest
2121
import javax.inject.Inject
2222
import kotlin.test.assertEquals
2323
import kotlin.test.assertFalse
@@ -27,8 +27,8 @@ import kotlin.test.fail
2727

2828
@HiltAndroidTest
2929
@RunWith(AndroidJUnit4::class)
30-
@DeviceIntegrationTest
31-
@CoreServiceIntegrationTest
30+
@DeviceIntegrationAndroidTest
31+
@CoreServiceIntegrationAndroidTest
3232
class UtxoSelectionTests {
3333

3434
@get:Rule

app/src/androidTest/java/to/bitkit/test/annotations/ComposeUiTest.kt renamed to app/src/androidTest/java/to/bitkit/test/annotations/ComposeUiAndroidTest.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,4 @@ package to.bitkit.test.annotations
22

33
@Retention(AnnotationRetention.RUNTIME)
44
@Target(AnnotationTarget.CLASS, AnnotationTarget.FUNCTION)
5-
annotation class ComposeUiTest
5+
annotation class ComposeUiAndroidTest

app/src/androidTest/java/to/bitkit/test/annotations/DeviceStorageIntegrationTest.kt renamed to app/src/androidTest/java/to/bitkit/test/annotations/CoreServiceIntegrationAndroidTest.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,4 @@ package to.bitkit.test.annotations
22

33
@Retention(AnnotationRetention.RUNTIME)
44
@Target(AnnotationTarget.CLASS, AnnotationTarget.FUNCTION)
5-
annotation class DeviceStorageIntegrationTest
5+
annotation class CoreServiceIntegrationAndroidTest

0 commit comments

Comments
 (0)