xref: /webrtc/util/src/buffer/buffer_test.rs (revision 5d8fe953)
1ffe74184SMartin Algesten use super::*;
2ffe74184SMartin Algesten use crate::error::Error;
3ffe74184SMartin Algesten 
4ffe74184SMartin Algesten use tokio::sync::mpsc;
5ffe74184SMartin Algesten use tokio::time::{sleep, Duration};
6ffe74184SMartin Algesten use tokio_test::assert_ok;
7ffe74184SMartin Algesten 
8ffe74184SMartin Algesten #[tokio::test]
test_buffer()9ffe74184SMartin Algesten async fn test_buffer() {
10ffe74184SMartin Algesten     let buffer = Buffer::new(0, 0);
11ffe74184SMartin Algesten     let mut packet: Vec<u8> = vec![0; 4];
12ffe74184SMartin Algesten 
13ffe74184SMartin Algesten     // Write once
14ffe74184SMartin Algesten     let n = assert_ok!(buffer.write(&[0, 1]).await);
15ffe74184SMartin Algesten     assert_eq!(n, 2, "n must be 2");
16ffe74184SMartin Algesten 
17ffe74184SMartin Algesten     // Read once
18ffe74184SMartin Algesten     let n = assert_ok!(buffer.read(&mut packet, None).await);
19ffe74184SMartin Algesten     assert_eq!(n, 2, "n must be 2");
2083f2d1bbSVincent Esche     assert_eq!(&packet[..n], &[0, 1]);
21ffe74184SMartin Algesten 
22ffe74184SMartin Algesten     // Read deadline
23ffe74184SMartin Algesten     let result = buffer.read(&mut packet, Some(Duration::new(0, 1))).await;
24ffe74184SMartin Algesten     assert!(result.is_err());
2583f2d1bbSVincent Esche     assert_eq!(result.unwrap_err(), Error::ErrTimeout);
26ffe74184SMartin Algesten 
27ffe74184SMartin Algesten     // Write twice
28ffe74184SMartin Algesten     let n = assert_ok!(buffer.write(&[2, 3, 4]).await);
29ffe74184SMartin Algesten     assert_eq!(n, 3, "n must be 3");
30ffe74184SMartin Algesten 
31ffe74184SMartin Algesten     let n = assert_ok!(buffer.write(&[5, 6, 7]).await);
32ffe74184SMartin Algesten     assert_eq!(n, 3, "n must be 3");
33ffe74184SMartin Algesten 
34ffe74184SMartin Algesten     // Read twice
35ffe74184SMartin Algesten     let n = assert_ok!(buffer.read(&mut packet, None).await);
36ffe74184SMartin Algesten     assert_eq!(n, 3, "n must be 3");
3783f2d1bbSVincent Esche     assert_eq!(&packet[..n], &[2, 3, 4]);
38ffe74184SMartin Algesten 
39ffe74184SMartin Algesten     let n = assert_ok!(buffer.read(&mut packet, None).await);
40ffe74184SMartin Algesten     assert_eq!(n, 3, "n must be 3");
4183f2d1bbSVincent Esche     assert_eq!(&packet[..n], &[5, 6, 7]);
42ffe74184SMartin Algesten 
43ffe74184SMartin Algesten     // Write once prior to close.
44ffe74184SMartin Algesten     let n = assert_ok!(buffer.write(&[3]).await);
45ffe74184SMartin Algesten     assert_eq!(n, 1, "n must be 1");
46ffe74184SMartin Algesten 
47ffe74184SMartin Algesten     // Close
48ffe74184SMartin Algesten     buffer.close().await;
49ffe74184SMartin Algesten 
50ffe74184SMartin Algesten     // Future writes will error
51ffe74184SMartin Algesten     let result = buffer.write(&[4]).await;
52ffe74184SMartin Algesten     assert!(result.is_err());
53ffe74184SMartin Algesten 
54ffe74184SMartin Algesten     // But we can read the remaining data.
55ffe74184SMartin Algesten     let n = assert_ok!(buffer.read(&mut packet, None).await);
56ffe74184SMartin Algesten     assert_eq!(n, 1, "n must be 1");
5783f2d1bbSVincent Esche     assert_eq!(&packet[..n], &[3]);
58ffe74184SMartin Algesten 
59ffe74184SMartin Algesten     // Until EOF
60ffe74184SMartin Algesten     let result = buffer.read(&mut packet, None).await;
61ffe74184SMartin Algesten     assert!(result.is_err());
62ffe74184SMartin Algesten     assert_eq!(Error::ErrBufferClosed, result.unwrap_err());
63ffe74184SMartin Algesten }
64ffe74184SMartin Algesten 
test_wraparound(grow: bool)65ffe74184SMartin Algesten async fn test_wraparound(grow: bool) {
66ffe74184SMartin Algesten     let buffer = Buffer::new(0, 0);
67ffe74184SMartin Algesten     {
68ffe74184SMartin Algesten         let mut b = buffer.buffer.lock().await;
69ffe74184SMartin Algesten         let result = b.grow();
70ffe74184SMartin Algesten         assert!(result.is_ok());
71ffe74184SMartin Algesten 
72ffe74184SMartin Algesten         b.head = b.data.len() - 13;
73ffe74184SMartin Algesten         b.tail = b.head;
74ffe74184SMartin Algesten     }
75ffe74184SMartin Algesten 
76ffe74184SMartin Algesten     let p1 = vec![1, 2, 3];
77ffe74184SMartin Algesten     let p2 = vec![4, 5, 6];
78ffe74184SMartin Algesten     let p3 = vec![7, 8, 9];
79ffe74184SMartin Algesten     let p4 = vec![10, 11, 12];
80ffe74184SMartin Algesten 
81ffe74184SMartin Algesten     assert_ok!(buffer.write(&p1).await);
82ffe74184SMartin Algesten     assert_ok!(buffer.write(&p2).await);
83ffe74184SMartin Algesten     assert_ok!(buffer.write(&p3).await);
84ffe74184SMartin Algesten 
85ffe74184SMartin Algesten     let mut p = vec![0; 10];
86ffe74184SMartin Algesten 
87ffe74184SMartin Algesten     let n = assert_ok!(buffer.read(&mut p, None).await);
88ffe74184SMartin Algesten     assert_eq!(&p1[..], &p[..n]);
89ffe74184SMartin Algesten 
90ffe74184SMartin Algesten     if grow {
91ffe74184SMartin Algesten         let mut b = buffer.buffer.lock().await;
92ffe74184SMartin Algesten         let result = b.grow();
93ffe74184SMartin Algesten         assert!(result.is_ok());
94ffe74184SMartin Algesten     }
95ffe74184SMartin Algesten 
96ffe74184SMartin Algesten     let n = assert_ok!(buffer.read(&mut p, None).await);
97ffe74184SMartin Algesten     assert_eq!(&p2[..], &p[..n]);
98ffe74184SMartin Algesten 
99ffe74184SMartin Algesten     assert_ok!(buffer.write(&p4).await);
100ffe74184SMartin Algesten 
101ffe74184SMartin Algesten     let n = assert_ok!(buffer.read(&mut p, None).await);
102ffe74184SMartin Algesten     assert_eq!(&p3[..], &p[..n]);
103ffe74184SMartin Algesten     let n = assert_ok!(buffer.read(&mut p, None).await);
104ffe74184SMartin Algesten     assert_eq!(&p4[..], &p[..n]);
105ffe74184SMartin Algesten 
106ffe74184SMartin Algesten     {
107ffe74184SMartin Algesten         let b = buffer.buffer.lock().await;
108ffe74184SMartin Algesten         if !grow {
109ffe74184SMartin Algesten             assert_eq!(b.data.len(), MIN_SIZE);
110ffe74184SMartin Algesten         } else {
111ffe74184SMartin Algesten             assert_eq!(b.data.len(), 2 * MIN_SIZE);
112ffe74184SMartin Algesten         }
113ffe74184SMartin Algesten     }
114ffe74184SMartin Algesten }
115ffe74184SMartin Algesten 
116ffe74184SMartin Algesten #[tokio::test]
test_buffer_wraparound()117ffe74184SMartin Algesten async fn test_buffer_wraparound() {
118ffe74184SMartin Algesten     test_wraparound(false).await;
119ffe74184SMartin Algesten }
120ffe74184SMartin Algesten 
121ffe74184SMartin Algesten #[tokio::test]
test_buffer_wraparound_grow()122ffe74184SMartin Algesten async fn test_buffer_wraparound_grow() {
123ffe74184SMartin Algesten     test_wraparound(true).await;
124ffe74184SMartin Algesten }
125ffe74184SMartin Algesten 
126ffe74184SMartin Algesten #[tokio::test]
test_buffer_async()127ffe74184SMartin Algesten async fn test_buffer_async() {
128ffe74184SMartin Algesten     let buffer = Buffer::new(0, 0);
129ffe74184SMartin Algesten 
130ffe74184SMartin Algesten     let (done_tx, mut done_rx) = mpsc::channel::<()>(1);
131ffe74184SMartin Algesten 
132ffe74184SMartin Algesten     let buffer2 = buffer.clone();
133ffe74184SMartin Algesten     tokio::spawn(async move {
134ffe74184SMartin Algesten         let mut packet: Vec<u8> = vec![0; 4];
135ffe74184SMartin Algesten 
136ffe74184SMartin Algesten         let n = assert_ok!(buffer2.read(&mut packet, None).await);
137ffe74184SMartin Algesten         assert_eq!(n, 2, "n must be 2");
13883f2d1bbSVincent Esche         assert_eq!(&packet[..n], &[0, 1]);
139ffe74184SMartin Algesten 
140ffe74184SMartin Algesten         let result = buffer2.read(&mut packet, None).await;
141ffe74184SMartin Algesten         assert!(result.is_err());
14283f2d1bbSVincent Esche         assert_eq!(result.unwrap_err(), Error::ErrBufferClosed);
143ffe74184SMartin Algesten 
144ffe74184SMartin Algesten         drop(done_tx);
145ffe74184SMartin Algesten     });
146ffe74184SMartin Algesten 
147ffe74184SMartin Algesten     // Wait for the reader to start reading.
148ffe74184SMartin Algesten     sleep(Duration::from_micros(1)).await;
149ffe74184SMartin Algesten 
150ffe74184SMartin Algesten     // Write once
151ffe74184SMartin Algesten     let n = assert_ok!(buffer.write(&[0, 1]).await);
152ffe74184SMartin Algesten     assert_eq!(n, 2, "n must be 2");
153ffe74184SMartin Algesten 
154ffe74184SMartin Algesten     // Wait for the reader to start reading again.
155ffe74184SMartin Algesten     sleep(Duration::from_micros(1)).await;
156ffe74184SMartin Algesten 
157ffe74184SMartin Algesten     // Close will unblock the reader.
158ffe74184SMartin Algesten     buffer.close().await;
159ffe74184SMartin Algesten 
160ffe74184SMartin Algesten     done_rx.recv().await;
161ffe74184SMartin Algesten }
162ffe74184SMartin Algesten 
163ffe74184SMartin Algesten #[tokio::test]
test_buffer_limit_count()164ffe74184SMartin Algesten async fn test_buffer_limit_count() {
165ffe74184SMartin Algesten     let buffer = Buffer::new(2, 0);
166ffe74184SMartin Algesten 
16783f2d1bbSVincent Esche     assert_eq!(buffer.count().await, 0);
168ffe74184SMartin Algesten 
169ffe74184SMartin Algesten     // Write twice
170ffe74184SMartin Algesten     let n = assert_ok!(buffer.write(&[0, 1]).await);
171ffe74184SMartin Algesten     assert_eq!(n, 2, "n must be 2");
17283f2d1bbSVincent Esche     assert_eq!(buffer.count().await, 1);
173ffe74184SMartin Algesten 
174ffe74184SMartin Algesten     let n = assert_ok!(buffer.write(&[2, 3]).await);
175ffe74184SMartin Algesten     assert_eq!(n, 2, "n must be 2");
17683f2d1bbSVincent Esche     assert_eq!(buffer.count().await, 2);
177ffe74184SMartin Algesten 
178ffe74184SMartin Algesten     // Over capacity
179ffe74184SMartin Algesten     let result = buffer.write(&[4, 5]).await;
180ffe74184SMartin Algesten     assert!(result.is_err());
181ffe74184SMartin Algesten     if let Err(err) = result {
18283f2d1bbSVincent Esche         assert_eq!(err, Error::ErrBufferFull);
183ffe74184SMartin Algesten     }
18483f2d1bbSVincent Esche     assert_eq!(buffer.count().await, 2);
185ffe74184SMartin Algesten 
186ffe74184SMartin Algesten     // Read once
187ffe74184SMartin Algesten     let mut packet: Vec<u8> = vec![0; 4];
188ffe74184SMartin Algesten     let n = assert_ok!(buffer.read(&mut packet, None).await);
189ffe74184SMartin Algesten     assert_eq!(n, 2, "n must be 2");
19083f2d1bbSVincent Esche     assert_eq!(&packet[..n], &[0, 1]);
19183f2d1bbSVincent Esche     assert_eq!(buffer.count().await, 1);
192ffe74184SMartin Algesten 
193ffe74184SMartin Algesten     // Write once
194ffe74184SMartin Algesten     let n = assert_ok!(buffer.write(&[6, 7]).await);
195ffe74184SMartin Algesten     assert_eq!(n, 2, "n must be 2");
19683f2d1bbSVincent Esche     assert_eq!(buffer.count().await, 2);
197ffe74184SMartin Algesten 
198ffe74184SMartin Algesten     // Over capacity
199ffe74184SMartin Algesten     let result = buffer.write(&[8, 9]).await;
200ffe74184SMartin Algesten     assert!(result.is_err());
201ffe74184SMartin Algesten     if let Err(err) = result {
202ffe74184SMartin Algesten         assert_eq!(Error::ErrBufferFull, err);
203ffe74184SMartin Algesten     }
20483f2d1bbSVincent Esche     assert_eq!(buffer.count().await, 2);
205ffe74184SMartin Algesten 
206ffe74184SMartin Algesten     // Read twice
207ffe74184SMartin Algesten     let n = assert_ok!(buffer.read(&mut packet, None).await);
208ffe74184SMartin Algesten     assert_eq!(n, 2, "n must be 2");
20983f2d1bbSVincent Esche     assert_eq!(&packet[..n], &[2, 3]);
21083f2d1bbSVincent Esche     assert_eq!(buffer.count().await, 1);
211ffe74184SMartin Algesten 
212ffe74184SMartin Algesten     let n = assert_ok!(buffer.read(&mut packet, None).await);
213ffe74184SMartin Algesten     assert_eq!(n, 2, "n must be 2");
21483f2d1bbSVincent Esche     assert_eq!(&packet[..n], &[6, 7]);
21583f2d1bbSVincent Esche     assert_eq!(buffer.count().await, 0);
216ffe74184SMartin Algesten 
217ffe74184SMartin Algesten     // Nothing left.
218ffe74184SMartin Algesten     buffer.close().await;
219ffe74184SMartin Algesten }
220ffe74184SMartin Algesten 
221ffe74184SMartin Algesten #[tokio::test]
test_buffer_limit_size()222ffe74184SMartin Algesten async fn test_buffer_limit_size() {
223ffe74184SMartin Algesten     let buffer = Buffer::new(0, 11);
224ffe74184SMartin Algesten 
22583f2d1bbSVincent Esche     assert_eq!(buffer.size().await, 0);
226ffe74184SMartin Algesten 
227ffe74184SMartin Algesten     // Write twice
228ffe74184SMartin Algesten     let n = assert_ok!(buffer.write(&[0, 1]).await);
229ffe74184SMartin Algesten     assert_eq!(n, 2, "n must be 2");
23083f2d1bbSVincent Esche     assert_eq!(buffer.size().await, 4);
231ffe74184SMartin Algesten 
232ffe74184SMartin Algesten     let n = assert_ok!(buffer.write(&[2, 3]).await);
233ffe74184SMartin Algesten     assert_eq!(n, 2, "n must be 2");
23483f2d1bbSVincent Esche     assert_eq!(buffer.size().await, 8);
235ffe74184SMartin Algesten 
236ffe74184SMartin Algesten     // Over capacity
237ffe74184SMartin Algesten     let result = buffer.write(&[4, 5]).await;
238ffe74184SMartin Algesten     assert!(result.is_err());
239ffe74184SMartin Algesten     if let Err(err) = result {
240ffe74184SMartin Algesten         assert_eq!(Error::ErrBufferFull, err);
241ffe74184SMartin Algesten     }
24283f2d1bbSVincent Esche     assert_eq!(buffer.size().await, 8);
243ffe74184SMartin Algesten 
244ffe74184SMartin Algesten     // Cheeky write at exact size.
245ffe74184SMartin Algesten     let n = assert_ok!(buffer.write(&[6]).await);
246ffe74184SMartin Algesten     assert_eq!(n, 1, "n must be 1");
24783f2d1bbSVincent Esche     assert_eq!(buffer.size().await, 11);
248ffe74184SMartin Algesten 
249ffe74184SMartin Algesten     // Read once
250ffe74184SMartin Algesten     let mut packet: Vec<u8> = vec![0; 4];
251ffe74184SMartin Algesten     let n = assert_ok!(buffer.read(&mut packet, None).await);
252ffe74184SMartin Algesten     assert_eq!(n, 2, "n must be 2");
25383f2d1bbSVincent Esche     assert_eq!(&packet[..n], &[0, 1]);
25483f2d1bbSVincent Esche     assert_eq!(buffer.size().await, 7);
255ffe74184SMartin Algesten 
256ffe74184SMartin Algesten     // Write once
257ffe74184SMartin Algesten     let n = assert_ok!(buffer.write(&[7, 8]).await);
258ffe74184SMartin Algesten     assert_eq!(n, 2, "n must be 2");
25983f2d1bbSVincent Esche     assert_eq!(buffer.size().await, 11);
260ffe74184SMartin Algesten 
261ffe74184SMartin Algesten     // Over capacity
262ffe74184SMartin Algesten     let result = buffer.write(&[9, 10]).await;
263ffe74184SMartin Algesten     assert!(result.is_err());
264ffe74184SMartin Algesten     if let Err(err) = result {
265ffe74184SMartin Algesten         assert_eq!(Error::ErrBufferFull, err);
266ffe74184SMartin Algesten     }
26783f2d1bbSVincent Esche     assert_eq!(buffer.size().await, 11);
268ffe74184SMartin Algesten 
269ffe74184SMartin Algesten     // Read everything
270ffe74184SMartin Algesten     let n = assert_ok!(buffer.read(&mut packet, None).await);
271ffe74184SMartin Algesten     assert_eq!(n, 2, "n must be 2");
27283f2d1bbSVincent Esche     assert_eq!(&packet[..n], &[2, 3]);
27383f2d1bbSVincent Esche     assert_eq!(buffer.size().await, 7);
274ffe74184SMartin Algesten 
275ffe74184SMartin Algesten     let n = assert_ok!(buffer.read(&mut packet, None).await);
276ffe74184SMartin Algesten     assert_eq!(n, 1, "n must be 1");
27783f2d1bbSVincent Esche     assert_eq!(&packet[..n], &[6]);
27883f2d1bbSVincent Esche     assert_eq!(buffer.size().await, 4);
279ffe74184SMartin Algesten 
280ffe74184SMartin Algesten     let n = assert_ok!(buffer.read(&mut packet, None).await);
281ffe74184SMartin Algesten     assert_eq!(n, 2, "n must be 2");
28283f2d1bbSVincent Esche     assert_eq!(&packet[..n], &[7, 8]);
28383f2d1bbSVincent Esche     assert_eq!(buffer.size().await, 0);
284ffe74184SMartin Algesten 
285ffe74184SMartin Algesten     // Nothing left.
286ffe74184SMartin Algesten     buffer.close().await;
287ffe74184SMartin Algesten }
288ffe74184SMartin Algesten 
289ffe74184SMartin Algesten #[tokio::test]
test_buffer_limit_sizes()290ffe74184SMartin Algesten async fn test_buffer_limit_sizes() {
291ffe74184SMartin Algesten     let sizes = vec![
292ffe74184SMartin Algesten         128 * 1024,
293ffe74184SMartin Algesten         1024 * 1024,
294ffe74184SMartin Algesten         8 * 1024 * 1024,
295ffe74184SMartin Algesten         0, // default
296ffe74184SMartin Algesten     ];
297ffe74184SMartin Algesten     const HEADER_SIZE: usize = 2;
298ffe74184SMartin Algesten     const PACKET_SIZE: usize = 0x8000;
299ffe74184SMartin Algesten 
300ffe74184SMartin Algesten     for mut size in sizes {
301ffe74184SMartin Algesten         let mut name = "default".to_owned();
302ffe74184SMartin Algesten         if size > 0 {
303ffe74184SMartin Algesten             name = format!("{}kbytes", size / 1024);
304ffe74184SMartin Algesten         }
305ffe74184SMartin Algesten 
306ffe74184SMartin Algesten         let buffer = Buffer::new(0, 0);
307ffe74184SMartin Algesten         if size == 0 {
308ffe74184SMartin Algesten             size = MAX_SIZE;
309ffe74184SMartin Algesten         } else {
310ffe74184SMartin Algesten             buffer.set_limit_size(size + HEADER_SIZE).await;
311ffe74184SMartin Algesten         }
312ffe74184SMartin Algesten 
313ffe74184SMartin Algesten         //assert.NoError(buffer.SetReadDeadline(now.Add(5 * time.Second))) // Set deadline to avoid test deadlock
314ffe74184SMartin Algesten 
315ffe74184SMartin Algesten         let n_packets = size / (PACKET_SIZE + HEADER_SIZE);
316ffe74184SMartin Algesten         let pkt = vec![0; PACKET_SIZE];
317ffe74184SMartin Algesten         for _ in 0..n_packets {
318ffe74184SMartin Algesten             assert_ok!(buffer.write(&pkt).await);
319ffe74184SMartin Algesten         }
320ffe74184SMartin Algesten 
321ffe74184SMartin Algesten         // Next write is expected to be errored.
322ffe74184SMartin Algesten         let result = buffer.write(&pkt).await;
323ffe74184SMartin Algesten         assert!(result.is_err(), "{}", name);
324*5d8fe953SJoão Oliveira         assert_eq!(result.unwrap_err(), Error::ErrBufferFull, "{name}");
325ffe74184SMartin Algesten 
326ffe74184SMartin Algesten         let mut packet = vec![0; size];
327ffe74184SMartin Algesten         for _ in 0..n_packets {
328ffe74184SMartin Algesten             let n = assert_ok!(buffer.read(&mut packet, Some(Duration::new(5, 0))).await);
329*5d8fe953SJoão Oliveira             assert_eq!(n, PACKET_SIZE, "{name}");
330ffe74184SMartin Algesten         }
331ffe74184SMartin Algesten     }
332ffe74184SMartin Algesten }
333ffe74184SMartin Algesten 
334ffe74184SMartin Algesten #[tokio::test]
test_buffer_misc()335ffe74184SMartin Algesten async fn test_buffer_misc() {
336ffe74184SMartin Algesten     let buffer = Buffer::new(0, 0);
337ffe74184SMartin Algesten 
338ffe74184SMartin Algesten     // Write once
339ffe74184SMartin Algesten     let n = assert_ok!(buffer.write(&[0, 1, 2, 3]).await);
340ffe74184SMartin Algesten     assert_eq!(n, 4, "n must be 4");
341ffe74184SMartin Algesten 
342ffe74184SMartin Algesten     // Try to read with a short buffer
343ffe74184SMartin Algesten     let mut packet: Vec<u8> = vec![0; 3];
344ffe74184SMartin Algesten     let result = buffer.read(&mut packet, None).await;
345ffe74184SMartin Algesten     assert!(result.is_err());
346ffe74184SMartin Algesten     if let Err(err) = result {
34783f2d1bbSVincent Esche         assert_eq!(err, Error::ErrBufferShort);
348ffe74184SMartin Algesten     }
349ffe74184SMartin Algesten 
350ffe74184SMartin Algesten     // Close
351ffe74184SMartin Algesten     buffer.close().await;
352ffe74184SMartin Algesten 
353ffe74184SMartin Algesten     // check is_close
354ffe74184SMartin Algesten     assert!(buffer.is_closed().await);
355ffe74184SMartin Algesten 
356ffe74184SMartin Algesten     // Make sure you can Close twice
357ffe74184SMartin Algesten     buffer.close().await;
358ffe74184SMartin Algesten }
359