From 7b23110cacb72801afdca9b2074842cb23570b3f Mon Sep 17 00:00:00 2001 From: Greyson Parrelli Date: Wed, 27 May 2026 11:16:52 -0400 Subject: [PATCH] Improve instrumentation setup. --- app/build.gradle.kts | 30 ++++++++----------- ...SignalInstrumentationApplicationContext.kt | 7 +++++ app/src/instrumentation/AndroidManifest.xml | 13 -------- .../res/mipmap-anydpi-v26/ic_launcher.xml | 5 ---- .../instrumentation/res/values/strings.xml | 4 --- .../securesms/util/Environment.kt | 4 ++- build.gradle.kts | 2 +- 7 files changed, 23 insertions(+), 42 deletions(-) delete mode 100644 app/src/instrumentation/AndroidManifest.xml delete mode 100644 app/src/instrumentation/res/mipmap-anydpi-v26/ic_launcher.xml delete mode 100644 app/src/instrumentation/res/values/strings.xml diff --git a/app/build.gradle.kts b/app/build.gradle.kts index afb6f206e4..fea2e797dd 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -56,6 +56,11 @@ val localProperties: Properties? = if (localPropertiesFile.exists()) { val quickstartCredentialsDir: String? = localProperties?.getProperty("quickstart.credentials.dir") val benchmarkBackupFile: String? = localProperties?.getProperty("benchmark.backup.file") +val isInstrumentationTestRun = gradle.startParameter.taskNames.any { taskName -> + val lower = taskName.lowercase() + lower.contains("androidtest") || lower.contains("connectedcheck") +} + val selectableVariants = listOf( "nightlyProdSpinner", "nightlyProdPerf", @@ -68,13 +73,11 @@ val selectableVariants = listOf( "playProdMocked", "playProdNonMinifiedMocked", "playProdBenchmark", - "playProdInstrumentation", "playProdRelease", "playStagingDebug", "playStagingCanary", "playStagingSpinner", "playStagingPerf", - "playStagingInstrumentation", "playStagingRelease", "playProdQuickstart", "playStagingQuickstart", @@ -132,7 +135,6 @@ android { ndkVersion = libs.versions.ndk.get() flavorDimensions += listOf("distribution", "environment") - testBuildType = "instrumentation" android.bundle.language.enableSplit = false @@ -219,6 +221,10 @@ android { versionCode = (canonicalVersionCode * maxHotfixVersions) + possibleHotfixVersions[currentHotfixVersion] versionName = canonicalVersionName + if (isInstrumentationTestRun) { + applicationIdSuffix = ".test_run" + } + minSdk = libs.versions.minSdk.get().toInt() targetSdk = libs.versions.targetSdk.get().toInt() @@ -344,18 +350,6 @@ android { buildConfigField("String", "BUILD_VARIANT_TYPE", "\"Release\"") } - create("instrumentation") { - initWith(getByName("debug")) - isDefault = false - isMinifyEnabled = false - matchingFallbacks += "debug" - applicationIdSuffix = ".instrumentation" - - buildConfigField("String", "BUILD_VARIANT_TYPE", "\"Instrumentation\"") - buildConfigField("String", "STRIPE_BASE_URL", "\"http://127.0.0.1:8080/stripe\"") - buildConfigField("String[]", "UNIDENTIFIED_SENDER_TRUST_ROOTS", "new String[]{ \"BVT/2gHqbrG1xzuIypLIOjFgMtihrMld1/5TGADL6Dhv\"}") - } - create("spinner") { initWith(getByName("debug")) isDefault = false @@ -538,8 +532,8 @@ androidComponents { transformationRequest.set(renameRequest) } - // Include the test-only library on debug builds. - if (variant.buildType != "instrumentation") { + // Include the test-only library on non-release builds. + if (variant.buildType == "release") { variant.packaging.jniLibs.excludes.add("**/libsignal_jni_testing.so") variant.androidResources.ignoreAssetsPatterns.add("libsignal-testing.md") } @@ -749,7 +743,7 @@ dependencies { "canaryImplementation"(libs.square.leakcanary) - "instrumentationImplementation"(libs.androidx.fragment.testing) { + androidTestImplementation(libs.androidx.fragment.testing) { exclude(group = "androidx.test", module = "core") } diff --git a/app/src/androidTest/java/org/thoughtcrime/securesms/SignalInstrumentationApplicationContext.kt b/app/src/androidTest/java/org/thoughtcrime/securesms/SignalInstrumentationApplicationContext.kt index 2cdf9e4944..2fd05f01bb 100644 --- a/app/src/androidTest/java/org/thoughtcrime/securesms/SignalInstrumentationApplicationContext.kt +++ b/app/src/androidTest/java/org/thoughtcrime/securesms/SignalInstrumentationApplicationContext.kt @@ -1,5 +1,6 @@ package org.thoughtcrime.securesms +import android.content.Context import org.signal.core.util.concurrent.SignalExecutors import org.signal.core.util.logging.AndroidLogger import org.signal.core.util.logging.Log @@ -11,6 +12,7 @@ import org.thoughtcrime.securesms.dependencies.InstrumentationApplicationDepende import org.thoughtcrime.securesms.logging.CustomSignalProtocolLogger import org.thoughtcrime.securesms.logging.PersistentLogger import org.thoughtcrime.securesms.testing.InMemoryLogger +import org.thoughtcrime.securesms.util.Environment /** * Application context for running instrumentation tests (aka androidTests). @@ -19,6 +21,11 @@ class SignalInstrumentationApplicationContext : ApplicationContext() { val inMemoryLogger: InMemoryLogger = InMemoryLogger() + override fun attachBaseContext(base: Context?) { + Environment.IS_INSTRUMENTATION = true + super.attachBaseContext(base) + } + override fun initializeAppDependencies() { val default = ApplicationDependencyProvider(this) AppDependencies.init(this, InstrumentationApplicationDependencyProvider(this, default)) diff --git a/app/src/instrumentation/AndroidManifest.xml b/app/src/instrumentation/AndroidManifest.xml deleted file mode 100644 index 8297919d99..0000000000 --- a/app/src/instrumentation/AndroidManifest.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - diff --git a/app/src/instrumentation/res/mipmap-anydpi-v26/ic_launcher.xml b/app/src/instrumentation/res/mipmap-anydpi-v26/ic_launcher.xml deleted file mode 100644 index 12bf65e9dd..0000000000 --- a/app/src/instrumentation/res/mipmap-anydpi-v26/ic_launcher.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/instrumentation/res/values/strings.xml b/app/src/instrumentation/res/values/strings.xml deleted file mode 100644 index 79bdc34914..0000000000 --- a/app/src/instrumentation/res/values/strings.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - Signal (Instrumentation) - diff --git a/app/src/main/java/org/thoughtcrime/securesms/util/Environment.kt b/app/src/main/java/org/thoughtcrime/securesms/util/Environment.kt index d971051e58..dd849cc71f 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/util/Environment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/util/Environment.kt @@ -11,10 +11,12 @@ object Environment { const val IS_STAGING: Boolean = BuildConfig.BUILD_ENVIRONMENT_TYPE == "Staging" || BuildConfig.BUILD_ENVIRONMENT_TYPE == "Pnp" || BuildConfig.BUILD_ENVIRONMENT_TYPE == "Backup" const val IS_NIGHTLY: Boolean = BuildConfig.BUILD_DISTRIBUTION_TYPE == "nightly" const val IS_WEBSITE: Boolean = BuildConfig.BUILD_DISTRIBUTION_TYPE == "website" - const val IS_INSTRUMENTATION: Boolean = BuildConfig.BUILD_VARIANT_TYPE == "Instrumentation" || BuildConfig.BUILD_VARIANT_TYPE == "Benchmark" const val IS_BENCHMARK: Boolean = BuildConfig.BUILD_VARIANT_TYPE == "Benchmark" const val IS_PERF: Boolean = BuildConfig.BUILD_VARIANT_TYPE == "Perf" + @JvmField + var IS_INSTRUMENTATION: Boolean = IS_BENCHMARK + fun isInternal(): Boolean { return !IS_INSTRUMENTATION && (BuildConfig.DEBUG || IS_NIGHTLY || IS_PERF || IS_STAGING) } diff --git a/build.gradle.kts b/build.gradle.kts index 18344318eb..b114a04f71 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -81,7 +81,7 @@ tasks.register("qa") { gradle.projectsEvaluated { val appTestTask = tasks.findByPath(":Signal-Android:testPlayProdReleaseUnitTest")!! val appLintTask = tasks.findByPath(":Signal-Android:lintPlayProdRelease")!! - val appCompileInstrumentationTask = tasks.findByPath(":Signal-Android:compilePlayProdInstrumentationAndroidTestSources") + val appCompileInstrumentationTask = tasks.findByPath(":Signal-Android:compilePlayProdDebugAndroidTestSources") tasks.named("qa") { dependsOn("ktlintCheck")