]> git.lizzy.rs Git - rust.git/blob - library/std/src/sync/mpsc/spsc_queue/tests.rs
initial port of crossbeam-channel
[rust.git] / library / std / src / sync / mpsc / spsc_queue / tests.rs
1 use super::Queue;
2 use crate::sync::mpsc::channel;
3 use crate::sync::Arc;
4 use crate::thread;
5
6 #[test]
7 fn smoke() {
8     unsafe {
9         let queue = Queue::with_additions(0, (), ());
10         queue.push(1);
11         queue.push(2);
12         assert_eq!(queue.pop(), Some(1));
13         assert_eq!(queue.pop(), Some(2));
14         assert_eq!(queue.pop(), None);
15         queue.push(3);
16         queue.push(4);
17         assert_eq!(queue.pop(), Some(3));
18         assert_eq!(queue.pop(), Some(4));
19         assert_eq!(queue.pop(), None);
20     }
21 }
22
23 #[test]
24 fn peek() {
25     unsafe {
26         let queue = Queue::with_additions(0, (), ());
27         queue.push(vec![1]);
28
29         // Ensure the borrowchecker works
30         match queue.peek() {
31             Some(vec) => {
32                 assert_eq!(&*vec, &[1]);
33             }
34             None => unreachable!(),
35         }
36
37         match queue.pop() {
38             Some(vec) => {
39                 assert_eq!(&*vec, &[1]);
40             }
41             None => unreachable!(),
42         }
43     }
44 }
45
46 #[test]
47 fn drop_full() {
48     unsafe {
49         let q: Queue<Box<_>> = Queue::with_additions(0, (), ());
50         q.push(Box::new(1));
51         q.push(Box::new(2));
52     }
53 }
54
55 #[test]
56 fn smoke_bound() {
57     unsafe {
58         let q = Queue::with_additions(0, (), ());
59         q.push(1);
60         q.push(2);
61         assert_eq!(q.pop(), Some(1));
62         assert_eq!(q.pop(), Some(2));
63         assert_eq!(q.pop(), None);
64         q.push(3);
65         q.push(4);
66         assert_eq!(q.pop(), Some(3));
67         assert_eq!(q.pop(), Some(4));
68         assert_eq!(q.pop(), None);
69     }
70 }
71
72 #[test]
73 fn stress() {
74     unsafe {
75         stress_bound(0);
76         stress_bound(1);
77     }
78
79     unsafe fn stress_bound(bound: usize) {
80         let count = if cfg!(miri) { 1000 } else { 100000 };
81         let q = Arc::new(Queue::with_additions(bound, (), ()));
82
83         let (tx, rx) = channel();
84         let q2 = q.clone();
85         let _t = thread::spawn(move || {
86             for _ in 0..count {
87                 loop {
88                     match q2.pop() {
89                         Some(1) => break,
90                         Some(_) => panic!(),
91                         None => {}
92                     }
93                 }
94             }
95             tx.send(()).unwrap();
96         });
97         for _ in 0..count {
98             q.push(1);
99         }
100         rx.recv().unwrap();
101     }
102 }