]> git.proxmox.com Git - cargo.git/blob - vendor/jobserver/tests/helper.rs
New upstream version 0.52.0
[cargo.git] / vendor / jobserver / tests / helper.rs
1 use jobserver::Client;
2 use std::sync::atomic::*;
3 use std::sync::mpsc;
4 use std::sync::*;
5
6 macro_rules! t {
7 ($e:expr) => {
8 match $e {
9 Ok(e) => e,
10 Err(e) => panic!("{} failed with {}", stringify!($e), e),
11 }
12 };
13 }
14
15 #[test]
16 fn helper_smoke() {
17 let client = t!(Client::new(1));
18 drop(client.clone().into_helper_thread(|_| ()).unwrap());
19 drop(client.clone().into_helper_thread(|_| ()).unwrap());
20 drop(client.clone().into_helper_thread(|_| ()).unwrap());
21 drop(client.clone().into_helper_thread(|_| ()).unwrap());
22 drop(client.clone().into_helper_thread(|_| ()).unwrap());
23 drop(client.into_helper_thread(|_| ()).unwrap());
24 }
25
26 #[test]
27 fn acquire() {
28 let (tx, rx) = mpsc::channel();
29 let client = t!(Client::new(1));
30 let helper = client
31 .into_helper_thread(move |a| drop(tx.send(a)))
32 .unwrap();
33 assert!(rx.try_recv().is_err());
34 helper.request_token();
35 rx.recv().unwrap().unwrap();
36 helper.request_token();
37 rx.recv().unwrap().unwrap();
38
39 helper.request_token();
40 helper.request_token();
41 rx.recv().unwrap().unwrap();
42 rx.recv().unwrap().unwrap();
43
44 helper.request_token();
45 helper.request_token();
46 drop(helper);
47 }
48
49 #[test]
50 fn prompt_shutdown() {
51 for _ in 0..100 {
52 let client = jobserver::Client::new(4).unwrap();
53 let count = Arc::new(AtomicU32::new(0));
54 let count2 = count.clone();
55 let tokens = Arc::new(Mutex::new(Vec::new()));
56 let helper = client
57 .into_helper_thread(move |token| {
58 tokens.lock().unwrap().push(token);
59 count2.fetch_add(1, Ordering::SeqCst);
60 })
61 .unwrap();
62
63 // Request more tokens than what are available.
64 for _ in 0..5 {
65 helper.request_token();
66 }
67 // Wait for at least some of the requests to finish.
68 while count.load(Ordering::SeqCst) < 3 {
69 std::thread::yield_now();
70 }
71 // Drop helper
72 let t = std::time::Instant::now();
73 drop(helper);
74 let d = t.elapsed();
75 assert!(d.as_secs_f64() < 0.5);
76 }
77 }