use smux_rust::Config;
use std::time::Duration;
#[test]
fn test_config_default() {
let config = Config::default();
assert_eq!(config.version, 1);
assert!(!config.keep_alive_disabled);
assert_eq!(config.max_frame_size, 32768);
}
#[test]
fn test_config_verify() {
let mut config = Config::default();
config.version = 3;
assert!(config.verify().is_err());
config.version = 2;
assert!(config.verify().is_ok());
config.version = 1;
config.keep_alive_interval = Duration::from_secs(0);
assert!(config.verify().is_err());
config.keep_alive_interval = Duration::from_secs(10);
config.keep_alive_timeout = Duration::from_secs(5);
assert!(config.verify().is_err());
config.keep_alive_timeout = Duration::from_secs(30);
config.max_frame_size = 0;
assert!(config.verify().is_err());
config.max_frame_size = 70000; assert!(config.verify().is_err());
config.max_frame_size = 32768;
config.max_stream_buffer = 0;
assert!(config.verify().is_err());
config.max_stream_buffer = 65536;
config.max_receive_buffer = 1000; assert!(config.verify().is_err());
}
#[test]
fn test_frame_encode_decode() {
use smux_rust::frame::{Frame, Cmd, RawHeader};
let frame = Frame {
ver: 1,
cmd: Cmd::Psh,
sid: 12345,
data: bytes::Bytes::from("Hello, World!"),
};
let encoded = frame.encode();
assert!(encoded.len() >= 8);
let header = RawHeader::from_bytes(&encoded[..8]);
assert!(header.is_some());
let header = header.unwrap();
assert_eq!(header.ver, 1);
assert_eq!(header.cmd, Cmd::Psh);
assert_eq!(header.sid, 12345);
assert_eq!(header.length, 13);
}
#[tokio::test]
async fn test_allocator() {
use smux_rust::alloc::Allocator;
let alloc = Allocator::new();
let buf1 = alloc.get(100).await.unwrap();
assert_eq!(buf1.len(), 100);
assert!(buf1.capacity() >= 100);
let cap1 = buf1.capacity();
alloc.put(buf1).await.unwrap();
let buf2 = alloc.get(100).await.unwrap();
assert_eq!(buf2.capacity(), cap1);
assert_eq!(buf2.len(), 100);
let buf3 = alloc.get(1000).await.unwrap();
assert_eq!(buf3.len(), 1000);
assert!(buf3.capacity() >= 1000);
alloc.put(buf3).await.unwrap();
assert!(alloc.get(0).await.is_none());
assert!(alloc.get(70000).await.is_none());
}
#[tokio::test]
async fn test_shaper_queue() {
use smux_rust::shaper::{ShaperQueue, WriteRequest, ClassId};
use smux_rust::frame::{Frame, Cmd};
let mut queue = ShaperQueue::new();
let req1 = WriteRequest {
class: ClassId::Data,
frame: Frame::new(1, Cmd::Psh, 1),
seq: 1,
};
let req2 = WriteRequest {
class: ClassId::Ctrl,
frame: Frame::new(1, Cmd::Syn, 2),
seq: 2,
};
let req3 = WriteRequest {
class: ClassId::Data,
frame: Frame::new(1, Cmd::Psh, 3),
seq: 3,
};
queue.push(req1.clone()).await;
queue.push(req2.clone()).await;
queue.push(req3.clone()).await;
assert_eq!(queue.len().await, 3);
let popped = queue.pop().await;
assert!(popped.is_some());
let popped_req = popped.unwrap();
assert_eq!(popped_req.class, ClassId::Ctrl);
let popped2 = queue.pop().await;
assert!(popped2.is_some());
let popped3 = queue.pop().await;
assert!(popped3.is_some());
assert!(queue.is_empty().await);
}