oxpulse_sfu_kit/client/
test_seed.rs1use std::sync::Arc;
7use std::time::Instant;
8
9use str0m::format::{Codec, CodecExtra, CodecSpec, FormatParams, PayloadParams};
10use str0m::media::{Frequency, MediaData, MediaKind, MediaTime, Mid, Pt, Rid};
11use str0m::rtp::{ExtensionValues, SeqNo};
12
13use crate::ids::SfuRid;
14use crate::media::SfuMediaPayload;
15use crate::rtc::SfuRtc;
16
17use super::tracks::{TrackIn, TrackInEntry};
18use super::Client;
19use crate::metrics::SfuMetrics;
20use crate::propagate::ClientId;
21
22impl Client {
23 pub fn seed_active_rid_for_tests(&mut self, rid: Rid) {
29 self.active_rids.insert(SfuRid::from_str0m(rid));
30 }
31
32 pub fn disconnect_for_tests(&mut self) {
37 self.rtc.disconnect();
38 }
39}
40
41pub fn new_client(id: ClientId) -> Client {
47 let rtc = SfuRtc::from_raw(str0m::Rtc::builder().build(Instant::now()));
48 let metrics = Arc::new(SfuMetrics::new_default());
49 let mut c = Client::new(rtc, metrics);
50 c.id = id;
51 c
52}
53
54pub fn seed_track_in(client: &mut Client, mid_tag: u8, kind: MediaKind) -> Arc<TrackIn> {
59 let mid: Mid = Mid::from(&*format!("m{mid_tag}"));
60 let entry = TrackInEntry {
61 id: Arc::new(TrackIn {
62 origin: client.id,
63 mid,
64 kind,
65 relay_source: false,
66 }),
67 last_keyframe_request: None,
68 };
69 let arc = entry.id.clone();
70 client.tracks_in.push(entry);
71 arc
72}
73
74pub fn make_media_data(mid_tag: u8, rid: Option<SfuRid>) -> SfuMediaPayload {
80 let mid: Mid = Mid::from(&*format!("m{mid_tag}"));
81 let pt = Pt::from(96u8);
82 let seq: SeqNo = 0u64.into();
83 let params = PayloadParams::new(
84 pt,
85 None,
86 CodecSpec {
87 codec: Codec::Vp8,
88 clock_rate: Frequency::NINETY_KHZ,
89 channels: None,
90 format: FormatParams::default(),
91 },
92 );
93 let raw = MediaData {
94 mid,
95 pt,
96 rid: rid.map(|r| r.to_str0m()),
97 params,
98 time: MediaTime::from_90khz(0),
99 network_time: Instant::now(),
100 seq_range: seq..=seq,
101 data: vec![0xde, 0xad, 0xbe, 0xef],
102 ext_vals: ExtensionValues::default(),
103 codec_extra: CodecExtra::None,
104 contiguous: true,
105 last_sender_info: None,
106 audio_start_of_talk_spurt: false,
107 };
108 SfuMediaPayload::from_str0m(raw)
109}
110
111pub fn seed_track_in_relay(client: &mut Client, mid_tag: u8, kind: MediaKind) -> Arc<TrackIn> {
116 let mid: Mid = Mid::from(&*format!("m{mid_tag}"));
117 let entry = TrackInEntry {
118 id: Arc::new(TrackIn {
119 origin: client.id,
120 mid,
121 kind,
122 relay_source: true,
123 }),
124 last_keyframe_request: None,
125 };
126 let arc = entry.id.clone();
127 client.tracks_in.push(entry);
128 arc
129}
130
131pub fn open_track_out_for_tests(subscriber: &mut Client, track_in: &Arc<TrackIn>) {
137 for track_out in subscriber.tracks_out.iter_mut() {
138 if track_out.track_in.upgrade().as_deref().map(|t| t.mid) == Some(track_in.mid) {
139 track_out.state = crate::client::tracks::TrackOutState::Open(track_in.mid);
140 return;
141 }
142 }
143 panic!("no track_out found for mid {:?}", track_in.mid);
144}