Skip to content

Commit

Permalink
Merge pull request #5453 from n1000/freebsd_fixes_push_2
Browse files Browse the repository at this point in the history
tests/dd: Do not use the OS provided dd utility on FIFOs
  • Loading branch information
tertsdiepraam authored Oct 25, 2023
2 parents 9d752d5 + db26dab commit f76522e
Showing 1 changed file with 22 additions and 50 deletions.
72 changes: 22 additions & 50 deletions tests/by-util/test_dd.rs
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,6 @@ use regex::Regex;
use std::fs::{File, OpenOptions};
use std::io::{BufReader, Read, Write};
use std::path::PathBuf;
#[cfg(all(unix, not(target_os = "macos"), not(target_os = "freebsd")))]
use std::process::{Command, Stdio};
#[cfg(not(windows))]
use std::thread::sleep;
#[cfg(not(windows))]
Expand Down Expand Up @@ -1459,74 +1457,48 @@ fn test_sparse() {
assert_eq!(at.metadata("infile").len(), at.metadata("outfile").len());
}

// TODO These FIFO tests should work on macos, but some issue is
// causing our implementation of dd to wait indefinitely when it
// shouldn't.

/// Test that a seek on an output FIFO results in a read.
#[test]
#[cfg(all(unix, not(target_os = "macos"), not(target_os = "freebsd")))]
#[cfg(unix)]
fn test_seek_output_fifo() {
let ts = TestScenario::new(util_name!());
let at = &ts.fixtures;
at.mkfifo("fifo");

// TODO When `dd` is a bit more advanced, we could use the uutils
// version of dd here as well.
let child = Command::new("dd")
.current_dir(&at.subdir)
.args([
"count=1",
"if=/dev/zero",
&format!("of={}", at.plus_as_string("fifo")),
"status=noxfer",
])
.stderr(Stdio::piped())
.spawn()
.expect("failed to execute child process");

ts.ucmd()
let mut ucmd = ts.ucmd();
let child = ucmd
.args(&["count=0", "seek=1", "of=fifo", "status=noxfer"])
.succeeds()
.stderr_only("0+0 records in\n0+0 records out\n");
.run_no_wait();

let output = child.wait_with_output().unwrap();
assert!(output.status.success());
assert!(output.stdout.is_empty());
assert_eq!(&output.stderr, b"1+0 records in\n1+0 records out\n");
std::fs::write(at.plus("fifo"), &vec![0; 512]).unwrap();

child
.wait()
.unwrap()
.success()
.stderr_only("0+0 records in\n0+0 records out\n");
}

/// Test that a skip on an input FIFO results in a read.
#[test]
#[cfg(all(unix, not(target_os = "macos"), not(target_os = "freebsd")))]
#[cfg(unix)]
fn test_skip_input_fifo() {
let ts = TestScenario::new(util_name!());
let at = &ts.fixtures;
at.mkfifo("fifo");

// TODO When `dd` is a bit more advanced, we could use the uutils
// version of dd here as well.
let child = Command::new("dd")
.current_dir(&at.subdir)
.args([
"count=1",
"if=/dev/zero",
&format!("of={}", at.plus_as_string("fifo")),
"status=noxfer",
])
.stderr(Stdio::piped())
.spawn()
.expect("failed to execute child process");

ts.ucmd()
let mut ucmd = ts.ucmd();
let child = ucmd
.args(&["count=0", "skip=1", "if=fifo", "status=noxfer"])
.succeeds()
.stderr_only("0+0 records in\n0+0 records out\n");
.run_no_wait();

std::fs::write(at.plus("fifo"), &vec![0; 512]).unwrap();

let output = child.wait_with_output().unwrap();
assert!(output.status.success());
assert!(output.stdout.is_empty());
assert_eq!(&output.stderr, b"1+0 records in\n1+0 records out\n");
child
.wait()
.unwrap()
.success()
.stderr_only("0+0 records in\n0+0 records out\n");
}

/// Test for reading part of stdin from each of two child processes.
Expand Down

0 comments on commit f76522e

Please sign in to comment.