diff --git a/src/uu/dd/src/dd.rs b/src/uu/dd/src/dd.rs index 99eecadad..b75565a93 100644 --- a/src/uu/dd/src/dd.rs +++ b/src/uu/dd/src/dd.rs @@ -817,27 +817,10 @@ pub fn uu_app() -> Command { #[cfg(test)] mod tests { - use crate::datastructures::{IConvFlags, IFlags}; - use crate::{calc_bsize, Density, Dest, Input, Output, Parser, Settings}; + use crate::{calc_bsize, Output, Parser}; - use std::cmp; - use std::fs; - use std::fs::File; - use std::io; - use std::io::{BufReader, Read}; use std::path::Path; - struct LazyReader { - src: R, - } - - impl Read for LazyReader { - fn read(&mut self, buf: &mut [u8]) -> io::Result { - let reduced = cmp::max(buf.len() / 2, 1); - self.src.read(&mut buf[..reduced]) - } - } - #[test] fn bsize_test_primes() { let (n, m) = (7901, 7919); @@ -916,107 +899,4 @@ mod tests { Output::new_file(Path::new(settings.outfile.as_ref().unwrap()), &settings).is_err() ); } - - #[test] - fn test_deadbeef_16_delayed() { - let settings = Settings { - ibs: 16, - obs: 32, - count: None, - iconv: IConvFlags { - sync: Some(0), - ..Default::default() - }, - ..Default::default() - }; - let input = Input { - src: LazyReader { - src: File::open("./test-resources/deadbeef-16.test").unwrap(), - }, - settings: &settings, - }; - - let output = Output { - dst: Dest::File( - File::create("./test-resources/FAILED-deadbeef-16-delayed.test").unwrap(), - Density::Dense, - ), - settings: &settings, - }; - - output.dd_out(input).unwrap(); - - let tmp_fname = "./test-resources/FAILED-deadbeef-16-delayed.test"; - let spec = File::open("./test-resources/deadbeef-16.spec").unwrap(); - - let res = File::open(tmp_fname).unwrap(); - // Check test file isn't empty (unless spec file is too) - assert_eq!( - res.metadata().unwrap().len(), - spec.metadata().unwrap().len() - ); - - let spec = BufReader::new(spec); - let res = BufReader::new(res); - - // Check all bytes match - for (b_res, b_spec) in res.bytes().zip(spec.bytes()) { - assert_eq!(b_res.unwrap(), b_spec.unwrap()); - } - - fs::remove_file(tmp_fname).unwrap(); - } - - #[test] - fn test_random_73k_test_lazy_fullblock() { - let settings = Settings { - ibs: 521, - obs: 1031, - count: None, - iflags: IFlags { - fullblock: true, - ..IFlags::default() - }, - ..Default::default() - }; - let input = Input { - src: LazyReader { - src: File::open("./test-resources/random-5828891cb1230748e146f34223bbd3b5.test") - .unwrap(), - }, - settings: &settings, - }; - - let output = Output { - dst: Dest::File( - File::create("./test-resources/FAILED-random_73k_test_lazy_fullblock.test") - .unwrap(), - Density::Dense, - ), - settings: &settings, - }; - - output.dd_out(input).unwrap(); - - let tmp_fname = "./test-resources/FAILED-random_73k_test_lazy_fullblock.test"; - let spec = - File::open("./test-resources/random-5828891cb1230748e146f34223bbd3b5.test").unwrap(); - - let res = File::open(tmp_fname).unwrap(); - // Check test file isn't empty (unless spec file is too) - assert_eq!( - res.metadata().unwrap().len(), - spec.metadata().unwrap().len() - ); - - let spec = BufReader::new(spec); - let res = BufReader::new(res); - - // Check all bytes match - for (b_res, b_spec) in res.bytes().zip(spec.bytes()) { - assert_eq!(b_res.unwrap(), b_spec.unwrap()); - } - - fs::remove_file(tmp_fname).unwrap(); - } } diff --git a/src/uu/dd/test-resources/FAILED-random-5828891cb1230748e146f34223bbd3b5.test b/src/uu/dd/test-resources/FAILED-random-5828891cb1230748e146f34223bbd3b5.test deleted file mode 100644 index 6e997411c..000000000 Binary files a/src/uu/dd/test-resources/FAILED-random-5828891cb1230748e146f34223bbd3b5.test and /dev/null differ diff --git a/src/uu/dd/test-resources/deadbeef-16.spec b/src/uu/dd/test-resources/deadbeef-16.spec deleted file mode 100644 index 4eb7c10f1..000000000 Binary files a/src/uu/dd/test-resources/deadbeef-16.spec and /dev/null differ diff --git a/src/uu/dd/test-resources/deadbeef-16.test b/src/uu/dd/test-resources/deadbeef-16.test deleted file mode 100644 index 85f2b7569..000000000 --- a/src/uu/dd/test-resources/deadbeef-16.test +++ /dev/null @@ -1 +0,0 @@ -ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ \ No newline at end of file diff --git a/src/uu/dd/test-resources/random-5828891cb1230748e146f34223bbd3b5.test b/src/uu/dd/test-resources/random-5828891cb1230748e146f34223bbd3b5.test deleted file mode 100644 index 6e997411c..000000000 Binary files a/src/uu/dd/test-resources/random-5828891cb1230748e146f34223bbd3b5.test and /dev/null differ diff --git a/tests/by-util/test_dd.rs b/tests/by-util/test_dd.rs index 1bf64a0b3..d0998ecda 100644 --- a/tests/by-util/test_dd.rs +++ b/tests/by-util/test_dd.rs @@ -5,6 +5,10 @@ use crate::common::util::*; use std::fs::{File, OpenOptions}; use std::io::{BufReader, Read, Write}; use std::path::PathBuf; +#[cfg(not(windows))] +use std::thread::sleep; +#[cfg(not(windows))] +use std::time::Duration; use tempfile::tempfile; macro_rules! inf { @@ -1007,6 +1011,38 @@ fn test_random_73k_test_obs_lt_not_a_multiple_ibs() { .stdout_is_fixture_bytes("random-5828891cb1230748e146f34223bbd3b5.test"); } +#[cfg(not(windows))] +#[test] +fn test_random_73k_test_lazy_fullblock() { + let (at, mut ucmd) = at_and_ucmd!(); + at.mkfifo("fifo"); + let child = ucmd + .args(&[ + "ibs=521", + "obs=1031", + "iflag=fullblock", + "if=fifo", + "status=noxfer", + ]) + .run_no_wait(); + let data = at.read_bytes("random-5828891cb1230748e146f34223bbd3b5.test"); + { + let mut fifo = OpenOptions::new() + .write(true) + .open(at.plus("fifo")) + .unwrap(); + for chunk in data.chunks(521 / 2) { + fifo.write_all(chunk).unwrap(); + sleep(Duration::from_millis(10)); + } + } + let output = child.wait_with_output().unwrap(); + assert!(output.status.success()); + + assert_eq!(&output.stdout, &data); + assert_eq!(&output.stderr, b"142+1 records in\n72+1 records out\n"); +} + #[test] fn test_deadbeef_all_32k_test_count_reads() { new_ucmd!() @@ -1325,3 +1361,36 @@ fn test_bytes_suffix() { .succeeds() .stdout_only("\0\0\0abcdef"); } + +/// Test for "conv=sync" with a slow reader. +#[cfg(not(windows))] +#[test] +fn test_sync_delayed_reader() { + let (at, mut ucmd) = at_and_ucmd!(); + at.mkfifo("fifo"); + let child = ucmd + .args(&["ibs=16", "obs=32", "conv=sync", "if=fifo", "status=noxfer"]) + .run_no_wait(); + { + let mut fifo = OpenOptions::new() + .write(true) + .open(at.plus("fifo")) + .unwrap(); + for _ in 0..8 { + fifo.write_all(&[0xF; 8]).unwrap(); + sleep(Duration::from_millis(10)); + } + } + let output = child.wait_with_output().unwrap(); + assert!(output.status.success()); + + // Expected output is 0xFFFFFFFF00000000FFFFFFFF00000000... + let mut expected: [u8; 8 * 16] = [0; 8 * 16]; + for i in 0..8 { + for j in 0..8 { + expected[16 * i + j] = 0xF; + } + } + assert_eq!(&output.stdout, &expected); + assert_eq!(&output.stderr, b"0+8 records in\n4+0 records out\n"); +}