Compare commits
9
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e7d84cc69f | ||
|
|
a8b494b846 | ||
|
|
865a4a7c8e | ||
|
|
e856679395 | ||
|
|
1b220856ab | ||
|
|
40ae524388 | ||
|
|
58a29ab093 | ||
|
|
d37c391c60 | ||
|
|
95902a7889 |
@@ -280,8 +280,13 @@ jobs:
|
|||||||
# docs/api-37-emulator-crash.md has the per-method measurements, and the
|
# docs/api-37-emulator-crash.md has the per-method measurements, and the
|
||||||
# correction that produced them.
|
# correction that produced them.
|
||||||
#
|
#
|
||||||
# api-level must be "37.0". A bare 37 is not an SDK package and fails
|
# api-level must be a POINT release. A bare 37 is not an SDK package and
|
||||||
# during setup, which cost a run to discover.
|
# 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
|
# 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
|
# run in the advisory job below, off the same marker so they cannot end up
|
||||||
|
|||||||
@@ -36,8 +36,20 @@ import java.io.File
|
|||||||
* 1. that the hardware path is worth having a second engine for at all, and
|
* 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.
|
* 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:
|
* Skips itself when the sample files are absent, so it is harmless in CI — every green E2E
|
||||||
* adb push <file>.mp4 /sdcard/Android/data/org.libremediaconverter/files/
|
* 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
|
@UnstableApi
|
||||||
@RunWith(AndroidJUnit4::class)
|
@RunWith(AndroidJUnit4::class)
|
||||||
|
|||||||
+7
-1
@@ -140,10 +140,16 @@ class ConversionViewModelProbeFailureTest {
|
|||||||
private fun pickedProbe(): InputProbe? {
|
private fun pickedProbe(): InputProbe? {
|
||||||
val viewModel = ConversionViewModel(app, Dispatchers.Unconfined)
|
val viewModel = ConversionViewModel(app, Dispatchers.Unconfined)
|
||||||
viewModel.onInputPicked(INPUT)
|
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") {
|
val ready = awaitState(viewModel.state, "Ready with a probe") {
|
||||||
it is ConversionState.Ready && it.input.probe != null
|
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
|
return (ready as ConversionState.Ready).input.probe
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user