Radish alpha
r
Radicle CI broker
Radicle
Git (anonymous pull)
Log in to clone via SSH
tests(synthetic-events): make more reliable
Lars Wirzenius committed 2 years ago
commit 730d6abcb7086156e174f483e37edbe426832c4e
parent 89beb82a5a17997de24b7c2dbaf7958ca8973fc7
1 file changed +39 -2
modified src/bin/synthetic-events.rs
@@ -7,8 +7,9 @@

use std::{
    env::current_exe,
-
    fs::{read, remove_file},
-
    io::Write,
+
    fs::{read, remove_file, File, OpenOptions},
+
    io::{Read, Write},
+
    net::Shutdown,
    os::unix::net::UnixListener,
    path::PathBuf,
    process::{Command, Stdio},
@@ -20,13 +21,29 @@ use clap::Parser;

use radicle::node::Event;

+
fn log(file: &mut File, msg: String) {
+
    file.write_all(msg.as_bytes()).ok();
+
}
+

fn main() -> anyhow::Result<()> {
    let args = Args::parse();
    let exe = current_exe()?;

    if args.daemon {
+
        let mut f = OpenOptions::new()
+
            .create(true)
+
            .append(true)
+
            .open(args.log.unwrap())?;
+

+
        log(&mut f, "daemon starts\n".into());
+

        let mut events = vec![];
        for filename in args.events.iter() {
+
            log(
+
                &mut f,
+
                format!("daemon reads file {}\n", filename.display()),
+
            );
+

            let data = read(filename)?;
            let e: Event = serde_json::from_slice(&data)?;
            let mut e = serde_json::to_string(&e)?;
@@ -34,16 +51,32 @@ fn main() -> anyhow::Result<()> {
            events.push(e);
        }

+
        log(
+
            &mut f,
+
            format!("daemon connects to {}\n", args.socket.display()),
+
        );
        let listener = UnixListener::bind(&args.socket)?;

        if let Some(stream) = listener.incoming().next() {
+
            log(&mut f, "daemon accepted connection\n".into());
            let mut stream = stream?;
            for e in events.iter() {
                stream.write_all(e.as_bytes())?;
+
                log(&mut f, "daemon sent a message\n".into());
            }
+
            log(&mut f, "daemon sent all messages\n".into());
+

+
            stream.shutdown(Shutdown::Write)?;
+
            log(&mut f, "daemon shutdown write\n".into());
+

+
            stream.set_read_timeout(Some(Duration::from_millis(1000)))?;
+
            let mut buf = vec![];
+
            stream.read_to_end(&mut buf).ok();
+
            log(&mut f, "daemon finished reading\n".into());
        }

        remove_file(&args.socket)?;
+
        log(&mut f, "daemon ends\n".into());
    } else {
        if args.socket.exists() {
            eprintln!("removing socket {}", args.socket.display());
@@ -52,6 +85,8 @@ fn main() -> anyhow::Result<()> {
        eprintln!("launching daemon");
        Command::new(exe)
            .arg("--daemon")
+
            .arg("--log")
+
            .arg(args.log.unwrap_or(PathBuf::from("/dev/null")))
            .arg(&args.socket)
            .args(&args.events)
            .stdin(Stdio::null())
@@ -73,6 +108,8 @@ fn main() -> anyhow::Result<()> {
struct Args {
    #[clap(long)]
    daemon: bool,
+
    #[clap(long)]
+
    log: Option<PathBuf>,
    socket: PathBuf,
    events: Vec<PathBuf>,
}