From 518f74b91abeff51b53c4e58bf924a0916eb2614 Mon Sep 17 00:00:00 2001 From: Brad Stein Date: Mon, 18 May 2026 21:42:22 -0300 Subject: [PATCH] test(lesavka): repair HEVC guard contract harness --- Cargo.lock | 1 + Cargo.toml | 1 + scripts/ci/hygiene_gate_baseline.json | 11 +++-- .../hevc_mjpeg_guard_chaos_contract.rs | 45 ++++++++++--------- .../server_video_sinks_include_contract.rs | 2 +- ...rver_mjpeg_normalizer_memory_regression.rs | 25 ++++++----- .../video_sinks/hevc_mjpeg_guard_unit.rs | 43 +++++++++--------- 7 files changed, 72 insertions(+), 56 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 6425cb6..de8cd60 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1749,6 +1749,7 @@ dependencies = [ "gstreamer-app", "gstreamer-video", "gtk4", + "jpeg-decoder", "lesavka_client", "lesavka_common", "lesavka_server", diff --git a/Cargo.toml b/Cargo.toml index f719d4b..490b420 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -44,6 +44,7 @@ gstreamer = { version = "0.23", features = ["v1_22"] } gstreamer-app = { version = "0.23", features = ["v1_22"] } gstreamer-video = { version = "0.23", features = ["v1_22"] } gtk = { version = "0.8", package = "gtk4", features = ["v4_6"] } +jpeg-decoder = { version = "0.3", default-features = false } winit = "0.30" serial_test = { workspace = true } serde = { version = "1.0", features = ["derive"] } diff --git a/scripts/ci/hygiene_gate_baseline.json b/scripts/ci/hygiene_gate_baseline.json index 7876132..376fd37 100644 --- a/scripts/ci/hygiene_gate_baseline.json +++ b/scripts/ci/hygiene_gate_baseline.json @@ -1308,17 +1308,22 @@ "server/src/video_sinks/hevc_mjpeg_guard.rs": { "clippy_warnings": 0, "doc_debt": 0, - "loc": 375 + "loc": 383 }, "server/src/video_sinks/hevc_mjpeg_guard/mjpeg_frame_inspection.rs": { "clippy_warnings": 0, "doc_debt": 1, "loc": 167 }, + "server/src/video_sinks/hevc_mjpeg_guard/mjpeg_visual_guard.rs": { + "clippy_warnings": 0, + "doc_debt": 8, + "loc": 475 + }, "server/src/video_sinks/hevc_mjpeg_guard/tests.rs": { "clippy_warnings": 0, - "doc_debt": 5, - "loc": 258 + "doc_debt": 11, + "loc": 422 }, "server/src/video_sinks/mjpeg_spool.rs": { "clippy_warnings": 0, diff --git a/tests/chaos/server/video_sinks/hevc_mjpeg_guard_chaos_contract.rs b/tests/chaos/server/video_sinks/hevc_mjpeg_guard_chaos_contract.rs index 767f6e1..1916e55 100644 --- a/tests/chaos/server/video_sinks/hevc_mjpeg_guard_chaos_contract.rs +++ b/tests/chaos/server/video_sinks/hevc_mjpeg_guard_chaos_contract.rs @@ -15,33 +15,36 @@ mod video_support { } } -#[allow(clippy::items_after_test_module)] -mod guard { - include!(concat!( - env!("CARGO_MANIFEST_DIR"), - "/server/src/video_sinks/hevc_mjpeg_guard.rs" - )); +mod video_sinks { + #[allow(clippy::items_after_test_module)] + pub mod hevc_mjpeg_guard { + include!(concat!( + env!("CARGO_MANIFEST_DIR"), + "/server/src/video_sinks/hevc_mjpeg_guard.rs" + )); - pub fn should_freeze(previous_bytes: u64, next_bytes: usize) -> bool { - should_freeze_decoded_mjpeg(previous_bytes, next_bytes) - } + pub fn should_freeze(previous_bytes: u64, next_bytes: usize) -> bool { + should_freeze_decoded_mjpeg(previous_bytes, next_bytes) + } - pub fn should_freeze_frame(previous_bytes: u64, decoded_mjpeg: &[u8]) -> bool { - should_freeze_decoded_mjpeg_frame(previous_bytes, decoded_mjpeg) - } + pub fn should_freeze_frame(previous_bytes: u64, decoded_mjpeg: &[u8]) -> bool { + should_freeze_decoded_mjpeg_frame(previous_bytes, decoded_mjpeg) + } - pub fn should_reject_direct_frame(previous_bytes: u64, mjpeg: &[u8]) -> bool { - should_reject_direct_mjpeg_frame(previous_bytes, mjpeg) - } + pub fn should_reject_direct_frame(previous_bytes: u64, mjpeg: &[u8]) -> bool { + should_reject_direct_mjpeg_frame(previous_bytes, mjpeg) + } - pub fn should_reject_direct_frame_with_budget( - previous_bytes: u64, - max_bytes: usize, - mjpeg: &[u8], - ) -> bool { - direct_mjpeg_reject_reason(previous_bytes, Some(max_bytes), None, mjpeg).is_some() + pub fn should_reject_direct_frame_with_budget( + previous_bytes: u64, + max_bytes: usize, + mjpeg: &[u8], + ) -> bool { + direct_mjpeg_reject_reason(previous_bytes, Some(max_bytes), None, mjpeg).is_some() + } } } +use video_sinks::hevc_mjpeg_guard as guard; const WEBCAM_SINK: &str = include_str!(concat!( env!("CARGO_MANIFEST_DIR"), diff --git a/tests/contract/server/video_sinks/server_video_sinks_include_contract.rs b/tests/contract/server/video_sinks/server_video_sinks_include_contract.rs index 95692fe..6fb8abf 100644 --- a/tests/contract/server/video_sinks/server_video_sinks_include_contract.rs +++ b/tests/contract/server/video_sinks/server_video_sinks_include_contract.rs @@ -20,7 +20,7 @@ mod video_support { mod media_timing; #[allow(warnings)] -mod video_sinks_include_contract { +mod video_sinks { include!(env!("LESAVKA_SERVER_VIDEO_SINKS_SRC")); use crate::camera::{CameraOutput, HdmiConnector, HdmiMode}; diff --git a/tests/regression/server/video_sinks/server_mjpeg_normalizer_memory_regression.rs b/tests/regression/server/video_sinks/server_mjpeg_normalizer_memory_regression.rs index 4fa07c4..9733014 100644 --- a/tests/regression/server/video_sinks/server_mjpeg_normalizer_memory_regression.rs +++ b/tests/regression/server/video_sinks/server_mjpeg_normalizer_memory_regression.rs @@ -18,21 +18,24 @@ mod video_support { } } -#[allow(clippy::items_after_test_module)] -mod guard { - include!(concat!( - env!("CARGO_MANIFEST_DIR"), - "/server/src/video_sinks/hevc_mjpeg_guard.rs" - )); +mod video_sinks { + #[allow(clippy::items_after_test_module)] + pub mod hevc_mjpeg_guard { + include!(concat!( + env!("CARGO_MANIFEST_DIR"), + "/server/src/video_sinks/hevc_mjpeg_guard.rs" + )); - pub fn normalizer_enabled() -> bool { - direct_mjpeg_normalize_enabled() - } + pub fn normalizer_enabled() -> bool { + direct_mjpeg_normalize_enabled() + } - pub fn normalizer_rss_limit_kb() -> Option { - direct_mjpeg_normalize_rss_limit_kb() + pub fn normalizer_rss_limit_kb() -> Option { + direct_mjpeg_normalize_rss_limit_kb() + } } } +use video_sinks::hevc_mjpeg_guard as guard; const SERVER_INSTALL: &str = include_str!(concat!( env!("CARGO_MANIFEST_DIR"), diff --git a/tests/unit/server/video_sinks/hevc_mjpeg_guard_unit.rs b/tests/unit/server/video_sinks/hevc_mjpeg_guard_unit.rs index faced26..ae1683c 100644 --- a/tests/unit/server/video_sinks/hevc_mjpeg_guard_unit.rs +++ b/tests/unit/server/video_sinks/hevc_mjpeg_guard_unit.rs @@ -16,33 +16,36 @@ mod video_support { } } -#[allow(clippy::items_after_test_module)] -mod guard { - include!(concat!( - env!("CARGO_MANIFEST_DIR"), - "/server/src/video_sinks/hevc_mjpeg_guard.rs" - )); +mod video_sinks { + #[allow(clippy::items_after_test_module)] + pub mod hevc_mjpeg_guard { + include!(concat!( + env!("CARGO_MANIFEST_DIR"), + "/server/src/video_sinks/hevc_mjpeg_guard.rs" + )); - pub fn jpeg_quality() -> u32 { - hevc_jpeg_quality() - } + pub fn jpeg_quality() -> u32 { + hevc_jpeg_quality() + } - pub fn min_reference() -> u32 { - min_reference_bytes() - } + pub fn min_reference() -> u32 { + min_reference_bytes() + } - pub fn drop_pct() -> u32 { - size_drop_pct() - } + pub fn drop_pct() -> u32 { + size_drop_pct() + } - pub fn should_freeze(previous_bytes: u64, next_bytes: usize) -> bool { - should_freeze_decoded_mjpeg(previous_bytes, next_bytes) - } + pub fn should_freeze(previous_bytes: u64, next_bytes: usize) -> bool { + should_freeze_decoded_mjpeg(previous_bytes, next_bytes) + } - pub fn should_freeze_frame(previous_bytes: u64, decoded_mjpeg: &[u8]) -> bool { - should_freeze_decoded_mjpeg_frame(previous_bytes, decoded_mjpeg) + pub fn should_freeze_frame(previous_bytes: u64, decoded_mjpeg: &[u8]) -> bool { + should_freeze_decoded_mjpeg_frame(previous_bytes, decoded_mjpeg) + } } } +use video_sinks::hevc_mjpeg_guard as guard; #[derive(Default)] struct GuardedFrameEmitter {