lesavka/tests/contract/server/audio/server_opus_uac_contract.rs

69 lines
2.1 KiB
Rust

// Server contract for future Opus upstream audio handoff.
//
// Scope: inspect the UAC voice sink and shared audio transport helpers.
// Targets: `server/src/audio/voice_input.rs` and `common/src/audio_transport.rs`.
// Why: compressed Opus payloads must be decoded to PCM before UAC. If decode is
// unavailable or fails, the packet should be rejected safely and visibly.
use lesavka_common::audio_transport::{
AudioTransportProfile, packet_audio_profile, packet_is_raw_pcm_s16le,
};
use lesavka_common::lesavka::{AudioEncoding, AudioPacket};
const VOICE_INPUT: &str = include_str!(concat!(
env!("CARGO_MANIFEST_DIR"),
"/server/src/audio/voice_input.rs"
));
const OPUS_DECODE: &str = include_str!(concat!(
env!("CARGO_MANIFEST_DIR"),
"/server/src/audio/opus_decode.rs"
));
#[test]
fn uac_sink_remains_raw_pcm_and_guards_compressed_packets() {
for expected in [
"audio/x-raw",
"S16LE",
"packet_is_raw_pcm_s16le",
"AudioEncoding::Opus",
"decode_packet(pkt)",
"dropping Opus microphone packet because opusdec is unavailable",
"dropping Opus microphone packet after decode failure",
] {
assert!(
VOICE_INPUT.contains(expected),
"UAC sink should preserve compressed-audio safety marker {expected}"
);
}
for expected in [
"OpusPacketDecoder",
"opusdec",
"audio/x-opus",
"audio/x-raw",
] {
assert!(
OPUS_DECODE.contains(expected),
"Opus decoder should preserve decode-to-PCM marker {expected}"
);
}
}
#[test]
fn opus_packets_are_detected_as_compressed_before_uac_handoff() {
let opus_packet = AudioPacket {
encoding: AudioEncoding::Opus as i32,
sample_rate: 48_000,
channels: 2,
frame_duration_us: 20_000,
data: vec![0x55; 160],
..AudioPacket::default()
};
assert_eq!(
packet_audio_profile(&opus_packet),
AudioTransportProfile::opus_voice()
);
assert!(!packet_is_raw_pcm_s16le(&opus_packet));
assert!(packet_is_raw_pcm_s16le(&AudioPacket::default()));
}