From 6eb865242bd22a0fe68c9971578a0dbc8d7ab80d Mon Sep 17 00:00:00 2001 From: evgeny Date: Thu, 29 Oct 2026 09:38:45 +0100 Subject: [PATCH] Test video submission validation and retriever cleanup acknowledgements --- .../main/kotlin/android/media/HostFileVideo.kt | 5 +++-- .../com/utun/chat/data/VideoFileMetadataTest.kt | 16 ++++++++++++++++ 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/tools/chatgui-android/video-tests/src/main/kotlin/android/media/HostFileVideo.kt b/tools/chatgui-android/video-tests/src/main/kotlin/android/media/HostFileVideo.kt index cd08b264..09bf35fe 100644 --- a/tools/chatgui-android/video-tests/src/main/kotlin/android/media/HostFileVideo.kt +++ b/tools/chatgui-android/video-tests/src/main/kotlin/android/media/HostFileVideo.kt @@ -48,7 +48,7 @@ class MediaPlayer { class MediaMetadataRetriever { companion object { const val METADATA_KEY_VIDEO_WIDTH = 18; const val METADATA_KEY_VIDEO_HEIGHT = 19; const val METADATA_KEY_VIDEO_ROTATION = 24 - const val METADATA_KEY_DURATION = 9; const val OPTION_CLOSEST_SYNC = 2 + const val METADATA_KEY_DURATION = 9; const val METADATA_KEY_MIMETYPE = 12; const val OPTION_CLOSEST_SYNC = 2 val created = mutableListOf() var nextFailures = emptySet() } @@ -56,13 +56,14 @@ class MediaMetadataRetriever { var released = false var releases = 0 var width = "1280"; var height = "720"; var rotation = "90" + var duration = "10000"; var mime = "video/mp4" var lastFrame: android.graphics.Bitmap? = null var scaledReads = 0 init { created.add(this) } fun setDataSource(path: String) { check("source" !in failures) { "Metadata source failed" } } fun extractMetadata(key: Int): String? = when (key) { METADATA_KEY_VIDEO_WIDTH -> width; METADATA_KEY_VIDEO_HEIGHT -> height; METADATA_KEY_VIDEO_ROTATION -> rotation - METADATA_KEY_DURATION -> "10000"; else -> null + METADATA_KEY_DURATION -> duration; METADATA_KEY_MIMETYPE -> mime; else -> null } fun getFrameAtTime(time: Long): android.graphics.Bitmap? { check("frame" !in failures) diff --git a/tools/chatgui-android/video-tests/src/test/kotlin/com/utun/chat/data/VideoFileMetadataTest.kt b/tools/chatgui-android/video-tests/src/test/kotlin/com/utun/chat/data/VideoFileMetadataTest.kt index 01152821..fce4648f 100644 --- a/tools/chatgui-android/video-tests/src/test/kotlin/com/utun/chat/data/VideoFileMetadataTest.kt +++ b/tools/chatgui-android/video-tests/src/test/kotlin/com/utun/chat/data/VideoFileMetadataTest.kt @@ -67,4 +67,20 @@ class VideoFileMetadataTest { assertTrue(runCatching { VideoFileMetadata().use { it.preview("file.mp4") } }.isFailure) assertTrue(MediaMetadataRetriever.created.single().released) } + @Test fun submissionRejectsInvalidDurationAndMimeBeforeTransferringTheSource() { + for ((duration, mime) in listOf("0" to "video/mp4", "86400001" to "video/mp4", "1000" to "video/webm")) { + val reader = VideoFileMetadata() + val sdk = MediaMetadataRetriever.created.last().also { it.duration = duration; it.mime = mime } + assertTrue(runCatching { reader.use { it.submission("file.mp4") } }.isFailure) + assertTrue(sdk.released) + } + } + @Test fun submissionRetainsFailedReleaseAndPreservesCodedGeometry() { + val reader = VideoFileMetadata() + val sdk = MediaMetadataRetriever.created.single().also { it.failures = setOf("release") } + val metadata = reader.submission("file.mp4") + assertEquals(1280, metadata.width); assertEquals(720, metadata.height); assertEquals(10_000, metadata.durationMs) + assertTrue(runCatching { reader.close() }.isFailure); assertFalse(sdk.released) + sdk.failures = emptySet(); Looper.getMainLooper().advanceBy(250); assertTrue(sdk.released) + } }