test_df: Use lossy stdout string

The tests fail when a non-UTF8 path is mounted, that's... not a
common case, but using a lossy string works just as well for the
tests, so let's use that.
This commit is contained in:
Nicolas Boichat
2025-07-24 09:39:18 +08:00
parent 6cc3eda8e4
commit 6884e29f97
2 changed files with 44 additions and 39 deletions
+39 -39
View File
@@ -117,7 +117,7 @@ fn test_df_output() {
.arg("-H")
.arg("--total")
.succeeds()
.stdout_move_str();
.stdout_str_lossy();
let actual = output.lines().take(1).collect::<Vec<&str>>()[0];
let actual = actual.split_whitespace().collect::<Vec<_>>();
assert_eq!(actual, expected);
@@ -151,7 +151,7 @@ fn test_df_output_overridden() {
.arg("-hH")
.arg("--total")
.succeeds()
.stdout_move_str();
.stdout_str_lossy();
let actual = output.lines().take(1).collect::<Vec<&str>>()[0];
let actual = actual.split_whitespace().collect::<Vec<_>>();
assert_eq!(actual, expected);
@@ -181,7 +181,7 @@ fn test_default_headers() {
"on",
]
};
let output = new_ucmd!().succeeds().stdout_move_str();
let output = new_ucmd!().succeeds().stdout_str_lossy();
let actual = output.lines().take(1).collect::<Vec<&str>>()[0];
let actual = actual.split_whitespace().collect::<Vec<_>>();
assert_eq!(actual, expected);
@@ -195,7 +195,7 @@ fn test_precedence_of_human_readable_and_si_header_over_output_header() {
let output = new_ucmd!()
.args(&[arg, "--output=size"])
.succeeds()
.stdout_move_str();
.stdout_str_lossy();
let header = output.lines().next().unwrap();
assert_eq!(header, " Size");
}
@@ -207,7 +207,7 @@ fn test_used_header_starts_with_space() {
// using -h here to ensure the width of the column's content is <= 4
.args(&["-h", "--output=used"])
.succeeds()
.stdout_move_str();
.stdout_str_lossy();
let header = output.lines().next().unwrap();
assert_eq!(header, " Used");
}
@@ -226,11 +226,11 @@ fn test_order_same() {
let output1 = new_ucmd!()
.arg("--output=source")
.succeeds()
.stdout_move_str();
.stdout_str_lossy();
let output2 = new_ucmd!()
.arg("--output=source")
.succeeds()
.stdout_move_str();
.stdout_str_lossy();
assert_eq!(output1, output2);
}
@@ -238,7 +238,7 @@ fn test_order_same() {
#[cfg(all(unix, not(target_os = "freebsd")))] // FIXME: fix this test for FreeBSD
#[test]
fn test_output_mp_repeat() {
let output1 = new_ucmd!().arg("/").arg("/").succeeds().stdout_move_str();
let output1 = new_ucmd!().arg("/").arg("/").succeeds().stdout_str_lossy();
let output1: Vec<String> = output1
.lines()
.map(|l| String::from(l.split_once(' ').unwrap().0))
@@ -272,7 +272,7 @@ fn test_type_option() {
let fs_types = new_ucmd!()
.arg("--output=fstype")
.succeeds()
.stdout_move_str();
.stdout_str_lossy();
let fs_type = fs_types.lines().nth(1).unwrap().trim();
new_ucmd!().args(&["-t", fs_type]).succeeds();
@@ -292,7 +292,7 @@ fn test_type_option_with_file() {
let fs_type = new_ucmd!()
.args(&["--output=fstype", "."])
.succeeds()
.stdout_move_str();
.stdout_str_lossy();
let fs_type = fs_type.lines().nth(1).unwrap().trim();
new_ucmd!().args(&["-t", fs_type, "."]).succeeds();
@@ -310,7 +310,7 @@ fn test_type_option_with_file() {
let fs_types = new_ucmd!()
.arg("--output=fstype")
.succeeds()
.stdout_move_str();
.stdout_str_lossy();
let fs_types: Vec<_> = fs_types
.lines()
.skip(1)
@@ -335,7 +335,7 @@ fn test_exclude_all_types() {
let fs_types = new_ucmd!()
.arg("--output=fstype")
.succeeds()
.stdout_move_str();
.stdout_str_lossy();
let fs_types: HashSet<_> = fs_types.lines().skip(1).collect();
let mut args = Vec::new();
@@ -379,7 +379,7 @@ fn test_total() {
// ...
// /dev/loop14 63488 63488 0 100% /snap/core20/1361
// total 258775268 98099712 148220200 40% -
let output = new_ucmd!().arg("--total").succeeds().stdout_move_str();
let output = new_ucmd!().arg("--total").succeeds().stdout_str_lossy();
// Skip the header line.
let lines: Vec<&str> = output.lines().skip(1).collect();
@@ -422,21 +422,21 @@ fn test_total_label_in_correct_column() {
let output = new_ucmd!()
.args(&["--output=source", "--total", "."])
.succeeds()
.stdout_move_str();
.stdout_str_lossy();
let last_line = output.lines().last().unwrap();
assert_eq!(last_line.trim(), "total");
let output = new_ucmd!()
.args(&["--output=target", "--total", "."])
.succeeds()
.stdout_move_str();
.stdout_str_lossy();
let last_line = output.lines().last().unwrap();
assert_eq!(last_line.trim(), "total");
let output = new_ucmd!()
.args(&["--output=source,target", "--total", "."])
.succeeds()
.stdout_move_str();
.stdout_str_lossy();
let last_line = output.lines().last().unwrap();
assert_eq!(
last_line.split_whitespace().collect::<Vec<&str>>(),
@@ -446,7 +446,7 @@ fn test_total_label_in_correct_column() {
let output = new_ucmd!()
.args(&["--output=target,source", "--total", "."])
.succeeds()
.stdout_move_str();
.stdout_str_lossy();
let last_line = output.lines().last().unwrap();
assert_eq!(
last_line.split_whitespace().collect::<Vec<&str>>(),
@@ -463,7 +463,7 @@ fn test_use_percentage() {
// "percentage" values.
.args(&["--total", "--output=used,avail,pcent", "--block-size=1"])
.succeeds()
.stdout_move_str();
.stdout_str_lossy();
// Skip the header line.
let lines: Vec<&str> = output.lines().skip(1).collect();
@@ -488,7 +488,7 @@ fn test_iuse_percentage() {
let output = new_ucmd!()
.args(&["--total", "--output=itotal,iused,ipcent"])
.succeeds()
.stdout_move_str();
.stdout_str_lossy();
// Skip the header line.
let lines: Vec<&str> = output.lines().skip(1).collect();
@@ -518,7 +518,7 @@ fn test_default_block_size() {
let output = new_ucmd!()
.arg("--output=size")
.succeeds()
.stdout_move_str();
.stdout_str_lossy();
let header = output.lines().next().unwrap().trim().to_string();
assert_eq!(header, "1K-blocks");
@@ -527,7 +527,7 @@ fn test_default_block_size() {
.arg("--output=size")
.env("POSIXLY_CORRECT", "1")
.succeeds()
.stdout_move_str();
.stdout_str_lossy();
let header = output.lines().next().unwrap().trim().to_string();
assert_eq!(header, "512B-blocks");
@@ -547,14 +547,14 @@ fn test_default_block_size_in_posix_portability_mode() {
.to_string()
}
let output = new_ucmd!().arg("-P").succeeds().stdout_move_str();
let output = new_ucmd!().arg("-P").succeeds().stdout_str_lossy();
assert_eq!(get_header(&output), "1024-blocks");
let output = new_ucmd!()
.arg("-P")
.env("POSIXLY_CORRECT", "1")
.succeeds()
.stdout_move_str();
.stdout_str_lossy();
assert_eq!(get_header(&output), "512-blocks");
}
@@ -564,7 +564,7 @@ fn test_block_size_1024() {
let output = new_ucmd!()
.args(&["-B", &format!("{block_size}"), "--output=size"])
.succeeds()
.stdout_move_str();
.stdout_str_lossy();
output.lines().next().unwrap().trim().to_string()
}
@@ -588,7 +588,7 @@ fn test_block_size_with_suffix() {
let output = new_ucmd!()
.args(&["-B", block_size, "--output=size"])
.succeeds()
.stdout_move_str();
.stdout_str_lossy();
output.lines().next().unwrap().trim().to_string()
}
@@ -612,7 +612,7 @@ fn test_block_size_in_posix_portability_mode() {
let output = new_ucmd!()
.args(&["-P", "-B", block_size])
.succeeds()
.stdout_move_str();
.stdout_str_lossy();
output
.lines()
.next()
@@ -639,7 +639,7 @@ fn test_block_size_from_env() {
.arg("--output=size")
.env(env_var, env_value)
.succeeds()
.stdout_move_str();
.stdout_str_lossy();
output.lines().next().unwrap().trim().to_string()
}
@@ -658,7 +658,7 @@ fn test_block_size_from_env_precedences() {
.env(k1, v1)
.env(k2, v2)
.succeeds()
.stdout_move_str();
.stdout_str_lossy();
output.lines().next().unwrap().trim().to_string()
}
@@ -677,7 +677,7 @@ fn test_precedence_of_block_size_arg_over_env() {
.args(&["-B", "999", "--output=size"])
.env("DF_BLOCK_SIZE", "111")
.succeeds()
.stdout_move_str();
.stdout_str_lossy();
let header = output.lines().next().unwrap().trim().to_string();
assert_eq!(header, "999B-blocks");
@@ -691,7 +691,7 @@ fn test_invalid_block_size_from_env() {
.arg("--output=size")
.env("DF_BLOCK_SIZE", "invalid")
.succeeds()
.stdout_move_str();
.stdout_str_lossy();
let header = output.lines().next().unwrap().trim().to_string();
assert_eq!(header, default_block_size_header);
@@ -701,7 +701,7 @@ fn test_invalid_block_size_from_env() {
.env("DF_BLOCK_SIZE", "invalid")
.env("BLOCK_SIZE", "222")
.succeeds()
.stdout_move_str();
.stdout_str_lossy();
let header = output.lines().next().unwrap().trim().to_string();
assert_eq!(header, default_block_size_header);
@@ -717,7 +717,7 @@ fn test_ignore_block_size_from_env_in_posix_portability_mode() {
.env("BLOCK_SIZE", "222")
.env("BLOCKSIZE", "333")
.succeeds()
.stdout_move_str();
.stdout_str_lossy();
let header = output
.lines()
.next()
@@ -784,13 +784,13 @@ fn test_output_selects_columns() {
let output = new_ucmd!()
.args(&["--output=source"])
.succeeds()
.stdout_move_str();
.stdout_str_lossy();
assert_eq!(output.lines().next().unwrap(), "Filesystem");
let output = new_ucmd!()
.args(&["--output=source,target"])
.succeeds()
.stdout_move_str();
.stdout_str_lossy();
assert_eq!(
output
.lines()
@@ -804,7 +804,7 @@ fn test_output_selects_columns() {
let output = new_ucmd!()
.args(&["--output=source,target,used"])
.succeeds()
.stdout_move_str();
.stdout_str_lossy();
assert_eq!(
output
.lines()
@@ -821,7 +821,7 @@ fn test_output_multiple_occurrences() {
let output = new_ucmd!()
.args(&["--output=source", "--output=target"])
.succeeds()
.stdout_move_str();
.stdout_str_lossy();
assert_eq!(
output
.lines()
@@ -840,7 +840,7 @@ fn test_output_file_all_filesystems() {
let output = new_ucmd!()
.arg("--output=file")
.succeeds()
.stdout_move_str();
.stdout_str_lossy();
let mut lines = output.lines();
assert_eq!(lines.next().unwrap(), "File");
for line in lines {
@@ -862,7 +862,7 @@ fn test_output_file_specific_files() {
let output = ucmd
.args(&["--output=file", "a", "b", "c"])
.succeeds()
.stdout_move_str();
.stdout_str_lossy();
let actual: Vec<&str> = output.lines().collect();
assert_eq!(actual, vec!["File", "a", "b", "c"]);
}
@@ -876,7 +876,7 @@ fn test_file_column_width_if_filename_contains_unicode_chars() {
let output = ucmd
.args(&["--output=file,target", "äöü.txt"])
.succeeds()
.stdout_move_str();
.stdout_str_lossy();
let actual = output.lines().next().unwrap();
// expected width: 7 chars (length of äöü.txt) + 1 char (column separator)
assert_eq!(actual, "File Mounted on");
+5
View File
@@ -357,6 +357,11 @@ impl CmdResult {
std::str::from_utf8(&self.stdout).unwrap()
}
/// Returns the program's standard output as a string, automatically handling invalid utf8
pub fn stdout_str_lossy(self) -> String {
String::from_utf8_lossy(&self.stdout).to_string()
}
/// Returns the program's standard output as a string
/// consumes self
pub fn stdout_move_str(self) -> String {