Skip to content
File

Blob: firmware/vendor/str0m/tests/unidirectional.rs

rust88 lines
1use std::net::Ipv4Addr;
2use std::time::Duration;
3 
4use str0m::format::Codec;
5use str0m::media::{Direction, MediaKind};
6use str0m::{Event, RtcError};
7 
8mod common;
9use common::{Peer, TestRtc, init_crypto_default, init_log, progress};
10 
11#[test]
12pub fn unidirectional() -> Result<(), RtcError> {
13 init_log();
14 init_crypto_default();
15 
16 let mut l = TestRtc::new(Peer::Left);
17 let mut r = TestRtc::new(Peer::Right);
18 
19 l.set_forced_time_advance(Duration::from_millis(1));
20 r.set_forced_time_advance(Duration::from_millis(1));
21 
22 l.add_host_candidate((Ipv4Addr::new(1, 1, 1, 1), 1000).into());
23 r.add_host_candidate((Ipv4Addr::new(2, 2, 2, 2), 2000).into());
24 
25 // The change is on the L (sending side) with Direction::SendRecv.
26 let mut change = l.sdp_api();
27 let mid = change.add_media(MediaKind::Audio, Direction::SendRecv, None, None, None);
28 let (offer, pending) = change.apply().unwrap();
29 
30 let answer = r.rtc.sdp_api().accept_offer(offer)?;
31 l.rtc.sdp_api().accept_answer(pending, answer)?;
32 
33 loop {
34 if l.is_connected() || r.is_connected() {
35 break;
36 }
37 progress(&mut l, &mut r)?;
38 }
39 
40 let max = l.last.max(r.last);
41 l.last = max;
42 r.last = max;
43 
44 let params = l.params_opus();
45 assert_eq!(params.spec().codec, Codec::Opus);
46 let pt = params.pt();
47 
48 let data_a = vec![1_u8; 80];
49 
50 let mut start_of_talk_spurt = true;
51 loop {
52 let wallclock = l.start + l.duration();
53 let time = l.duration().into();
54 l.writer(mid)
55 .unwrap()
56 .start_of_talkspurt(start_of_talk_spurt)
57 .write(pt, wallclock, time, data_a.clone())?;
58 start_of_talk_spurt = false;
59 
60 progress(&mut l, &mut r)?;
61 
62 if l.duration() > Duration::from_secs(10) {
63 break;
64 }
65 }
66 
67 let media_count = r
68 .events
69 .iter()
70 .filter(|(_, e)| matches!(e, Event::MediaData(_)))
71 .count();
72 
73 assert!(media_count > 800, "Not enough MediaData: {}", media_count);
74 
75 assert!(
76 r.events
77 .iter()
78 .find_map(|(_, e)| match e {
79 Event::MediaData(m) => Some(m),
80 _ => None,
81 })
82 .expect("no MediaData event found")
83 .audio_start_of_talk_spurt
84 );
85 
86 Ok(())
87}