summaryrefslogtreecommitdiffstats
path: root/third_party/rust/jobserver/tests/client-of-myself.rs
blob: 45d57b0b58154f3927a8dde7671bcbe4d839ff55 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
use std::env;
use std::io::prelude::*;
use std::io::BufReader;
use std::process::{Command, Stdio};
use std::sync::mpsc;
use std::thread;

use jobserver::Client;

macro_rules! t {
    ($e:expr) => {
        match $e {
            Ok(e) => e,
            Err(e) => panic!("{} failed with {}", stringify!($e), e),
        }
    };
}

fn main() {
    if env::var("I_AM_THE_CLIENT").is_ok() {
        client();
    } else {
        server();
    }
}

fn server() {
    let me = t!(env::current_exe());
    let client = t!(Client::new(1));
    let mut cmd = Command::new(me);
    cmd.env("I_AM_THE_CLIENT", "1").stdout(Stdio::piped());
    client.configure(&mut cmd);
    let acq = client.acquire().unwrap();
    let mut child = t!(cmd.spawn());
    let stdout = child.stdout.take().unwrap();
    let (tx, rx) = mpsc::channel();
    let t = thread::spawn(move || {
        for line in BufReader::new(stdout).lines() {
            tx.send(t!(line)).unwrap();
        }
    });

    for _ in 0..100 {
        assert!(rx.try_recv().is_err());
    }

    drop(acq);
    assert_eq!(rx.recv().unwrap(), "hello!");
    t.join().unwrap();
    assert!(rx.recv().is_err());
    client.acquire().unwrap();
}

fn client() {
    let client = unsafe { Client::from_env().unwrap() };
    let acq = client.acquire().unwrap();
    println!("hello!");
    drop(acq);
}