mirror of
https://github.com/RGBCube/uutils-coreutils
synced 2025-07-29 12:07:46 +00:00
dd: move tests of slow reader to test_dd.rs
Move some tests that simulate a slow reader from `dd.rs` to `tests/by-util/test_dd.rs`, and employ a FIFO and `sleep()` to simulate the slow reader instead of a custom struct that implements `Read`. This change restricts the type of `Input`s the `Output::dd_out()` function can accept, facilitating a future change to make `Input` an enum.
This commit is contained in:
parent
5acb0227aa
commit
903ad1656d
6 changed files with 70 additions and 122 deletions
|
@ -817,27 +817,10 @@ pub fn uu_app() -> Command {
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
use crate::datastructures::{IConvFlags, IFlags};
|
use crate::{calc_bsize, Output, Parser};
|
||||||
use crate::{calc_bsize, Density, Dest, Input, Output, Parser, Settings};
|
|
||||||
|
|
||||||
use std::cmp;
|
|
||||||
use std::fs;
|
|
||||||
use std::fs::File;
|
|
||||||
use std::io;
|
|
||||||
use std::io::{BufReader, Read};
|
|
||||||
use std::path::Path;
|
use std::path::Path;
|
||||||
|
|
||||||
struct LazyReader<R: Read> {
|
|
||||||
src: R,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<R: Read> Read for LazyReader<R> {
|
|
||||||
fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {
|
|
||||||
let reduced = cmp::max(buf.len() / 2, 1);
|
|
||||||
self.src.read(&mut buf[..reduced])
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn bsize_test_primes() {
|
fn bsize_test_primes() {
|
||||||
let (n, m) = (7901, 7919);
|
let (n, m) = (7901, 7919);
|
||||||
|
@ -916,107 +899,4 @@ mod tests {
|
||||||
Output::new_file(Path::new(settings.outfile.as_ref().unwrap()), &settings).is_err()
|
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();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
Binary file not shown.
Binary file not shown.
|
@ -1 +0,0 @@
|
||||||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
Binary file not shown.
|
@ -5,6 +5,10 @@ use crate::common::util::*;
|
||||||
use std::fs::{File, OpenOptions};
|
use std::fs::{File, OpenOptions};
|
||||||
use std::io::{BufReader, Read, Write};
|
use std::io::{BufReader, Read, Write};
|
||||||
use std::path::PathBuf;
|
use std::path::PathBuf;
|
||||||
|
#[cfg(not(windows))]
|
||||||
|
use std::thread::sleep;
|
||||||
|
#[cfg(not(windows))]
|
||||||
|
use std::time::Duration;
|
||||||
use tempfile::tempfile;
|
use tempfile::tempfile;
|
||||||
|
|
||||||
macro_rules! inf {
|
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");
|
.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]
|
#[test]
|
||||||
fn test_deadbeef_all_32k_test_count_reads() {
|
fn test_deadbeef_all_32k_test_count_reads() {
|
||||||
new_ucmd!()
|
new_ucmd!()
|
||||||
|
@ -1325,3 +1361,36 @@ fn test_bytes_suffix() {
|
||||||
.succeeds()
|
.succeeds()
|
||||||
.stdout_only("\0\0\0abcdef");
|
.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");
|
||||||
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue