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] 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"); 20*83f2d1bbSVincent 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()); 25*83f2d1bbSVincent 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"); 37*83f2d1bbSVincent 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"); 41*83f2d1bbSVincent 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"); 57*83f2d1bbSVincent 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 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] 117ffe74184SMartin Algesten async fn test_buffer_wraparound() { 118ffe74184SMartin Algesten test_wraparound(false).await; 119ffe74184SMartin Algesten } 120ffe74184SMartin Algesten 121ffe74184SMartin Algesten #[tokio::test] 122ffe74184SMartin Algesten async fn test_buffer_wraparound_grow() { 123ffe74184SMartin Algesten test_wraparound(true).await; 124ffe74184SMartin Algesten } 125ffe74184SMartin Algesten 126ffe74184SMartin Algesten #[tokio::test] 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"); 138*83f2d1bbSVincent 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()); 142*83f2d1bbSVincent 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] 164ffe74184SMartin Algesten async fn test_buffer_limit_count() { 165ffe74184SMartin Algesten let buffer = Buffer::new(2, 0); 166ffe74184SMartin Algesten 167*83f2d1bbSVincent 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"); 172*83f2d1bbSVincent 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"); 176*83f2d1bbSVincent 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 { 182*83f2d1bbSVincent Esche assert_eq!(err, Error::ErrBufferFull); 183ffe74184SMartin Algesten } 184*83f2d1bbSVincent 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"); 190*83f2d1bbSVincent Esche assert_eq!(&packet[..n], &[0, 1]); 191*83f2d1bbSVincent 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"); 196*83f2d1bbSVincent 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 } 204*83f2d1bbSVincent 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"); 209*83f2d1bbSVincent Esche assert_eq!(&packet[..n], &[2, 3]); 210*83f2d1bbSVincent 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"); 214*83f2d1bbSVincent Esche assert_eq!(&packet[..n], &[6, 7]); 215*83f2d1bbSVincent 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] 222ffe74184SMartin Algesten async fn test_buffer_limit_size() { 223ffe74184SMartin Algesten let buffer = Buffer::new(0, 11); 224ffe74184SMartin Algesten 225*83f2d1bbSVincent 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"); 230*83f2d1bbSVincent 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"); 234*83f2d1bbSVincent 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 } 242*83f2d1bbSVincent 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"); 247*83f2d1bbSVincent 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"); 253*83f2d1bbSVincent Esche assert_eq!(&packet[..n], &[0, 1]); 254*83f2d1bbSVincent 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"); 259*83f2d1bbSVincent 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 } 267*83f2d1bbSVincent 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"); 272*83f2d1bbSVincent Esche assert_eq!(&packet[..n], &[2, 3]); 273*83f2d1bbSVincent 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"); 277*83f2d1bbSVincent Esche assert_eq!(&packet[..n], &[6]); 278*83f2d1bbSVincent 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"); 282*83f2d1bbSVincent Esche assert_eq!(&packet[..n], &[7, 8]); 283*83f2d1bbSVincent 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] 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*83f2d1bbSVincent Esche 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*83f2d1bbSVincent Esche assert_eq!(n, PACKET_SIZE, "{}", name); 330ffe74184SMartin Algesten } 331ffe74184SMartin Algesten } 332ffe74184SMartin Algesten } 333ffe74184SMartin Algesten 334ffe74184SMartin Algesten #[tokio::test] 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 { 347*83f2d1bbSVincent 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