]> git.proxmox.com Git - cargo.git/blob - vendor/jobserver/tests/client-of-myself.rs
New upstream version 0.52.0
[cargo.git] / vendor / jobserver / tests / client-of-myself.rs
1 use std::env;
2 use std::io::prelude::*;
3 use std::io::BufReader;
4 use std::process::{Command, Stdio};
5 use std::sync::mpsc;
6 use std::thread;
7
8 use jobserver::Client;
9
10 macro_rules! t {
11 ($e:expr) => {
12 match $e {
13 Ok(e) => e,
14 Err(e) => panic!("{} failed with {}", stringify!($e), e),
15 }
16 };
17 }
18
19 fn main() {
20 if env::var("I_AM_THE_CLIENT").is_ok() {
21 client();
22 } else {
23 server();
24 }
25 }
26
27 fn server() {
28 let me = t!(env::current_exe());
29 let client = t!(Client::new(1));
30 let mut cmd = Command::new(me);
31 cmd.env("I_AM_THE_CLIENT", "1").stdout(Stdio::piped());
32 client.configure(&mut cmd);
33 let acq = client.acquire().unwrap();
34 let mut child = t!(cmd.spawn());
35 let stdout = child.stdout.take().unwrap();
36 let (tx, rx) = mpsc::channel();
37 let t = thread::spawn(move || {
38 for line in BufReader::new(stdout).lines() {
39 tx.send(t!(line)).unwrap();
40 }
41 });
42
43 for _ in 0..100 {
44 assert!(rx.try_recv().is_err());
45 }
46
47 drop(acq);
48 assert_eq!(rx.recv().unwrap(), "hello!");
49 t.join().unwrap();
50 assert!(rx.recv().is_err());
51 client.acquire().unwrap();
52 }
53
54 fn client() {
55 let client = unsafe { Client::from_env().unwrap() };
56 let acq = client.acquire().unwrap();
57 println!("hello!");
58 drop(acq);
59 }