diff --git a/.github/workflows/status_check.yml b/.github/workflows/status_check.yml index f3b3355..7b890fc 100644 --- a/.github/workflows/status_check.yml +++ b/.github/workflows/status_check.yml @@ -280,8 +280,13 @@ jobs: # docs/api-37-emulator-crash.md has the per-method measurements, and the # correction that produced them. # - # api-level must be "37.0". A bare 37 is not an SDK package and fails - # during setup, which cost a run to discover. + # api-level must be a POINT release. A bare 37 is not an SDK package and + # fails during setup, which cost a run to discover. `37.0` is the choice + # here rather than the only option: `37.1` and `37.2-beta*` exist and + # abort the same way, and api37-debug.yml's inputs document both, with + # the wrinkle that above 37.0 they ship only as google_apis_ps16k. + # docs/api-37-emulator-crash.md measures 37.0 rev 6 and 37.1 rev 8 side + # by side, so pinning 37.0 is a decision, not a constraint. # # notAnnotation removes the three tests that do not pass on this image; they # run in the advisory job below, off the same marker so they cannot end up diff --git a/app/src/androidTest/java/org/libremediaconverter/bench/RealMediaBenchmark.kt b/app/src/androidTest/java/org/libremediaconverter/bench/RealMediaBenchmark.kt index 3787388..d5f97ea 100644 --- a/app/src/androidTest/java/org/libremediaconverter/bench/RealMediaBenchmark.kt +++ b/app/src/androidTest/java/org/libremediaconverter/bench/RealMediaBenchmark.kt @@ -36,8 +36,20 @@ import java.io.File * 1. that the hardware path is worth having a second engine for at all, and * 2. that x264's CRF is worth the GPL licence the app carries for it. * - * Skips itself when the sample files are absent, so it is harmless in CI. Populate with: - * adb push .mp4 /sdcard/Android/data/org.libremediaconverter/files/ + * Skips itself when the sample files are absent, so it is harmless in CI — every green E2E + * leg reports two skips, and these are they. + * + * The two files it looks for, by exact name: + * + * - [H264_SAMPLE] for [hardwareVersusSoftwareOnRealVideo] + * - [AV1_SAMPLE] for [av1InputRoutesAccordingToDeviceDecodeSupport] + * + * **Where they go, and how, is on [samples] — read it before staging anything.** This used to + * carry an `adb push` line naming the external files dir, which [samples] then explains cannot + * work: a pushed file stays owned by the shell user and the app reads EACCES, surfacing as an + * unparseable input rather than a permission error. The instruction and its own refutation sat + * twelve lines apart. It is named in one place now rather than restated here, because restating + * it is what let the two drift. */ @UnstableApi @RunWith(AndroidJUnit4::class) diff --git a/app/src/test/java/org/libremediaconverter/convert/ConversionViewModelProbeFailureTest.kt b/app/src/test/java/org/libremediaconverter/convert/ConversionViewModelProbeFailureTest.kt index 9bfe5b9..2aa69ac 100644 --- a/app/src/test/java/org/libremediaconverter/convert/ConversionViewModelProbeFailureTest.kt +++ b/app/src/test/java/org/libremediaconverter/convert/ConversionViewModelProbeFailureTest.kt @@ -140,10 +140,16 @@ class ConversionViewModelProbeFailureTest { private fun pickedProbe(): InputProbe? { val viewModel = ConversionViewModel(app, Dispatchers.Unconfined) viewModel.onInputPicked(INPUT) + // The predicate is the guard, and it is the only one needed. It requires `Ready`, so a + // pick that ended in `Failed` never satisfies it and `awaitState` fails on its timeout + // naming what it was waiting for -- "Ready with a probe" -- which says more than a + // separate assertion could. A `ready as? ConversionState.Failed` check used to sit here + // and was dead: `Ready` and `Failed` are sibling subtypes of one sealed interface, so + // the cast was always null and the assertNull could never fire. Measured, not assumed -- + // flipping it to assertNotNull failed all three callers of this helper. val ready = awaitState(viewModel.state, "Ready with a probe") { it is ConversionState.Ready && it.input.probe != null } - assertNull("nothing here should reach a terminal failure", (ready as? ConversionState.Failed)) return (ready as ConversionState.Ready).input.probe }