1
Fork 0
mirror of https://github.com/RGBCube/uutils-coreutils synced 2025-07-28 11:37:44 +00:00

tests: define default env vars for test commands

We now run each command with TZ=UTC and LC_ALL=C to ensure consistent
behavior independent from external timezone and locale settings. These
can still be overridden with other values if necessary.
This commit is contained in:
Terts Diepraam 2023-03-23 18:15:05 +01:00
parent 7853d3707b
commit 4dd88680eb
3 changed files with 29 additions and 21 deletions

View file

@ -18,11 +18,7 @@ fn file_last_modified_time(ucmd: &UCommand, path: &str) -> String {
i.modified() i.modified()
.map(|x| { .map(|x| {
let date_time: OffsetDateTime = x.into(); let date_time: OffsetDateTime = x.into();
let offset = OffsetDateTime::now_local().unwrap().offset(); date_time.format(&DATE_TIME_FORMAT).unwrap()
date_time
.to_offset(offset)
.format(&DATE_TIME_FORMAT)
.unwrap()
}) })
.unwrap_or_default() .unwrap_or_default()
}) })
@ -42,7 +38,7 @@ fn all_minutes(from: OffsetDateTime, to: OffsetDateTime) -> Vec<String> {
} }
fn valid_last_modified_template_vars(from: OffsetDateTime) -> Vec<Vec<(String, String)>> { fn valid_last_modified_template_vars(from: OffsetDateTime) -> Vec<Vec<(String, String)>> {
all_minutes(from, OffsetDateTime::now_local().unwrap()) all_minutes(from, OffsetDateTime::now_utc())
.into_iter() .into_iter()
.map(|time| vec![("{last_modified_time}".to_string(), time)]) .map(|time| vec![("{last_modified_time}".to_string(), time)])
.collect() .collect()
@ -258,7 +254,7 @@ fn test_with_suppress_error_option() {
fn test_with_stdin() { fn test_with_stdin() {
let expected_file_path = "stdin.log.expected"; let expected_file_path = "stdin.log.expected";
let mut scenario = new_ucmd!(); let mut scenario = new_ucmd!();
let start = OffsetDateTime::now_local().unwrap(); let start = OffsetDateTime::now_utc();
scenario scenario
.pipe_in_fixture("stdin.log") .pipe_in_fixture("stdin.log")
.args(&["--pages=1:2", "-n", "-"]) .args(&["--pages=1:2", "-n", "-"])
@ -321,7 +317,7 @@ fn test_with_mpr() {
let expected_test_file_path = "mpr.log.expected"; let expected_test_file_path = "mpr.log.expected";
let expected_test_file_path1 = "mpr1.log.expected"; let expected_test_file_path1 = "mpr1.log.expected";
let expected_test_file_path2 = "mpr2.log.expected"; let expected_test_file_path2 = "mpr2.log.expected";
let start = OffsetDateTime::now_local().unwrap(); let start = OffsetDateTime::now_utc();
new_ucmd!() new_ucmd!()
.args(&["--pages=1:2", "-m", "-n", test_file_path, test_file_path1]) .args(&["--pages=1:2", "-m", "-n", test_file_path, test_file_path1])
.succeeds() .succeeds()
@ -330,7 +326,7 @@ fn test_with_mpr() {
&valid_last_modified_template_vars(start), &valid_last_modified_template_vars(start),
); );
let start = OffsetDateTime::now_local().unwrap(); let start = OffsetDateTime::now_utc();
new_ucmd!() new_ucmd!()
.args(&["--pages=2:4", "-m", "-n", test_file_path, test_file_path1]) .args(&["--pages=2:4", "-m", "-n", test_file_path, test_file_path1])
.succeeds() .succeeds()
@ -339,7 +335,7 @@ fn test_with_mpr() {
&valid_last_modified_template_vars(start), &valid_last_modified_template_vars(start),
); );
let start = OffsetDateTime::now_local().unwrap(); let start = OffsetDateTime::now_utc();
new_ucmd!() new_ucmd!()
.args(&[ .args(&[
"--pages=1:2", "--pages=1:2",
@ -446,7 +442,7 @@ fn test_with_join_lines_option() {
let test_file_2 = "test.log"; let test_file_2 = "test.log";
let expected_file_path = "joined.log.expected"; let expected_file_path = "joined.log.expected";
let mut scenario = new_ucmd!(); let mut scenario = new_ucmd!();
let start = OffsetDateTime::now_local().unwrap(); let start = OffsetDateTime::now_utc();
scenario scenario
.args(&["+1:2", "-J", "-m", test_file_1, test_file_2]) .args(&["+1:2", "-J", "-m", test_file_1, test_file_2])
.run() .run()

View file

@ -49,12 +49,7 @@ fn str_to_filetime(format: &str, s: &str) -> FileTime {
_ => panic!("unexpected dt format"), _ => panic!("unexpected dt format"),
}; };
let tm = time::PrimitiveDateTime::parse(s, &format_description).unwrap(); let tm = time::PrimitiveDateTime::parse(s, &format_description).unwrap();
let d = match time::OffsetDateTime::now_local() { let d = time::OffsetDateTime::now_utc();
Ok(now) => now,
Err(e) => {
panic!("Error {e} retrieving the OffsetDateTime::now_local");
}
};
let offset_dt = tm.assume_offset(d.offset()); let offset_dt = tm.assume_offset(d.offset());
FileTime::from_unix_time(offset_dt.unix_timestamp(), tm.nanosecond()) FileTime::from_unix_time(offset_dt.unix_timestamp(), tm.nanosecond())
} }

View file

@ -48,6 +48,9 @@ static NO_STDIN_MEANINGLESS: &str = "Setting this flag has no effect if there is
pub const TESTS_BINARY: &str = env!("CARGO_BIN_EXE_coreutils"); pub const TESTS_BINARY: &str = env!("CARGO_BIN_EXE_coreutils");
/// Default environment variables to run the commands with
const DEFAULT_ENV: [(&str, &str); 2] = [("LC_ALL", "C"), ("TZ", "UTC")];
/// Test if the program is running under CI /// Test if the program is running under CI
pub fn is_ci() -> bool { pub fn is_ci() -> bool {
std::env::var("CI") std::env::var("CI")
@ -1340,6 +1343,18 @@ impl UCommand {
self self
} }
pub fn envs<I, K, V>(&mut self, iter: I) -> &mut Self
where
I: IntoIterator<Item = (K, V)>,
K: AsRef<OsStr>,
V: AsRef<OsStr>,
{
for (k, v) in iter {
self.env(k, v);
}
self
}
#[cfg(any(target_os = "linux", target_os = "android"))] #[cfg(any(target_os = "linux", target_os = "android"))]
pub fn limit( pub fn limit(
&mut self, &mut self,
@ -1454,7 +1469,9 @@ impl UCommand {
} }
} }
command.envs(self.env_vars.iter().cloned()); command
.envs(DEFAULT_ENV)
.envs(self.env_vars.iter().cloned());
if self.timeout.is_none() { if self.timeout.is_none() {
self.timeout = Some(Duration::from_secs(30)); self.timeout = Some(Duration::from_secs(30));
@ -2456,7 +2473,7 @@ pub fn expected_result(ts: &TestScenario, args: &[&str]) -> std::result::Result<
let result = ts let result = ts
.cmd(util_name.as_ref()) .cmd(util_name.as_ref())
.keep_env() .keep_env()
.env("LC_ALL", "C") .envs(DEFAULT_ENV)
.args(args) .args(args)
.run(); .run();
@ -2521,7 +2538,7 @@ pub fn run_ucmd_as_root(
// check if we can run 'sudo' // check if we can run 'sudo'
log_info("run", "sudo -E --non-interactive whoami"); log_info("run", "sudo -E --non-interactive whoami");
match Command::new("sudo") match Command::new("sudo")
.env("LC_ALL", "C") .envs(DEFAULT_ENV)
.args(["-E", "--non-interactive", "whoami"]) .args(["-E", "--non-interactive", "whoami"])
.output() .output()
{ {
@ -2531,7 +2548,7 @@ pub fn run_ucmd_as_root(
Ok(ts Ok(ts
.cmd("sudo") .cmd("sudo")
.keep_env() .keep_env()
.env("LC_ALL", "C") .envs(DEFAULT_ENV)
.arg("-E") .arg("-E")
.arg("--non-interactive") .arg("--non-interactive")
.arg(&ts.bin_path) .arg(&ts.bin_path)