Skip to content

Commit

Permalink
Merge pull request #6287 from BenWiederhake/dev-fewer-test-leakage
Browse files Browse the repository at this point in the history
od+tests: use TestScenario, avoid spamming /tmp on failure
  • Loading branch information
sylvestre committed Apr 29, 2024
2 parents 5fbc588 + ebb21d0 commit 969fb2e
Showing 1 changed file with 30 additions and 86 deletions.
116 changes: 30 additions & 86 deletions tests/by-util/test_od.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,23 +6,15 @@
// spell-checker:ignore abcdefghijklmnopqrstuvwxyz

use crate::common::util::TestScenario;
use std::env;
use std::fs::remove_file;
use std::fs::File;
use std::io::Write;
use std::path::Path;
use unindent::unindent;

// octal dump of 'abcdefghijklmnopqrstuvwxyz\n' // spell-checker:disable-line
// octal dump of 'abcdefghijklmnopqrstuvwxyz\n'
static ALPHA_OUT: &str = "
0000000 061141 062143 063145 064147 065151 066153 067155 070157
0000020 071161 072163 073165 074167 075171 000012
0000033
";

// XXX We could do a better job of ensuring that we have a fresh temp dir to ourselves,
// not a general one full of other process leftovers.

#[test]
fn test_invalid_arg() {
new_ucmd!().arg("--definitely-invalid").fails().code_is(1);
Expand All @@ -31,96 +23,58 @@ fn test_invalid_arg() {
// Test that od can read one file and dump with default format
#[test]
fn test_file() {
// TODO: Can this be replaced by AtPath?
use std::env;
let temp = env::temp_dir();
let tmpdir = Path::new(&temp);
let file = tmpdir.join("test");

{
let mut f = File::create(&file).unwrap();
// spell-checker:disable-next-line
assert!(
f.write_all(b"abcdefghijklmnopqrstuvwxyz\n").is_ok(),
"Test setup failed - could not write file"
);
}

new_ucmd!()
let scene = TestScenario::new(util_name!());
let at = &scene.fixtures;
at.write("test", "abcdefghijklmnopqrstuvwxyz\n");
scene
.ucmd()
.arg("--endian=little")
.arg(file.as_os_str())
.arg("test")
.succeeds()
.no_stderr()
.stdout_is(unindent(ALPHA_OUT));

new_ucmd!()
scene
.ucmd()
.arg("--endian=littl") // spell-checker:disable-line
.arg(file.as_os_str())
.arg("test")
.succeeds()
.no_stderr()
.stdout_is(unindent(ALPHA_OUT));

new_ucmd!()
scene
.ucmd()
.arg("--endian=l")
.arg(file.as_os_str())
.arg("test")
.succeeds()
.no_stderr()
.stdout_is(unindent(ALPHA_OUT));

// Ensure that default format matches `-t o2`, and that `-t` does not absorb file argument
new_ucmd!()
scene
.ucmd()
.arg("--endian=little")
.arg("-t")
.arg("o2")
.arg(file.as_os_str())
.succeeds()
.no_stderr()
.stdout_is(unindent(ALPHA_OUT));

let _ = remove_file(file);
.arg("test");
}

// Test that od can read 2 files and concatenate the contents
#[test]
fn test_2files() {
let temp = env::temp_dir();
let tmpdir = Path::new(&temp);
let file1 = tmpdir.join("test1");
let file2 = tmpdir.join("test2");

for (n, a) in [(1, "a"), (2, "b")] {
println!("number: {n} letter:{a}");
}

// spell-checker:disable-next-line
for (path, data) in [(&file1, "abcdefghijklmnop"), (&file2, "qrstuvwxyz\n")] {
let mut f = File::create(path).unwrap();
assert!(
f.write_all(data.as_bytes()).is_ok(),
"Test setup failed - could not write file"
);
}

new_ucmd!()
.arg("--endian=little")
.arg(file1.as_os_str())
.arg(file2.as_os_str())
let (at, mut ucmd) = at_and_ucmd!();
at.write("test1", "abcdefghijklmnop"); // spell-checker:disable-line
at.write("test2", "qrstuvwxyz\n"); // spell-checker:disable-line
ucmd.arg("--endian=little")
.arg("test1")
.arg("test2")
.succeeds()
.no_stderr()
.stdout_is(unindent(ALPHA_OUT));
// TODO: Handle errors?
let _ = remove_file(file1);
let _ = remove_file(file2);
}

// Test that od gives non-0 exit val for filename that doesn't exist.
#[test]
fn test_no_file() {
let temp = env::temp_dir();
let tmpdir = Path::new(&temp);
let file = tmpdir.join("}surely'none'would'thus'a'file'name"); // spell-checker:disable-line

new_ucmd!().arg(file.as_os_str()).fails();
let (_at, mut ucmd) = at_and_ucmd!();
ucmd.arg("}surely'none'would'thus'a'file'name").fails(); // spell-checker:disable-line
}

// Test that od reads from stdin instead of a file
Expand All @@ -138,26 +92,16 @@ fn test_from_stdin() {
// Test that od reads from stdin and also from files
#[test]
fn test_from_mixed() {
let temp = env::temp_dir();
let tmpdir = Path::new(&temp);
let file1 = tmpdir.join("test-1");
let file3 = tmpdir.join("test-3");

let (at, mut ucmd) = at_and_ucmd!();
// spell-checker:disable-next-line
let (data1, data2, data3) = ("abcdefg", "hijklmnop", "qrstuvwxyz\n");
for (path, data) in [(&file1, data1), (&file3, data3)] {
let mut f = File::create(path).unwrap();
assert!(
f.write_all(data.as_bytes()).is_ok(),
"Test setup failed - could not write file"
);
}
at.write("test-1", data1);
at.write("test-3", data3);

new_ucmd!()
.arg("--endian=little")
.arg(file1.as_os_str())
ucmd.arg("--endian=little")
.arg("test-1")
.arg("-")
.arg(file3.as_os_str())
.arg("test-3")
.run_piped_stdin(data2.as_bytes())
.success()
.no_stderr()
Expand Down

0 comments on commit 969fb2e

Please sign in to comment.