121 lines
3.5 KiB
Rust
121 lines
3.5 KiB
Rust
//! Include-based coverage for server camera sink internals.
|
|
//!
|
|
//! Scope: include `server/src/video_sinks.rs` and directly exercise private sink
|
|
//! selection/dispatch helpers through stable constructor paths.
|
|
//! Targets: `server/src/video_sinks.rs`.
|
|
//! Why: sink internals carry substantial branch logic beyond public smoke tests.
|
|
|
|
mod camera {
|
|
pub use lesavka_server::camera::*;
|
|
}
|
|
|
|
mod video_support {
|
|
pub use lesavka_server::video_support::*;
|
|
}
|
|
|
|
#[allow(warnings)]
|
|
mod video_sinks_include_contract {
|
|
include!(env!("LESAVKA_SERVER_VIDEO_SINKS_SRC"));
|
|
|
|
use crate::camera::CameraOutput;
|
|
use serial_test::serial;
|
|
use temp_env::with_var;
|
|
|
|
fn cfg(codec: CameraCodec) -> CameraConfig {
|
|
CameraConfig {
|
|
output: CameraOutput::Hdmi,
|
|
codec,
|
|
width: 640,
|
|
height: 360,
|
|
fps: 24,
|
|
hdmi: None,
|
|
}
|
|
}
|
|
|
|
fn init_gst() {
|
|
let _ = gst::init();
|
|
}
|
|
|
|
#[test]
|
|
#[serial]
|
|
fn build_hdmi_sink_respects_env_override_success_path() {
|
|
init_gst();
|
|
with_var("LESAVKA_HDMI_SINK", Some("autovideosink"), || {
|
|
let sink = build_hdmi_sink(&cfg(CameraCodec::H264));
|
|
assert!(sink.is_ok(), "known override sink should build");
|
|
});
|
|
}
|
|
|
|
#[test]
|
|
#[serial]
|
|
fn build_hdmi_sink_invalid_override_surfaces_error() {
|
|
init_gst();
|
|
with_var(
|
|
"LESAVKA_HDMI_SINK",
|
|
Some("definitely-not-a-real-gst-element"),
|
|
|| {
|
|
let sink = build_hdmi_sink(&cfg(CameraCodec::H264));
|
|
assert!(sink.is_err(), "invalid override must fail");
|
|
},
|
|
);
|
|
}
|
|
|
|
#[test]
|
|
#[serial]
|
|
fn build_hdmi_sink_falls_back_when_override_is_unset() {
|
|
init_gst();
|
|
with_var("LESAVKA_HDMI_SINK", None::<&str>, || {
|
|
let sink = build_hdmi_sink(&cfg(CameraCodec::H264));
|
|
assert!(sink.is_ok(), "fallback sink should build");
|
|
});
|
|
}
|
|
|
|
#[test]
|
|
#[serial]
|
|
fn camera_sink_dispatch_is_stable_for_hdmi_variant() {
|
|
with_var("LESAVKA_HDMI_SINK", Some("autovideosink"), || {
|
|
if let Ok(sink) = HdmiSink::new(&cfg(CameraCodec::Mjpeg)) {
|
|
let cam_sink = CameraSink::Hdmi(sink);
|
|
cam_sink.push(VideoPacket {
|
|
id: 8,
|
|
pts: 1,
|
|
data: vec![0xFF, 0xD8, 0xFF, 0xD9],
|
|
..Default::default()
|
|
});
|
|
}
|
|
});
|
|
}
|
|
|
|
#[test]
|
|
#[serial]
|
|
fn camera_sink_dispatch_is_stable_for_uvc_variant() {
|
|
if let Ok(sink) = WebcamSink::new("/dev/video-definitely-missing", &cfg(CameraCodec::Mjpeg))
|
|
{
|
|
let cam_sink = CameraSink::Uvc(sink);
|
|
cam_sink.push(VideoPacket {
|
|
id: 9,
|
|
pts: 2,
|
|
data: vec![0xFF, 0xD8, 0xFF, 0xD9],
|
|
..Default::default()
|
|
});
|
|
}
|
|
}
|
|
|
|
#[test]
|
|
#[serial]
|
|
fn camera_relay_feed_covers_dev_mode_dump_branch_without_panicking() {
|
|
with_var("LESAVKA_DEV_MODE", Some("1"), || {
|
|
with_var("LESAVKA_HDMI_SINK", Some("autovideosink"), || {
|
|
if let Ok(relay) = CameraRelay::new_hdmi(3, &cfg(CameraCodec::H264)) {
|
|
relay.feed(VideoPacket {
|
|
id: 3,
|
|
pts: 3,
|
|
data: vec![0, 0, 0, 1, 0x65, 0x88, 0x84],
|
|
..Default::default()
|
|
});
|
|
}
|
|
});
|
|
});
|
|
}
|
|
}
|