From 356c04d137da69e3fe0079cfd34844d580e4dee6 Mon Sep 17 00:00:00 2001 From: Jason Ross Date: Thu, 20 Aug 2026 09:45:48 -0500 Subject: [PATCH] Make the 4:4:4 fallback regression run without manual setup The test covering the runtime fallback read its input from the app's internal storage, which only ever contained a file because it had been piped in by hand with run-as. On a fresh checkout it hit assumeTrue and skipped -- silently, while still counting toward the suite total. A regression test that skips is worse than no test, because the number reads as coverage. It now ships its own fixture: three seconds of H.264 High 4:4:4 Predictive, 76 KB. Producing it needed x264, which the host toolchain cannot supply -- Fedora's ffmpeg carries openh264, which is Constrained Baseline only and cannot even decode 4:4:4 -- so it was generated with ffmpeg-full inside the existing FFmpeg build container. The command is recorded in the test's own documentation so the fixture can be regenerated rather than trusted blindly. Verified by deleting the hand-staged files first and running the suite clean: the fallback test executes, Media3 fails to decode as expected, and the worker completes the conversion through FFmpeg. It is no longer among the skips. The benchmark stays opt-in and is now documented as such. It needs real long-form media that does not belong in the repository, and its numbers should not be mistaken for something the suite verifies. 29 instrumented tests on a Pixel 10 Pro XL: 0 failures, 2 skipped, and both skips are the benchmark by design. Co-Authored-By: Claude Opus 5 (1M context) --- .../androidTest/assets/sample_h264_444.mp4 | Bin 0 -> 77734 bytes .../bench/HardwareFallbackTest.kt | 87 --------------- .../bench/RealMediaBenchmark.kt | 5 + .../fallback/HardwareFallbackTest.kt | 100 ++++++++++++++++++ 4 files changed, 105 insertions(+), 87 deletions(-) create mode 100644 app/src/androidTest/assets/sample_h264_444.mp4 delete mode 100644 app/src/androidTest/java/dev/jasonmross/mediaconverter/bench/HardwareFallbackTest.kt create mode 100644 app/src/androidTest/java/dev/jasonmross/mediaconverter/fallback/HardwareFallbackTest.kt diff --git a/app/src/androidTest/assets/sample_h264_444.mp4 b/app/src/androidTest/assets/sample_h264_444.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..36b1b72b419250ff67f89e12f8c2c868d9a25333 GIT binary patch literal 77734 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 literal 0 HcmV?d00001 diff --git a/app/src/androidTest/java/dev/jasonmross/mediaconverter/bench/HardwareFallbackTest.kt b/app/src/androidTest/java/dev/jasonmross/mediaconverter/bench/HardwareFallbackTest.kt deleted file mode 100644 index 3854663..0000000 --- a/app/src/androidTest/java/dev/jasonmross/mediaconverter/bench/HardwareFallbackTest.kt +++ /dev/null @@ -1,87 +0,0 @@ -package dev.jasonmross.mediaconverter.bench - -import android.net.Uri -import androidx.media3.common.util.UnstableApi -import androidx.test.ext.junit.runners.AndroidJUnit4 -import androidx.test.platform.app.InstrumentationRegistry -import androidx.work.WorkInfo -import androidx.work.WorkManager -import dev.jasonmross.mediaconverter.model.Engine -import dev.jasonmross.mediaconverter.model.OutputFormat -import dev.jasonmross.mediaconverter.model.QualityTier -import dev.jasonmross.mediaconverter.work.ConversionWorker -import kotlinx.coroutines.flow.first -import kotlinx.coroutines.runBlocking -import kotlinx.coroutines.withTimeout -import org.junit.Assume.assumeTrue -import org.junit.Test -import org.junit.runner.RunWith -import java.io.File - -/** - * The dynamic fallback, exercised by a real file that genuinely breaks the fast path. - * - * The sample is H.264 **High 4:4:4 Predictive** (`avc1.F4001F`). Hardware AVC decoders - * implement High 4:2:0, and Android's software `c2.google.avc.decoder` does not cover - * 4:4:4 either, so Media3 cannot decode it on any device — it fails with a codec - * exception partway through the export. - * - * The static routing rules cannot predict this: the container is MP4, the codec is - * "h264", and the device reports both AVC decode and encode. Everything looks fine - * until the codec is actually configured. This is the case the runtime fallback exists - * for, and until a file like this was tried on hardware it had never actually fired. - */ -@UnstableApi -@RunWith(AndroidJUnit4::class) -class HardwareFallbackTest { - - private val context = InstrumentationRegistry.getInstrumentation().targetContext - private val workManager = WorkManager.getInstance(context) - - @Test - fun aFileMedia3CannotDecodeStillConvertsViaFfmpeg(): Unit = runBlocking { - val input = File(context.filesDir, SAMPLE).takeIf { it.exists() && it.length() > 0 } - assumeTrue("$SAMPLE not present; skipping", input != null) - - val request = ConversionWorker.request( - inputUri = Uri.fromFile(input!!), - displayName = SAMPLE, - sizeBytes = input.length(), - format = OutputFormat.MP4_H265, - // Fast deliberately: this is the tier that would be routed to Media3, so it - // is the tier where the fallback has to save the conversion. - quality = QualityTier.FAST, - ) - workManager.enqueue(request).result.get() - - val terminal = withTimeout(TIMEOUT_MS) { - workManager.getWorkInfoByIdFlow(request.id).first { it != null && it.state.isFinished } - } - - val error = terminal?.outputData?.getString(ConversionWorker.KEY_ERROR) - org.junit.Assert.assertEquals( - "a file Media3 cannot decode must still convert, but failed with: $error", - WorkInfo.State.SUCCEEDED, - terminal?.state, - ) - - val out = File(terminal!!.outputData.getString(ConversionWorker.KEY_OUTPUT_PATH)!!) - org.junit.Assert.assertTrue("no output produced", out.exists() && out.length() > 0) - - // The routing decision still reads MEDIA3 -- that is the *static* decision, which - // was reasonable on the information available. The recovery happened underneath - // it at runtime, which is the point. - android.util.Log.i( - TAG, - "BENCH fallback: routed=${terminal.outputData.getString(ConversionWorker.KEY_ENGINE_USED)} " + - "output=${out.length() / 1_000_000}MB", - ) - out.delete() - } - - private companion object { - const val TAG = "HardwareFallbackTest" - const val SAMPLE = "bench_h264_720p.mp4" - const val TIMEOUT_MS = 600_000L - } -} diff --git a/app/src/androidTest/java/dev/jasonmross/mediaconverter/bench/RealMediaBenchmark.kt b/app/src/androidTest/java/dev/jasonmross/mediaconverter/bench/RealMediaBenchmark.kt index 7769e7e..66a80ef 100644 --- a/app/src/androidTest/java/dev/jasonmross/mediaconverter/bench/RealMediaBenchmark.kt +++ b/app/src/androidTest/java/dev/jasonmross/mediaconverter/bench/RealMediaBenchmark.kt @@ -26,6 +26,11 @@ import java.io.File /** * Measures the two claims that motivate the whole architecture, against real media. * + * **This is a benchmark, not part of the automated suite.** It needs real, long-form + * media that is not committed to the repository, so it skips unless someone stages + * files deliberately. Do not read a passing run of the test suite as evidence these + * numbers still hold — correctness lives in the tests that ship their own fixtures. + * * Not a correctness test — the assertions are deliberately loose. These exist to * produce numbers for two decisions that were otherwise taken on faith: * diff --git a/app/src/androidTest/java/dev/jasonmross/mediaconverter/fallback/HardwareFallbackTest.kt b/app/src/androidTest/java/dev/jasonmross/mediaconverter/fallback/HardwareFallbackTest.kt new file mode 100644 index 0000000..0f148db --- /dev/null +++ b/app/src/androidTest/java/dev/jasonmross/mediaconverter/fallback/HardwareFallbackTest.kt @@ -0,0 +1,100 @@ +package dev.jasonmross.mediaconverter.fallback + +import android.net.Uri +import androidx.media3.common.util.UnstableApi +import androidx.test.ext.junit.runners.AndroidJUnit4 +import androidx.test.platform.app.InstrumentationRegistry +import androidx.work.WorkInfo +import androidx.work.WorkManager +import dev.jasonmross.mediaconverter.model.OutputFormat +import dev.jasonmross.mediaconverter.model.QualityTier +import dev.jasonmross.mediaconverter.work.ConversionWorker +import kotlinx.coroutines.flow.first +import kotlinx.coroutines.runBlocking +import kotlinx.coroutines.withTimeout +import org.junit.After +import org.junit.Assert.assertEquals +import org.junit.Assert.assertTrue +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith +import java.io.File + +/** + * The runtime fallback, driven by a file Media3 genuinely cannot decode. + * + * The fixture is H.264 **High 4:4:4 Predictive**. Hardware AVC decoders implement High + * 4:2:0, and Android's software `c2.google.avc.decoder` does not cover 4:4:4 either, so + * Media3 fails partway through the export on every device. + * + * The static routing rules cannot predict that: the container is MP4, the codec reports + * as "h264", and the device advertises AVC decode and encode. Everything looks viable + * until the codec is configured. This is the one case that proves the runtime fallback + * works, so it deliberately uses a **committed fixture** rather than media staged by + * hand — a regression test that silently skips is worse than no test, because the count + * still reads as coverage. + * + * The fixture was produced with x264, which the host toolchain cannot do (Fedora's + * ffmpeg ships openh264, which is Constrained Baseline only): + * + * ffmpeg -f lavfi -i testsrc=duration=3:size=320x240:rate=15 \ + * -f lavfi -i sine=frequency=440:duration=3 \ + * -c:v libx264 -profile:v high444 -pix_fmt yuv444p -preset ultrafast \ + * -c:a aac -shortest sample_h264_444.mp4 + */ +@UnstableApi +@RunWith(AndroidJUnit4::class) +class HardwareFallbackTest { + + private val context = InstrumentationRegistry.getInstrumentation().targetContext + private val workManager = WorkManager.getInstance(context) + private lateinit var input: File + + @Before + fun setUp() { + input = File(context.cacheDir, SAMPLE) + InstrumentationRegistry.getInstrumentation().context.assets + .open(SAMPLE) + .use { asset -> input.outputStream().use { asset.copyTo(it) } } + } + + @After + fun tearDown() { + input.delete() + File(context.cacheDir, "conversions").listFiles()?.forEach { it.delete() } + } + + @Test + fun aFileMedia3CannotDecodeStillConvertsViaFfmpeg(): Unit = runBlocking { + val request = ConversionWorker.request( + inputUri = Uri.fromFile(input), + displayName = SAMPLE, + sizeBytes = input.length(), + format = OutputFormat.MP4_H265, + // Fast deliberately: this is the tier the router sends to Media3, so it is + // the tier where the fallback has to rescue the conversion. + quality = QualityTier.FAST, + ) + workManager.enqueue(request).result.get() + + val terminal = withTimeout(TIMEOUT_MS) { + workManager.getWorkInfoByIdFlow(request.id).first { it != null && it.state.isFinished } + } + + val error = terminal?.outputData?.getString(ConversionWorker.KEY_ERROR) + assertEquals( + "a file Media3 cannot decode must still convert, but failed with: $error", + WorkInfo.State.SUCCEEDED, + terminal?.state, + ) + + val out = File(terminal!!.outputData.getString(ConversionWorker.KEY_OUTPUT_PATH)!!) + assertTrue("no output produced", out.exists() && out.length() > 0) + out.delete() + } + + private companion object { + const val SAMPLE = "sample_h264_444.mp4" + const val TIMEOUT_MS = 600_000L + } +}