2022-03-25 09:46:13 +00:00
|
|
|
// spell-checker:ignore udev pcent
|
2020-05-25 17:05:26 +00:00
|
|
|
use crate::common::util::*;
|
2020-04-28 07:34:55 +00:00
|
|
|
|
2020-04-29 17:03:22 +00:00
|
|
|
#[test]
|
|
|
|
fn test_df_compatible_no_size_arg() {
|
2021-04-22 20:37:44 +00:00
|
|
|
new_ucmd!().arg("-a").succeeds();
|
2020-04-29 17:03:22 +00:00
|
|
|
}
|
|
|
|
|
2022-01-29 00:03:28 +00:00
|
|
|
#[test]
|
|
|
|
fn test_df_shortened_long_argument() {
|
|
|
|
new_ucmd!().arg("--a").succeeds();
|
|
|
|
}
|
|
|
|
|
2020-04-28 07:34:55 +00:00
|
|
|
#[test]
|
|
|
|
fn test_df_compatible() {
|
2021-04-22 20:37:44 +00:00
|
|
|
new_ucmd!().arg("-ah").succeeds();
|
2020-04-28 07:34:55 +00:00
|
|
|
}
|
2020-04-30 21:02:22 +00:00
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn test_df_compatible_type() {
|
2021-04-22 20:37:44 +00:00
|
|
|
new_ucmd!().arg("-aT").succeeds();
|
2020-04-30 21:02:22 +00:00
|
|
|
}
|
2020-04-29 17:03:22 +00:00
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn test_df_compatible_si() {
|
2021-04-22 20:37:44 +00:00
|
|
|
new_ucmd!().arg("-aH").succeeds();
|
2020-04-29 17:03:22 +00:00
|
|
|
}
|
|
|
|
|
2021-05-03 08:55:17 +00:00
|
|
|
#[test]
|
|
|
|
fn test_df_output() {
|
2022-02-24 02:28:07 +00:00
|
|
|
// TODO These should fail because `-total` should have two dashes,
|
|
|
|
// not just one. But they don't fail.
|
2021-05-03 08:55:17 +00:00
|
|
|
if cfg!(target_os = "macos") {
|
|
|
|
new_ucmd!().arg("-H").arg("-total").succeeds().
|
|
|
|
stdout_only("Filesystem Size Used Available Capacity Use% Mounted on \n");
|
|
|
|
} else {
|
|
|
|
new_ucmd!().arg("-H").arg("-total").succeeds().stdout_only(
|
2021-05-08 11:13:52 +00:00
|
|
|
"Filesystem Size Used Available Use% Mounted on \n",
|
2021-05-03 08:55:17 +00:00
|
|
|
);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-02-13 02:02:09 +00:00
|
|
|
/// Test that the order of rows in the table does not change across executions.
|
|
|
|
#[test]
|
|
|
|
fn test_order_same() {
|
2022-02-22 01:50:55 +00:00
|
|
|
let output1 = new_ucmd!()
|
|
|
|
.arg("--output=source")
|
|
|
|
.succeeds()
|
|
|
|
.stdout_move_str();
|
|
|
|
let output2 = new_ucmd!()
|
|
|
|
.arg("--output=source")
|
|
|
|
.succeeds()
|
|
|
|
.stdout_move_str();
|
2022-02-13 02:02:09 +00:00
|
|
|
assert_eq!(output1, output2);
|
|
|
|
}
|
|
|
|
|
2022-03-11 08:36:34 +00:00
|
|
|
/// Test of mount point begin repeated
|
|
|
|
#[cfg(unix)]
|
|
|
|
#[test]
|
|
|
|
fn test_output_mp_repeat() {
|
|
|
|
let output1 = new_ucmd!().arg("/").arg("/").succeeds().stdout_move_str();
|
|
|
|
let output1: Vec<String> = output1
|
|
|
|
.lines()
|
|
|
|
.map(|l| String::from(l.split_once(' ').unwrap().0))
|
|
|
|
.collect();
|
|
|
|
assert_eq!(3, output1.len());
|
|
|
|
assert_eq!(output1[1], output1[2]);
|
|
|
|
}
|
2022-02-17 05:43:59 +00:00
|
|
|
#[test]
|
|
|
|
fn test_output_conflict_options() {
|
|
|
|
for option in ["-i", "-T", "-P"] {
|
|
|
|
new_ucmd!().arg("--output=source").arg(option).fails();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn test_output_option() {
|
|
|
|
new_ucmd!().arg("--output").succeeds();
|
|
|
|
new_ucmd!().arg("--output=source,target").succeeds();
|
|
|
|
new_ucmd!().arg("--output=invalid_option").fails();
|
|
|
|
}
|
|
|
|
|
2022-03-28 08:13:54 +00:00
|
|
|
#[test]
|
|
|
|
fn test_output_option_without_equals_sign() {
|
|
|
|
new_ucmd!().arg("--output").arg(".").succeeds();
|
|
|
|
}
|
|
|
|
|
2022-02-17 05:43:59 +00:00
|
|
|
#[test]
|
|
|
|
fn test_type_option() {
|
|
|
|
new_ucmd!().args(&["-t", "ext4", "-t", "ext3"]).succeeds();
|
|
|
|
}
|
|
|
|
|
2022-03-14 09:32:42 +00:00
|
|
|
#[test]
|
|
|
|
fn test_exclude_type_option() {
|
|
|
|
new_ucmd!().args(&["-x", "ext4", "-x", "ext3"]).succeeds();
|
|
|
|
}
|
|
|
|
|
2022-02-27 16:20:27 +00:00
|
|
|
#[test]
|
|
|
|
fn test_total() {
|
|
|
|
// Example output:
|
|
|
|
//
|
|
|
|
// Filesystem 1K-blocks Used Available Use% Mounted on
|
|
|
|
// udev 3858016 0 3858016 0% /dev
|
|
|
|
// ...
|
|
|
|
// /dev/loop14 63488 63488 0 100% /snap/core20/1361
|
|
|
|
// total 258775268 98099712 148220200 40% -
|
|
|
|
let output = new_ucmd!().arg("--total").succeeds().stdout_move_str();
|
|
|
|
|
|
|
|
// Skip the header line.
|
|
|
|
let lines: Vec<&str> = output.lines().skip(1).collect();
|
|
|
|
|
|
|
|
// Parse the values from the last row.
|
|
|
|
let last_line = lines.last().unwrap();
|
|
|
|
let mut iter = last_line.split_whitespace();
|
|
|
|
assert_eq!(iter.next().unwrap(), "total");
|
|
|
|
let reported_total_size = iter.next().unwrap().parse().unwrap();
|
|
|
|
let reported_total_used = iter.next().unwrap().parse().unwrap();
|
|
|
|
let reported_total_avail = iter.next().unwrap().parse().unwrap();
|
|
|
|
|
|
|
|
// Loop over each row except the last, computing the sum of each column.
|
|
|
|
let mut computed_total_size = 0;
|
|
|
|
let mut computed_total_used = 0;
|
|
|
|
let mut computed_total_avail = 0;
|
|
|
|
let n = lines.len();
|
|
|
|
for line in &lines[..n - 1] {
|
|
|
|
let mut iter = line.split_whitespace();
|
|
|
|
iter.next().unwrap();
|
|
|
|
computed_total_size += iter.next().unwrap().parse::<u64>().unwrap();
|
|
|
|
computed_total_used += iter.next().unwrap().parse::<u64>().unwrap();
|
|
|
|
computed_total_avail += iter.next().unwrap().parse::<u64>().unwrap();
|
|
|
|
}
|
|
|
|
|
|
|
|
// Check that the sum of each column matches the reported value in
|
|
|
|
// the last row.
|
|
|
|
assert_eq!(computed_total_size, reported_total_size);
|
|
|
|
assert_eq!(computed_total_used, reported_total_used);
|
|
|
|
assert_eq!(computed_total_avail, reported_total_avail);
|
2022-03-08 14:13:05 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn test_use_percentage() {
|
2022-03-25 09:46:13 +00:00
|
|
|
let output = new_ucmd!()
|
2022-04-01 06:25:30 +00:00
|
|
|
.args(&["--total", "--output=used,avail,pcent"])
|
2022-03-25 09:46:13 +00:00
|
|
|
.succeeds()
|
|
|
|
.stdout_move_str();
|
2022-03-08 14:13:05 +00:00
|
|
|
|
|
|
|
// Skip the header line.
|
|
|
|
let lines: Vec<&str> = output.lines().skip(1).collect();
|
|
|
|
|
|
|
|
for line in lines {
|
|
|
|
let mut iter = line.split_whitespace();
|
|
|
|
let reported_used = iter.next().unwrap().parse::<f64>().unwrap();
|
2022-03-25 09:46:13 +00:00
|
|
|
let reported_avail = iter.next().unwrap().parse::<f64>().unwrap();
|
2022-03-08 14:13:05 +00:00
|
|
|
let reported_percentage = iter.next().unwrap();
|
|
|
|
let reported_percentage = reported_percentage[..reported_percentage.len() - 1]
|
|
|
|
.parse::<u8>()
|
|
|
|
.unwrap();
|
2022-03-25 09:46:13 +00:00
|
|
|
let computed_percentage =
|
|
|
|
(100.0 * (reported_used / (reported_used + reported_avail))).ceil() as u8;
|
2022-03-08 14:13:05 +00:00
|
|
|
|
|
|
|
assert_eq!(computed_percentage, reported_percentage);
|
|
|
|
}
|
2022-02-27 16:20:27 +00:00
|
|
|
}
|
|
|
|
|
2022-02-24 02:28:07 +00:00
|
|
|
#[test]
|
|
|
|
fn test_block_size_1024() {
|
|
|
|
fn get_header(block_size: u64) -> String {
|
|
|
|
// TODO When #3057 is resolved, we should just use
|
|
|
|
//
|
|
|
|
// new_ucmd!().arg("--output=size").succeeds().stdout_move_str();
|
|
|
|
//
|
|
|
|
// instead of parsing the entire `df` table as a string.
|
|
|
|
let output = new_ucmd!()
|
|
|
|
.args(&["-B", &format!("{}", block_size)])
|
|
|
|
.succeeds()
|
|
|
|
.stdout_move_str();
|
|
|
|
let first_line = output.lines().next().unwrap();
|
|
|
|
let mut column_labels = first_line.split_whitespace();
|
|
|
|
let size_column_label = column_labels.nth(1).unwrap();
|
|
|
|
size_column_label.into()
|
|
|
|
}
|
|
|
|
|
|
|
|
assert_eq!(get_header(1024), "1K-blocks");
|
|
|
|
assert_eq!(get_header(2048), "2K-blocks");
|
|
|
|
assert_eq!(get_header(4096), "4K-blocks");
|
|
|
|
assert_eq!(get_header(1024 * 1024), "1M-blocks");
|
|
|
|
assert_eq!(get_header(2 * 1024 * 1024), "2M-blocks");
|
|
|
|
assert_eq!(get_header(1024 * 1024 * 1024), "1G-blocks");
|
|
|
|
assert_eq!(get_header(34 * 1024 * 1024 * 1024), "34G-blocks");
|
|
|
|
}
|
|
|
|
|
2022-02-22 00:54:12 +00:00
|
|
|
// TODO The spacing does not match GNU df. Also we need to remove
|
|
|
|
// trailing spaces from the heading row.
|
|
|
|
#[test]
|
|
|
|
fn test_output_selects_columns() {
|
|
|
|
let output = new_ucmd!()
|
|
|
|
.args(&["--output=source"])
|
|
|
|
.succeeds()
|
|
|
|
.stdout_move_str();
|
|
|
|
assert_eq!(output.lines().next().unwrap(), "Filesystem ");
|
|
|
|
|
|
|
|
let output = new_ucmd!()
|
|
|
|
.args(&["--output=source,target"])
|
|
|
|
.succeeds()
|
|
|
|
.stdout_move_str();
|
|
|
|
assert_eq!(
|
|
|
|
output.lines().next().unwrap(),
|
|
|
|
"Filesystem Mounted on "
|
|
|
|
);
|
|
|
|
|
|
|
|
let output = new_ucmd!()
|
|
|
|
.args(&["--output=source,target,used"])
|
|
|
|
.succeeds()
|
|
|
|
.stdout_move_str();
|
|
|
|
assert_eq!(
|
|
|
|
output.lines().next().unwrap(),
|
|
|
|
"Filesystem Mounted on Used "
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
2022-03-28 02:14:16 +00:00
|
|
|
#[test]
|
|
|
|
fn test_output_multiple_occurrences() {
|
|
|
|
let output = new_ucmd!()
|
|
|
|
.args(&["--output=source", "--output=target"])
|
|
|
|
.succeeds()
|
|
|
|
.stdout_move_str();
|
|
|
|
assert_eq!(
|
|
|
|
output.lines().next().unwrap(),
|
|
|
|
"Filesystem Mounted on "
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
2022-03-22 02:03:10 +00:00
|
|
|
// TODO Fix the spacing.
|
|
|
|
#[test]
|
|
|
|
fn test_output_file_all_filesystems() {
|
|
|
|
// When run with no positional arguments, `df` lets "-" represent
|
|
|
|
// the "File" entry for each row.
|
|
|
|
let output = new_ucmd!()
|
|
|
|
.arg("--output=file")
|
|
|
|
.succeeds()
|
|
|
|
.stdout_move_str();
|
|
|
|
let mut lines = output.lines();
|
|
|
|
assert_eq!(lines.next().unwrap(), "File ");
|
|
|
|
for line in lines {
|
|
|
|
assert_eq!(line, "- ");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// TODO Fix the spacing.
|
|
|
|
#[test]
|
|
|
|
fn test_output_file_specific_files() {
|
|
|
|
// Create three files.
|
|
|
|
let (at, mut ucmd) = at_and_ucmd!();
|
|
|
|
at.touch("a");
|
|
|
|
at.touch("b");
|
|
|
|
at.touch("c");
|
|
|
|
|
|
|
|
// When run with positional arguments, the filesystems should
|
|
|
|
// appear in the "File" column.
|
|
|
|
let output = ucmd
|
|
|
|
.args(&["--output=file", "a", "b", "c"])
|
|
|
|
.succeeds()
|
|
|
|
.stdout_move_str();
|
|
|
|
let actual: Vec<&str> = output.lines().collect();
|
|
|
|
assert_eq!(
|
|
|
|
actual,
|
|
|
|
vec![
|
|
|
|
"File ",
|
|
|
|
"a ",
|
|
|
|
"b ",
|
|
|
|
"c "
|
|
|
|
]
|
|
|
|
);
|
|
|
|
}
|
2022-03-28 02:02:55 +00:00
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn test_output_field_no_more_than_once() {
|
|
|
|
new_ucmd!()
|
|
|
|
.arg("--output=target,source,target")
|
|
|
|
.fails()
|
|
|
|
.usage_error("option --output: field 'target' used more than once");
|
|
|
|
}
|