From 852a8a00273c9128efeed0217a8e5d3fcd8bf780 Mon Sep 17 00:00:00 2001 From: Lena Date: Sat, 1 Aug 2026 00:00:00 +0000 Subject: app: harden mirroring lifecycle and state --- .../java/invalid/lena/scrcpy/VideoQueueTest.java | 53 ++++++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 app/src/test/java/invalid/lena/scrcpy/VideoQueueTest.java (limited to 'app/src/test/java/invalid/lena/scrcpy/VideoQueueTest.java') diff --git a/app/src/test/java/invalid/lena/scrcpy/VideoQueueTest.java b/app/src/test/java/invalid/lena/scrcpy/VideoQueueTest.java new file mode 100644 index 0000000..00b19a5 --- /dev/null +++ b/app/src/test/java/invalid/lena/scrcpy/VideoQueueTest.java @@ -0,0 +1,53 @@ +package invalid.lena.scrcpy; + +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertSame; +import static org.junit.Assert.assertTrue; + +import org.junit.Test; + +public class VideoQueueTest { + + private static VideoQueue.Frame frame(int id, boolean config, boolean keyframe) { + return new VideoQueue.Frame(new byte[]{(byte) id}, id, config, keyframe); + } + + @Test + public void rejectsDeltaUntilKeyframe() { + VideoQueue queue = new VideoQueue(4, 4); + assertFalse(queue.offer(frame(1, false, false))); + assertTrue(queue.offer(frame(2, false, true))); + assertTrue(queue.offer(frame(3, false, false))); + } + + @Test + public void overflowKeepsQueuedDecoderGeneration() { + VideoQueue queue = new VideoQueue(3, 3); + VideoQueue.Frame keyframe = frame(1, false, true); + VideoQueue.Frame delta = frame(2, false, false); + assertTrue(queue.offer(keyframe)); + assertTrue(queue.offer(delta)); + assertTrue(queue.offer(frame(3, false, false))); + assertFalse(queue.offer(frame(4, false, false))); + assertTrue(queue.needsKeyframe()); + assertFalse(queue.offer(frame(5, false, false))); + assertSame(keyframe, queue.poll()); + assertSame(delta, queue.poll()); + } + + @Test + public void newKeyframeReplacesOldMediaButKeepsConfig() { + VideoQueue queue = new VideoQueue(4, 4); + VideoQueue.Frame config = frame(1, true, false); + VideoQueue.Frame nextKeyframe = frame(4, false, true); + assertTrue(queue.offer(config)); + assertTrue(queue.offer(frame(2, false, true))); + assertTrue(queue.offer(frame(3, false, false))); + + assertTrue(queue.offer(nextKeyframe)); + + assertSame(config, queue.poll()); + assertSame(nextKeyframe, queue.poll()); + assertTrue(queue.isEmpty()); + } +} -- cgit v1.2.3