Skip to content

Commit ec0010e

Browse files
committed
ci: derive android test lanes
1 parent 303f241 commit ec0010e

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
@@ -50,32 +50,47 @@ val e2eBackendEnv = System.getenv("E2E_BACKEND") ?: "local"
5050
val e2eHomegateUrlEnv = System.getenv("E2E_HOMEGATE_URL") ?: "http://127.0.0.1:6288"
5151
val trezorBridgeEnv = System.getenv("TREZOR_BRIDGE")?.toBoolean()?.toString() ?: "false"
5252
val trezorBridgeUrlEnv = System.getenv("TREZOR_BRIDGE_URL") ?: "http://10.0.2.2:21325"
53-
val coreServiceIntegrationTestAnnotation = "to.bitkit.test.annotations.CoreServiceIntegrationTest"
54-
val composeUiTestAnnotation = "to.bitkit.test.annotations.ComposeUiTest"
55-
val deviceIntegrationTestAnnotation = "to.bitkit.test.annotations.DeviceIntegrationTest"
56-
val deviceStorageIntegrationTestAnnotation = "to.bitkit.test.annotations.DeviceStorageIntegrationTest"
57-
val deviceUiIntegrationTestAnnotation = "to.bitkit.test.annotations.DeviceUiIntegrationTest"
58-
val requestedTaskNames = gradle.startParameter.taskNames.map { it.substringAfterLast(":") }
59-
val bitkitAndroidTestSuite = providers.gradleProperty("bitkitAndroidTestSuite").orNull
60-
val bitkitAndroidTestAnnotation = when {
61-
requestedTaskNames.any { it == "connectedDevDebugComposeAndroidTest" } -> composeUiTestAnnotation
62-
requestedTaskNames.any { it == "connectedDevDebugCoreServiceIntegrationAndroidTest" } -> {
63-
coreServiceIntegrationTestAnnotation
53+
val androidTestAnnotationPackage = "to.bitkit.test.annotations"
54+
val androidTestAnnotationSuffix = "AndroidTest"
55+
val androidTestTaskPrefix = "connectedDevDebug"
56+
val androidTestTaskSuffix = "AndroidTest"
57+
val androidTestAnnotationNames = file("src/androidTest/java/to/bitkit/test/annotations")
58+
.listFiles()
59+
?.mapNotNull { file ->
60+
file.nameWithoutExtension.takeIf {
61+
file.isFile &&
62+
file.extension == "kt" &&
63+
it.endsWith(androidTestAnnotationSuffix)
64+
}
6465
}
65-
requestedTaskNames.any { it == "connectedDevDebugDeviceStorageIntegrationAndroidTest" } -> {
66-
deviceStorageIntegrationTestAnnotation
66+
?.sorted()
67+
.orEmpty()
68+
val requestedTaskNames = gradle.startParameter.taskNames.map { it.substringAfterLast(":") }
69+
70+
fun androidTestTaskName(annotationName: String): String {
71+
val taskInfix = annotationName.removeSuffix(androidTestAnnotationSuffix)
72+
return "$androidTestTaskPrefix$taskInfix$androidTestTaskSuffix"
73+
}
74+
75+
val requestedAndroidTestAnnotation = providers.gradleProperty("bitkitAndroidTestAnnotation")
76+
.orNull
77+
?.trim()
78+
?.takeIf { it.isNotEmpty() }
79+
?.also {
80+
require('.' !in it) {
81+
"Use a simple Android test annotation name, e.g. 'DeviceUiIntegrationAndroidTest'."
82+
}
83+
require(it in androidTestAnnotationNames) {
84+
"Unsupported bitkitAndroidTestAnnotation '$it'. Supported annotations: " +
85+
androidTestAnnotationNames.joinToString(", ")
86+
}
6787
}
68-
requestedTaskNames.any { it == "connectedDevDebugDeviceUiIntegrationAndroidTest" } -> {
69-
deviceUiIntegrationTestAnnotation
88+
val bitkitAndroidTestAnnotationName = requestedAndroidTestAnnotation
89+
?: requestedTaskNames.firstNotNullOfOrNull { taskName ->
90+
androidTestAnnotationNames.firstOrNull { androidTestTaskName(it) == taskName }
7091
}
71-
requestedTaskNames.any { it == "connectedDevDebugDeviceIntegrationAndroidTest" } -> deviceIntegrationTestAnnotation
72-
bitkitAndroidTestSuite == "compose" -> composeUiTestAnnotation
73-
bitkitAndroidTestSuite == "core-service" -> coreServiceIntegrationTestAnnotation
74-
bitkitAndroidTestSuite == "device-storage" -> deviceStorageIntegrationTestAnnotation
75-
bitkitAndroidTestSuite == "device-ui" -> deviceUiIntegrationTestAnnotation
76-
bitkitAndroidTestSuite == "integration" -> deviceIntegrationTestAnnotation
77-
bitkitAndroidTestSuite == null -> null
78-
else -> error("Unsupported bitkitAndroidTestSuite '$bitkitAndroidTestSuite'")
92+
val bitkitAndroidTestAnnotation = bitkitAndroidTestAnnotationName?.let {
93+
"$androidTestAnnotationPackage.$it"
7994
}
8095

8196
android {
@@ -397,34 +412,12 @@ tasks.withType<Test>().configureEach {
397412
jvmArgs("-XX:+EnableDynamicAgentLoading")
398413
}
399414

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

430423
// 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)