From e0b962b00f62ca0681e58b8ea5579ab7be72fe25 Mon Sep 17 00:00:00 2001 From: askiiart Date: Mon, 13 Jan 2025 10:22:13 -0600 Subject: [PATCH 1/2] change to FnOnce instead of Fn --- src/lib.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index dcdf487..6b81f31 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -251,8 +251,8 @@ pub fn run(command: &mut Command) -> CmdOutput { /// ``` pub fn run_funcs( command: &mut Command, - stdout_func: impl Fn(Lines>) -> () + std::marker::Send + 'static, - stderr_func: impl Fn(Lines>) -> () + std::marker::Send + 'static, + stdout_func: impl FnOnce(Lines>) -> () + std::marker::Send + 'static, + stderr_func: impl FnOnce(Lines>) -> () + std::marker::Send + 'static, ) -> CmdOutput { // https://stackoverflow.com/a/72831067/16432246 let start = Instant::now(); @@ -330,8 +330,8 @@ pub fn run_funcs( /// ``` pub fn run_funcs_with_lines( command: &mut Command, - stdout_func: impl Fn(Lines>) -> Vec + std::marker::Send + 'static, - stderr_func: impl Fn(Lines>) -> Vec + std::marker::Send + 'static, + stdout_func: impl FnOnce(Lines>) -> Vec + std::marker::Send + 'static, + stderr_func: impl FnOnce(Lines>) -> Vec + std::marker::Send + 'static, ) -> CmdOutput { // https://stackoverflow.com/a/72831067/16432246 let start = Instant::now(); From d030ac779d581782934e34283dceb250e063947c Mon Sep 17 00:00:00 2001 From: askiiart Date: Mon, 13 Jan 2025 12:35:39 -0600 Subject: [PATCH 2/2] write lines directly rather than using bash --- src/tests.rs | 60 +++++++++++++++++++++++++++++----------------------- 1 file changed, 33 insertions(+), 27 deletions(-) diff --git a/src/tests.rs b/src/tests.rs index fc209ec..c4acb7d 100644 --- a/src/tests.rs +++ b/src/tests.rs @@ -1,12 +1,13 @@ #[cfg(test)] use crate::*; +use std::io::Write; +use std::os::unix::fs::FileExt; use std::process::Command; use std::{ fs::remove_file, hash::{BuildHasher, Hasher, RandomState}, }; use std::{fs::File, thread::sleep}; -use std::os::unix::fs::FileExt; /// Tests what stdout prints #[test] @@ -88,6 +89,8 @@ fn shuffle_vec(vec: &mut [T]) { #[test] fn test_run_funcs() { + // TODO: Add error handling to delete the file on exit + File::create_new("./tmp-run_funcs").unwrap(); let threads = thread::spawn(|| { return run_funcs( Command::new("bash") @@ -97,11 +100,12 @@ fn test_run_funcs() { |stdout_lines| { sleep(Duration::from_secs(1)); for _ in stdout_lines { - Command::new("bash") - .arg("-c") - .arg("echo stdout >> ./tmp-run_funcs") // col - .output() + let mut f = File::options() + .write(true) + .open("./tmp-run_funcs") .unwrap(); + f.write_all(b"stdout\n").unwrap(); + drop(f); } } }, @@ -109,11 +113,12 @@ fn test_run_funcs() { |stderr_lines| { sleep(Duration::from_secs(3)); for _ in stderr_lines { - Command::new("bash") - .arg("-c") - .arg("echo stderr >> ./tmp-run_funcs") // col - .output() + let f = File::options() + .write(true) + .open("./tmp-run_funcs") .unwrap(); + f.write_at(b"stderr\n", 7).unwrap(); + drop(f); } } }, @@ -140,6 +145,8 @@ fn test_run_funcs() { #[test] fn test_run_funcs_with_lines() { + // TODO: Add error handling to delete the file on exit + File::create_new("./tmp-run_funcs_with_lines").unwrap(); let threads = thread::spawn(|| { return run_funcs_with_lines( &mut Command::new("bash") @@ -153,11 +160,12 @@ fn test_run_funcs_with_lines() { let line = line.unwrap(); lines.push(Line::from_stdout(&line)); assert_eq!(&line, "hi"); - Command::new("bash") - .arg("-c") - .arg("echo stdout >> ./tmp-run_funcs_with_lines") - .output() + let mut f = File::options() + .write(true) + .open("./tmp-run_funcs_with_lines") .unwrap(); + f.write_all(b"stdout\n").unwrap(); + drop(f); } return lines; } @@ -170,11 +178,13 @@ fn test_run_funcs_with_lines() { let line = line.unwrap(); lines.push(Line::from_stdout(&line)); assert_eq!(line, "hello"); - Command::new("bash") - .arg("-c") - .arg("echo stderr >> ./tmp-run_funcs_with_lines") - .output() - .unwrap(); // oops sorry lol + let mut f = File::options() + .write(true) + .append(true) + .open("./tmp-run_funcs_with_lines") + .unwrap(); + f.write(b"stderr\n").unwrap(); + drop(f); } return lines; } @@ -182,17 +192,13 @@ fn test_run_funcs_with_lines() { ); }); sleep(Duration::from_secs(2)); - let f = File::open("./tmp-run_funcs_with_lines").unwrap(); - let mut buf: [u8; 14] = [0u8; 14]; - f.read_at(&mut buf, 0).unwrap(); - assert_eq!(buf, [115, 116, 100, 111, 117, 116, 10, 0, 0, 0, 0, 0, 0, 0]); + let read = std::fs::read_to_string("tmp-run_funcs_with_lines").unwrap(); + assert_eq!(read, "stdout\n"); sleep(Duration::from_secs(2)); - f.read_at(&mut buf, 0).unwrap(); - assert_eq!( - buf, - [115, 116, 100, 111, 117, 116, 10, 115, 116, 100, 101, 114, 114, 10] - ); + let read = std::fs::read_to_string("tmp-run_funcs_with_lines").unwrap(); + assert_eq!(read, "stdout\nstderr\n"); + remove_file("./tmp-run_funcs_with_lines").unwrap();