The Fenix Enrollment Integration Test workflow (.github/workflows/fenix-integration-test.yml, test experimenter/tests/integration/nimbus/android/test_fenix_enrollment.py) fails intermittently — mostly on the beta channel. Two independent flakes:
1. AssertionError: No log-state row found ... after 60s
The test enrolls (nimbus-cli enroll --reset-app, launch 1), sleeps 15s, then runs nimbus-cli log-state once (launch 2) and polls adb logcat -d for 60s. On a loaded CI emulator the enroll launch's applyPendingExperiments doesn't persist within 15s, so the single log-state launch reads an empty DB. The poll loop only re-dumps the logcat ring buffer — it never re-issues log-state — so once that one read is empty, nothing can recover it (the app won't re-print state without being re-launched).
Proposed fix: move the log-state invocation inside the poll loop — clear logcat, relaunch log-state (which re-runs applyPendingExperiments on startup), wait, dump, match — and raise the timeout to match observed apply latency. This mirrors the iOS sibling test, which polls a persistent log for 180s.
2. could not connect to TCP port 5554: Connection refused
Misleading message. The real failure is a corrupted SDK package download inside the reactivecircus/android-emulator-runner "Install Android SDK" step (Error reading Zip content from a SeekableByteChannel on the Android Emulator package / the google_apis;x86_64 system image). The emulator is never installed → never boots → the cleanup's adb emu kill reports connection-refused. The action does not retry the SDK download.
Proposed fix: add a step before the emulator-runner that pre-installs emulator + system-images;android-34;google_apis;x86_64 with a bash retry loop. Once the packages are validly installed, the action's own sdkmanager install no-ops and never re-downloads.
Acceptance criteria
┆Issue is synchronized with this Jira Task
The
Fenix Enrollment Integration Testworkflow (.github/workflows/fenix-integration-test.yml, testexperimenter/tests/integration/nimbus/android/test_fenix_enrollment.py) fails intermittently — mostly on thebetachannel. Two independent flakes:1.
AssertionError: No log-state row found ... after 60sThe test enrolls (
nimbus-cli enroll --reset-app, launch 1), sleeps 15s, then runsnimbus-cli log-stateonce (launch 2) and pollsadb logcat -dfor 60s. On a loaded CI emulator the enroll launch'sapplyPendingExperimentsdoesn't persist within 15s, so the singlelog-statelaunch reads an empty DB. The poll loop only re-dumps the logcat ring buffer — it never re-issueslog-state— so once that one read is empty, nothing can recover it (the app won't re-print state without being re-launched).Proposed fix: move the
log-stateinvocation inside the poll loop — clear logcat, relaunchlog-state(which re-runsapplyPendingExperimentson startup), wait, dump, match — and raise the timeout to match observed apply latency. This mirrors the iOS sibling test, which polls a persistent log for 180s.2.
could not connect to TCP port 5554: Connection refusedMisleading message. The real failure is a corrupted SDK package download inside the
reactivecircus/android-emulator-runner"Install Android SDK" step (Error reading Zip content from a SeekableByteChannelon the Android Emulator package / thegoogle_apis;x86_64system image). The emulator is never installed → never boots → the cleanup'sadb emu killreports connection-refused. The action does not retry the SDK download.Proposed fix: add a step before the emulator-runner that pre-installs
emulator+system-images;android-34;google_apis;x86_64with a bash retry loop. Once the packages are validly installed, the action's ownsdkmanagerinstall no-ops and never re-downloads.Acceptance criteria
log-stateis re-issued on each poll iteration so a late-persisted enrollment still surfaces.┆Issue is synchronized with this Jira Task