Setup basic compose screenshot testing infra for regV5.

This commit is contained in:
Greyson Parrelli 2026-06-17 13:00:25 -04:00
parent b724f2b01a
commit 9430c27e64
22 changed files with 189 additions and 0 deletions

1
.gitattributes vendored
View File

@ -1 +1,2 @@
*.ai binary
**/src/screenshotTest*/reference/**/*.png filter=lfs diff=lfs merge=lfs -text

View File

@ -20,6 +20,7 @@ jobs:
# gh api repos/actions/checkout/commits/v6 --jq '.sha'
with:
submodules: true
lfs: true
- name: set up JDK 17
uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5

View File

@ -112,6 +112,7 @@ gradle.projectsEvaluated {
testTask?.let { dependsOn(it) }
subproject.tasks.findByName("lintDebug")?.let { dependsOn(it) }
subproject.tasks.findByName("validateDebugScreenshotTest")?.let { dependsOn(it) }
}
}

View File

@ -126,5 +126,8 @@ annotation class AllNightPreviews
@TabletPreviews
annotation class AllDevicePreviews
@Preview(name = "rtl", locale = "ar")
annotation class RtlPreview
@Preview(name = "large font", fontScale = 2f)
annotation class LargeFontPreviews

View File

@ -4,6 +4,7 @@ plugins {
id("com.squareup.wire")
alias(libs.plugins.compose.compiler)
alias(libs.plugins.kotlinx.serialization)
alias(testLibs.plugins.compose.screenshot)
}
android {
@ -23,6 +24,8 @@ android {
isIncludeAndroidResources = true
}
}
experimentalProperties["android.experimental.enableScreenshotTest"] = true
}
wire {
@ -87,4 +90,9 @@ dependencies {
androidTestImplementation(testLibs.androidx.test.ext.junit)
androidTestImplementation(libs.androidx.compose.ui.test.junit4)
debugImplementation(libs.androidx.compose.ui.test.manifest)
// Compose screenshot testing
screenshotTestImplementation(testLibs.compose.screenshot.validation.api)
screenshotTestImplementation(libs.androidx.compose.ui.tooling.core)
screenshotTestImplementation(libs.androidx.compose.ui.tooling.preview)
}

View File

@ -0,0 +1,24 @@
/*
* Copyright 2026 Signal Messenger, LLC
* SPDX-License-Identifier: AGPL-3.0-only
*/
package org.signal.registration.screens.welcome
import androidx.compose.runtime.Composable
import com.android.tools.screenshot.PreviewTest
import org.signal.core.ui.compose.AllDevicePreviews
import org.signal.core.ui.compose.Previews
import org.signal.core.ui.compose.RtlPreview
class WelcomeScreenScreenshotTests {
@PreviewTest
@AllDevicePreviews
@RtlPreview
@Composable
fun WelcomeScreenPhonePreview() {
Previews.Preview {
WelcomeScreen(onEvent = {})
}
}
}

View File

@ -15,6 +15,7 @@ org.gradle.caching=true
org.gradle.configuration-cache=true
org.gradle.configuration-cache.problems=fail
android.generateSyncIssueWhenLibraryConstraintsAreEnabled=false
android.experimental.enableScreenshotTest=true
# We never want to use auto-provisioning, as it breaks reproducible builds.
# This should not be a problem, because we never configure a "javaRepositories"

View File

@ -6,8 +6,13 @@ androidx-test = "1.5.0"
androidx-test-ext-junit = "1.1.5"
robolectric = "4.15.1"
espresso = "3.4.0"
compose-screenshot = "0.0.1-alpha15"
[plugins]
compose-screenshot = { id = "com.android.compose.screenshot", version.ref = "compose-screenshot" }
[libraries]
compose-screenshot-validation-api = { module = "com.android.tools.screenshot:screenshot-validation-api", version.ref = "compose-screenshot" }
junit-junit = "junit:junit:4.13.2"
androidx-test-core = { module = "androidx.test:core", version.ref = "androidx-test" }
androidx-test-core-ktx = { module = "androidx.test:core-ktx", version.ref = "androidx-test" }

View File

@ -9985,6 +9985,14 @@ https://docs.gradle.org/current/userguide/dependency_verification.html
<sha256 value="2a8b1c7ad98429b4245ffaba1db48f1bdc78f6cd097aec256d3d6e0baf1b7cae" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="com.android.compose.screenshot" name="screenshot-test-gradle-plugin" version="0.0.1-alpha15">
<artifact name="screenshot-test-gradle-plugin-0.0.1-alpha15.jar">
<sha256 value="d2c51a9fc18ff0529179c28d1588845eafb406c51e0140c6044588e6d8723a3b" origin="Generated by Gradle"/>
</artifact>
<artifact name="screenshot-test-gradle-plugin-0.0.1-alpha15.module">
<sha256 value="489dd2df432938410703cd817371af3124c8504dc37c49b9ce5b83ba58be5a9d" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="com.android.databinding" name="baseLibrary" version="8.10.1">
<artifact name="baseLibrary-8.10.1.jar">
<md5 value="d4fb415454f1c7211401c41c9be31e05" origin="Generated by Gradle"/>
@ -11360,6 +11368,16 @@ https://docs.gradle.org/current/userguide/dependency_verification.html
<sha256 value="36c25576b19993df360170528cc62b7246c37776d6158154a67cdf8fc2d58e13" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="com.android.tools.compose" name="compose-preview-detector" version="32.3.0-alpha06">
<artifact name="compose-preview-detector-32.3.0-alpha06.jar">
<sha256 value="131c4bd7c23707c036ce6d777e2ee8ff27344dfbe16643bbfabc1ec40e17ec10" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="com.android.tools.compose" name="compose-preview-renderer" version="0.0.1-alpha15">
<artifact name="compose-preview-renderer-0.0.1-alpha15.jar">
<sha256 value="0f5ebdac5c0b4fa2bfe1528fcf8cf1aa86921311f30c67e183921551aaed93ba" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="com.android.tools.ddms" name="ddmlib" version="31.10.1">
<artifact name="ddmlib-31.10.1.jar">
<md5 value="44e6aeadccdf11de761d58fcdf85cbc3" origin="Generated by Gradle"/>
@ -11562,6 +11580,11 @@ https://docs.gradle.org/current/userguide/dependency_verification.html
<sha256 value="b75a953d4dc82baaec5d79b84b5910fd10c58c0bf0ef664e66441356ff15bf4d" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="com.android.tools.layoutlib" name="layoutlib" version="16.1.0-jdk17">
<artifact name="layoutlib-16.1.0-jdk17.jar">
<sha256 value="cc2f6e01c9d5904b0896a3d66d8b1b169ea8163d762d1ddd3c51548c72ca6182" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="com.android.tools.layoutlib" name="layoutlib-api" version="31.10.1">
<artifact name="layoutlib-api-31.10.1.jar">
<md5 value="05069d2d4ff733dd754aebac09c03ea3" origin="Generated by Gradle"/>
@ -11606,6 +11629,19 @@ https://docs.gradle.org/current/userguide/dependency_verification.html
<sha256 value="c3445bef3e5daa94e32608a6156c9ab0925210488d3bf2350aef9f68afd97d3e" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="com.android.tools.layoutlib" name="layoutlib-resources" version="16.1.0-jdk17">
<artifact name="layoutlib-resources-16.1.0-jdk17.jar">
<sha256 value="2f7beb5e9f441b9f32c12df0a34121155163dfd047804b116262eaad33928388" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="com.android.tools.layoutlib" name="layoutlib-runtime" version="16.1.0-jdk17">
<artifact name="layoutlib-runtime-16.1.0-jdk17.jar">
<sha256 value="baef8b5bd54f318d8805863d6193acaf6c21efe292485747aa7362836d372f4c" origin="Generated by Gradle"/>
</artifact>
<artifact name="layoutlib-runtime-16.1.0-jdk17.module">
<sha256 value="9b70ce71371926ab9e2d69a10741621fbfd0e141a883afe88351cba798e96979" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="com.android.tools.lint" name="lint" version="31.10.1">
<artifact name="lint-31.10.1.jar">
<sha256 value="17f891db6b9d045027093729336bfca342a81ce723eb3a7e3fee2fbb575c08e1" origin="Generated by Gradle"/>
@ -11870,6 +11906,16 @@ https://docs.gradle.org/current/userguide/dependency_verification.html
<sha256 value="60a873fe70d4787c1342ae753aaf2cce23369e60d66fbf6ef6952cb110f960e6" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="com.android.tools.screenshot" name="screenshot-validation-api" version="0.0.1-alpha15">
<artifact name="screenshot-validation-api-0.0.1-alpha15.jar">
<sha256 value="0d0992a5904eeea16b865edf69338f3aba1e3f8411db58d9c4c9f189afc42bfb" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="com.android.tools.screenshot" name="screenshot-validation-junit-engine" version="0.0.1-alpha15">
<artifact name="screenshot-validation-junit-engine-0.0.1-alpha15.jar">
<sha256 value="934d5e580825f8e175ee40f4ea65539dffb36ee688649383c058a75008822846" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="com.android.tools.utp" name="android-device-provider-ddmlib" version="31.10.1">
<artifact name="android-device-provider-ddmlib-31.10.1.jar">
<md5 value="39b0a8fbf96dd58ea933d6a5a0cb8418" origin="Generated by Gradle"/>
@ -19493,6 +19539,14 @@ https://docs.gradle.org/current/userguide/dependency_verification.html
<sha256 value="585c202c43882b20278a1290ea219f36ea720a22d13933b1c466303008335315" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="org.jetbrains.kotlin" name="kotlin-stdlib" version="2.3.10">
<artifact name="kotlin-stdlib-2.3.10.jar">
<sha256 value="f61662c6d3a2f8ef5bd34362a02d877772c39f393cd394feb259dfaf7f4d8437" origin="Generated by Gradle"/>
</artifact>
<artifact name="kotlin-stdlib-2.3.10.module">
<sha256 value="ea871f66319cda27ab2522fa8d929131d5e6fcb53344e4f54cdae03111d150aa" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="org.jetbrains.kotlin" name="kotlin-stdlib" version="2.3.20">
<artifact name="kotlin-stdlib-2.3.20-all.jar">
<sha256 value="2197ae07788b09d03d5f3f2a2d52073859e352481bb6feb4335e391093116270" origin="Generated by Gradle"/>
@ -19653,6 +19707,11 @@ https://docs.gradle.org/current/userguide/dependency_verification.html
<sha256 value="3ffdb451aa2d314fe7263782d37eabddcf8b941bcb940fe3192ac01a62b57f7b" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="org.jetbrains.kotlin" name="kotlin-stdlib-common" version="2.3.10">
<artifact name="kotlin-stdlib-common-2.3.10.module">
<sha256 value="1ab23ec5f6d9de235e28d463a3f20a243f7a558f9a86ddd53a9484c877e6792f" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="org.jetbrains.kotlin" name="kotlin-stdlib-common" version="2.3.20">
<artifact name="kotlin-stdlib-common-2.3.20.module">
<sha256 value="7d5e33de714cddd75078642098cbcbee97c18398d034b77d32b4b074b9503939" origin="Generated by Gradle"/>
@ -19741,6 +19800,11 @@ https://docs.gradle.org/current/userguide/dependency_verification.html
<sha256 value="3bd26ecb6d12978c5c4e0b41f76c9ff551fac2a5e6268427a9d2a0cdf8a5ad91" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="org.jetbrains.kotlin" name="kotlin-stdlib-jdk7" version="2.3.10">
<artifact name="kotlin-stdlib-jdk7-2.3.10.jar">
<sha256 value="9c208de17b6d0d701629cb972eb568d092f28af863e32ef68f22374dc8b8b8fb" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="org.jetbrains.kotlin" name="kotlin-stdlib-jdk8" version="1.6.21">
<artifact name="kotlin-stdlib-jdk8-1.6.21.jar">
<md5 value="9e7ee18a1a5dd5bf070c7e6f706ccc9c" origin="Generated by Gradle"/>
@ -19824,6 +19888,11 @@ https://docs.gradle.org/current/userguide/dependency_verification.html
<sha256 value="c314177935d8dc2eda879507117f25d6de56f6c57ede99416b14cd622bb9e09d" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="org.jetbrains.kotlin" name="kotlin-stdlib-jdk8" version="2.3.10">
<artifact name="kotlin-stdlib-jdk8-2.3.10.jar">
<sha256 value="6581d8c24374200577b84149d8be7f744e07e1cd3bc425179a3b9d07bf3f6741" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="org.jetbrains.kotlin" name="kotlin-tooling-core" version="2.0.20">
<artifact name="kotlin-tooling-core-2.0.20.jar">
<md5 value="f489b6ac67a5b4efd1e76ae4171cd7ed" origin="Generated by Gradle"/>
@ -20794,6 +20863,11 @@ https://docs.gradle.org/current/userguide/dependency_verification.html
<sha256 value="86477abcf490d6ca059aa9973cb108d22a506f49d1a5569bb32cc6cbf43c2cce" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="org.junit" name="junit-bom" version="5.12.0">
<artifact name="junit-bom-5.12.0.module">
<sha256 value="bff102d308d18141ebbfe81d863b0599a30f7bbacadbdd5698a9d43692fda62f" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="org.junit" name="junit-bom" version="5.12.2">
<artifact name="junit-bom-5.12.2.module">
<sha256 value="de70ac5d91a52656d8890a6d23b9e04d99b99b1a0402530decad71bf31b2735e" origin="Generated by Gradle"/>
@ -20874,6 +20948,14 @@ https://docs.gradle.org/current/userguide/dependency_verification.html
<sha256 value="5023e4e3ec156ec6bd3cf655f3070cfc5a3e8aad5d51b4bbe025a792e9498d73" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="org.junit.platform" name="junit-platform-commons" version="1.12.0">
<artifact name="junit-platform-commons-1.12.0.jar">
<sha256 value="8914fca20882c8476a9165053a947973559e539298c285f4de5bdec36663b34a" origin="Generated by Gradle"/>
</artifact>
<artifact name="junit-platform-commons-1.12.0.module">
<sha256 value="0245522b07494a7b292b3007c1dadd1a2769bd1d594d42e3e9530d9434fe95ef" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="org.junit.platform" name="junit-platform-commons" version="1.8.2">
<artifact name="junit-platform-commons-1.8.2.jar">
<md5 value="72693a20944048031e0a55f67413ca1b" origin="Generated by Gradle"/>
@ -20886,6 +20968,14 @@ https://docs.gradle.org/current/userguide/dependency_verification.html
<sha256 value="342847d3046fea435595692db4f05d5f039e0e1d1e204f4d5755902557082626" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="org.junit.platform" name="junit-platform-engine" version="1.12.0">
<artifact name="junit-platform-engine-1.12.0.jar">
<sha256 value="bd38897bcbe183659234c6d75955ad1b937302f894f25e42cdc9aee0dd8ae614" origin="Generated by Gradle"/>
</artifact>
<artifact name="junit-platform-engine-1.12.0.module">
<sha256 value="6e80bacbea42607bb6dfec8916b525fa44c93d381439818474b4c99820bbb84d" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="org.junit.platform" name="junit-platform-engine" version="1.8.2">
<artifact name="junit-platform-engine-1.8.2.jar">
<md5 value="a6d209076d8a9fe4029c638cf05e6030" origin="Generated by Gradle"/>
@ -20898,6 +20988,22 @@ https://docs.gradle.org/current/userguide/dependency_verification.html
<sha256 value="eba77b36efdf75a67f46438333825f9e448f550d521e7249d950358580ee636b" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="org.junit.platform" name="junit-platform-launcher" version="1.12.0">
<artifact name="junit-platform-launcher-1.12.0.jar">
<sha256 value="fe6550658aaa21ca1f28b7279a5e60c68c8fa68f7de22a891ef64ac44cf36f15" origin="Generated by Gradle"/>
</artifact>
<artifact name="junit-platform-launcher-1.12.0.module">
<sha256 value="2153be8dfc6bf18fbae74d7ab02411a75fc36410982ff482c39e95d69b87ce45" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="org.junit.platform" name="junit-platform-reporting" version="1.12.0">
<artifact name="junit-platform-reporting-1.12.0.jar">
<sha256 value="cb5c2dd87cb1f46f8cc5954e48e76e5719776cf942d6e4df1588c6ef4fdefcec" origin="Generated by Gradle"/>
</artifact>
<artifact name="junit-platform-reporting-1.12.0.module">
<sha256 value="9b9abc20ccb02ac04a3980f344b31623a5183fd91bdefb7de713354b0c1199d5" origin="Generated by Gradle"/>
</artifact>
</component>
<component group="org.jvnet.staxex" name="stax-ex" version="1.8.1">
<artifact name="stax-ex-1.8.1.jar">
<md5 value="8fea4418fa80e957e39c174cec08053c" origin="Generated by Gradle"/>