use std::sync::Arc;
use std::thread;
use std::time::Duration;
use mutcrab::collection::list::LinkedBlockingQueue;
#[test]
fn test_push_take_basic() {
let queue = LinkedBlockingQueue::<i32>::new(3);
queue.push(1);
queue.push(2);
queue.push(3);
assert_eq!(queue.take(), 1);
assert_eq!(queue.take(), 2);
assert_eq!(queue.take(), 3);
}
#[test]
fn test_take_on_empty_queue() {
let queue = Arc::new(LinkedBlockingQueue::<i32>::new(3));
assert_eq!(queue.poll().is_none(), true);
let queue1= Arc::clone(&queue);
thread::spawn(move || {
thread::sleep(Duration::from_millis(1)); queue1.push(1);
});
assert_eq!(queue.take(), 1);
}
#[test]
fn test_push_more_than_capacity() {
let queue = Arc::new(LinkedBlockingQueue::<i32>::new(2));
queue.push(1);
queue.push(2);
let queue1= Arc::clone(&queue);
thread::spawn(move || {
thread::sleep(Duration::from_millis(1)); queue1.take()
});
queue.push(3);
}
#[test]
fn single_read_write_test() {
let queue0 = Arc::new(LinkedBlockingQueue::<i32>::new(10));
let queue = Arc::clone(&queue0);
let p1 = thread::spawn(move || {
println!("hello thread 1");
for i in 0..10000 {
queue.push(i);
}
});
let queue = Arc::clone(&queue0);
let c1 = thread::spawn(move || {
println!("hello consumer1");
let mut vec:Vec<i32> = Vec::new();
loop {
let num = queue.take();
if num != -1 {
vec.push(num);
} else {
break;
}
}
return vec;
});
p1.join().unwrap();
queue0.push(-1);
let v1 = c1.join().unwrap();
assert_eq!(v1, (0..10000).collect::<Vec<_>>());
}
#[test]
fn bench_mark_test() {
let queue0 = Arc::new(LinkedBlockingQueue::<i32>::new(10));
let queue = Arc::clone(&queue0);
let p1 = thread::spawn(move || {
println!("hello thread 1");
for i in 0..1000 {
queue.push(i);
}
});
let queue = Arc::clone(&queue0);
let p2 = thread::spawn(move || {
println!("hello thread 2");
for i in 1000..2000 {
queue.push(i);
}
});
let queue = Arc::clone(&queue0);
let p3 = thread::spawn(move || {
println!("hello thread 3");
for i in 2000..3000 {
queue.push(i);
}
});
let queue = Arc::clone(&queue0);
let c1 = thread::spawn(move || {
println!("hello consumer1");
let mut vec:Vec<i32> = Vec::new();
loop {
let num = queue.take();
if num != -1 {
vec.push(num);
} else {
break;
}
}
return vec;
});
let queue = Arc::clone(&queue0);
let c2 = thread::spawn(move || {
println!("hello consumer1");
let mut vec:Vec<i32> = Vec::new();
loop {
let num = queue.take();
if num != -1 {
vec.push(num);
} else {
break;
}
}
return vec;
});
p1.join().unwrap();
p2.join().unwrap();
p3.join().unwrap();
queue0.push(-1);
queue0.push(-1);
let v1 = c1.join().unwrap();
let v2 = c2.join().unwrap();
let mut all_data = vec![v1, v2].concat();
all_data.sort();
assert_eq!(all_data, (0..3000).collect::<Vec<_>>());
}