1pub mod context;
2pub mod builder;
3
4#[cfg(test)]
5mod tests {
6
7 #[cfg(feature = "async")]
8 use std::time::Duration;
9
10 #[cfg(feature = "async")]
11 use tokio::{task, time::sleep};
12
13 use crate::builder::BufferPoolBuilder;
14
15
16 #[cfg(feature = "async")]
17 #[tokio::test]
18 async fn basic_test() {
19 let pool = BufferPoolBuilder::new().build_multi_thread();
20
21 let pool_cl = pool.clone();
22 let a = tokio::spawn(async move {
23 for _ in 0..10000 {
24 println!("A: try to get a new buffer");
25
26 let new_buffer_opt = pool_cl.get().await;
27
28 if new_buffer_opt.is_none() {
29 println!("A: buffer no available");
30 break;
31 }
32 let mut new_buffer = new_buffer_opt.unwrap();
33 new_buffer[0] = 0x01;
34 new_buffer[1] = 0x02;
35 new_buffer[2] = 0x03;
36 println!("A: free a buffer");
37 }
38 });
39
40 let pool_cl2 = pool.clone();
41 let b = tokio::spawn(async move {
42 for _ in 0..10000 {
43 println!("B: try to get a new buffer");
44
45 let new_buffer_opt = pool_cl2.get().await;
46
47 if new_buffer_opt.is_none() {
48 println!("B: buffer no available");
49 break;
50 }
51 let mut new_buffer = new_buffer_opt.unwrap();
52 new_buffer[0] = 0x01;
53 new_buffer[1] = 0x02;
54 new_buffer[2] = 0x03;
55 println!("B: free a buffer");
56 }
57 });
58
59 let _ = a.await;
60 let _ = b.await;
61 }
62
63 #[test]
64 fn big_pool() {
65 let _pool = BufferPoolBuilder::new()
67 .set_buffer_size(1024 * 1024)
68 .set_min_number_of_buffer(10240)
69 .build_mono_thread();
70 }
71
72 #[cfg(feature = "async")]
73 #[tokio::test]
74 async fn over_buffer() {
75 let pool = BufferPoolBuilder::new()
76 .set_buffer_size(1024 * 1024)
77 .set_min_number_of_buffer(100)
78 .set_max_number_of_buffer(200)
79 .set_over_buffer_lifetime(Duration::from_secs(2))
80 .build_multi_thread();
81
82 for _ in 0..150 {
83 let pool_cl = pool.clone();
84 task::spawn(async move {
85 let _buffer = pool_cl.get().await;
86 sleep(Duration::from_secs(3)).await;
87 });
88 }
89
90 sleep(Duration::from_secs(4)).await;
91
92 for _ in 0..120 {
93 let pool_cl = pool.clone();
94 task::spawn(async move {
95 let _buffer = pool_cl.get().await;
96 sleep(Duration::from_secs(3)).await;
97 });
98 }
99
100 sleep(Duration::from_secs(5)).await;
101 }
102}