Skip to content
File

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

rust99 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 bidirectional_same_m_line() -> 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.add_host_candidate((Ipv4Addr::new(1, 1, 1, 1), 1000).into());
20 r.add_host_candidate((Ipv4Addr::new(2, 2, 2, 2), 2000).into());
21 
22 let mut change = l.sdp_api();
23 let mid = change.add_media(MediaKind::Audio, Direction::SendRecv, None, None, None);
24 let (offer, pending) = change.apply().unwrap();
25 
26 let answer = r.rtc.sdp_api().accept_offer(offer)?;
27 l.rtc.sdp_api().accept_answer(pending, answer)?;
28 
29 loop {
30 if l.is_connected() || r.is_connected() {
31 break;
32 }
33 progress(&mut l, &mut r)?;
34 }
35 
36 let max = l.last.max(r.last);
37 l.last = max;
38 r.last = max;
39 
40 let params = l.params_opus();
41 assert_eq!(params.spec().codec, Codec::Opus);
42 let pt = params.pt();
43 
44 let data_a = vec![1_u8; 80];
45 let data_b = vec![2_u8; 80];
46 
47 loop {
48 {
49 let wallclock = l.start + l.duration();
50 let time = l.duration().into();
51 l.writer(mid)
52 .unwrap()
53 .write(pt, wallclock, time, data_a.clone())?;
54 }
55 
56 progress(&mut l, &mut r)?;
57 
58 {
59 let wallclock = r.start + r.duration();
60 let time = l.duration().into();
61 r.writer(mid)
62 .unwrap()
63 .write(pt, wallclock, time, data_b.clone())?;
64 }
65 
66 progress(&mut l, &mut r)?;
67 
68 if l.duration() > Duration::from_secs(12) {
69 break;
70 }
71 }
72 
73 let media_count_r = r
74 .events
75 .iter()
76 .filter(|(_, e)| matches!(e, Event::MediaData(_)))
77 .count();
78 
79 assert!(
80 media_count_r > 170,
81 "Not enough MediaData at R: {}",
82 media_count_r
83 );
84 
85 let media_count_l = l
86 .events
87 .iter()
88 .filter(|(_, e)| matches!(e, Event::MediaData(_)))
89 .count();
90 
91 assert!(
92 media_count_l > 300,
93 "Not enough MediaData at L: {}",
94 media_count_l
95 );
96 
97 Ok(())
98}