lesavka/tests/integration/common/proto/relay_opus_proto_integration_contract.rs

66 lines
2.0 KiB
Rust

// Protocol contract for optional Opus audio transport.
//
// Scope: inspect the protobuf schema and generated Rust structs.
// Targets: `common/proto/lesavka.proto`.
// Why: Opus must be introduced as an explicit payload codec on Lesavka's
// bundled gRPC transport, not as a silent SIP/RTP side channel.
use lesavka_common::audio_transport::{AudioTransportProfile, bundle_audio_profile};
use lesavka_common::lesavka::{AudioEncoding, AudioPacket, UpstreamMediaBundle};
const PROTO: &str = include_str!(concat!(
env!("CARGO_MANIFEST_DIR"),
"/common/proto/lesavka.proto"
));
#[test]
fn proto_exposes_opus_without_adding_sip_or_rtp_transport() {
for expected in [
"enum AudioEncoding",
"PCM_S16LE = 1",
"OPUS = 2",
"AudioEncoding encoding = 9",
"uint32 sample_rate = 10",
"uint32 channels = 11",
"uint32 frame_duration_us = 12",
"AudioEncoding audio_encoding = 12",
"rpc StreamWebcamMedia(stream UpstreamMediaBundle)",
] {
assert!(
PROTO.contains(expected),
"proto should preserve Opus transport marker {expected}"
);
}
for forbidden in ["SIP", "RTP", "sipp", "rtpmap"] {
assert!(
!PROTO.contains(forbidden),
"Opus testing should stay on Lesavka bundled gRPC transport, not {forbidden}"
);
}
}
#[test]
fn generated_bundle_can_describe_opus_audio_payloads() {
let packet = AudioPacket {
encoding: AudioEncoding::Opus as i32,
sample_rate: 48_000,
channels: 2,
frame_duration_us: 20_000,
data: vec![0x41; 160],
..AudioPacket::default()
};
let bundle = UpstreamMediaBundle {
audio_encoding: AudioEncoding::Opus as i32,
audio_sample_rate: 48_000,
audio_channels: 2,
audio: vec![packet],
..UpstreamMediaBundle::default()
};
assert_eq!(
bundle_audio_profile(&bundle),
AudioTransportProfile::opus_voice()
);
}