mirror of
https://github.com/RGBCube/uutils-coreutils
synced 2025-07-28 11:37:44 +00:00
test_tail: add test_retry8-9
This commit is contained in:
parent
016291b92e
commit
07eb50248b
1 changed files with 127 additions and 0 deletions
|
@ -767,6 +767,133 @@ fn test_retry7() {
|
||||||
assert_eq!(buf_stderr, expected_stderr);
|
assert_eq!(buf_stderr, expected_stderr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
#[cfg(unix)]
|
||||||
|
fn test_retry8() {
|
||||||
|
// Ensure that inotify will switch to polling mode if directory
|
||||||
|
// of the watched file was initially missing and later created.
|
||||||
|
// This is similar to test_retry9, but without:
|
||||||
|
// tail: directory containing watched file was removed\n\
|
||||||
|
// tail: inotify cannot be used, reverting to polling\n\
|
||||||
|
|
||||||
|
let ts = TestScenario::new(util_name!());
|
||||||
|
let at = &ts.fixtures;
|
||||||
|
let watched_file = std::path::Path::new("watched_file");
|
||||||
|
let parent_dir = std::path::Path::new("parent_dir");
|
||||||
|
let user_path = parent_dir.join(watched_file);
|
||||||
|
// let watched_file = watched_file.to_str().unwrap();
|
||||||
|
let parent_dir = parent_dir.to_str().unwrap();
|
||||||
|
let user_path = user_path.to_str().unwrap();
|
||||||
|
|
||||||
|
let expected_stderr = "\
|
||||||
|
tail: cannot open 'parent_dir/watched_file' for reading: No such file or directory\n\
|
||||||
|
tail: 'parent_dir/watched_file' has appeared; following new file\n\
|
||||||
|
tail: 'parent_dir/watched_file' has become inaccessible: No such file or directory\n\
|
||||||
|
tail: 'parent_dir/watched_file' has appeared; following new file\n";
|
||||||
|
let expected_stdout = "foo\nbar\n";
|
||||||
|
|
||||||
|
let delay = 1000;
|
||||||
|
|
||||||
|
let mut p = ts
|
||||||
|
.ucmd()
|
||||||
|
.arg("-F")
|
||||||
|
.arg("-s.1")
|
||||||
|
.arg("--max-unchanged-stats=1")
|
||||||
|
.arg(user_path)
|
||||||
|
.run_no_wait();
|
||||||
|
sleep(Duration::from_millis(delay));
|
||||||
|
|
||||||
|
at.mkdir(parent_dir);
|
||||||
|
at.append(user_path, "foo\n");
|
||||||
|
sleep(Duration::from_millis(delay));
|
||||||
|
|
||||||
|
at.remove(user_path);
|
||||||
|
at.rmdir(parent_dir);
|
||||||
|
sleep(Duration::from_millis(delay));
|
||||||
|
|
||||||
|
at.mkdir(parent_dir);
|
||||||
|
at.append(user_path, "bar\n");
|
||||||
|
sleep(Duration::from_millis(delay));
|
||||||
|
|
||||||
|
p.kill().unwrap();
|
||||||
|
|
||||||
|
let (buf_stdout, buf_stderr) = take_stdout_stderr(&mut p);
|
||||||
|
assert_eq!(buf_stdout, expected_stdout);
|
||||||
|
assert_eq!(buf_stderr, expected_stderr);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
#[cfg(unix)]
|
||||||
|
fn test_retry9() {
|
||||||
|
// gnu/tests/tail-2/inotify-dir-recreate.sh
|
||||||
|
// Ensure that inotify will switch to polling mode if directory
|
||||||
|
// of the watched file was removed and recreated.
|
||||||
|
|
||||||
|
let ts = TestScenario::new(util_name!());
|
||||||
|
let at = &ts.fixtures;
|
||||||
|
let watched_file = std::path::Path::new("watched_file");
|
||||||
|
let parent_dir = std::path::Path::new("parent_dir");
|
||||||
|
let user_path = parent_dir.join(watched_file);
|
||||||
|
let parent_dir = parent_dir.to_str().unwrap();
|
||||||
|
let user_path = user_path.to_str().unwrap();
|
||||||
|
|
||||||
|
let expected_stderr = format!("\
|
||||||
|
tail: 'parent_dir/watched_file' has become inaccessible: No such file or directory\n\
|
||||||
|
tail: directory containing watched file was removed\n\
|
||||||
|
tail: {} cannot be used, reverting to polling\n\
|
||||||
|
tail: 'parent_dir/watched_file' has appeared; following new file\n\
|
||||||
|
tail: 'parent_dir/watched_file' has become inaccessible: No such file or directory\n\
|
||||||
|
tail: 'parent_dir/watched_file' has appeared; following new file\n\
|
||||||
|
tail: 'parent_dir/watched_file' has become inaccessible: No such file or directory\n\
|
||||||
|
tail: 'parent_dir/watched_file' has appeared; following new file\n", BACKEND);
|
||||||
|
let expected_stdout = "foo\nbar\nfoo\nbar\n";
|
||||||
|
|
||||||
|
let delay = 1000;
|
||||||
|
|
||||||
|
at.mkdir(parent_dir);
|
||||||
|
at.truncate(user_path, "foo\n");
|
||||||
|
let mut p = ts
|
||||||
|
.ucmd()
|
||||||
|
.arg("-F")
|
||||||
|
.arg("-s.1")
|
||||||
|
.arg("--max-unchanged-stats=1")
|
||||||
|
.arg(user_path)
|
||||||
|
.run_no_wait();
|
||||||
|
|
||||||
|
sleep(Duration::from_millis(delay));
|
||||||
|
|
||||||
|
at.remove(user_path);
|
||||||
|
at.rmdir(parent_dir);
|
||||||
|
sleep(Duration::from_millis(delay));
|
||||||
|
|
||||||
|
at.mkdir(parent_dir);
|
||||||
|
at.truncate(user_path, "bar\n");
|
||||||
|
sleep(Duration::from_millis(delay));
|
||||||
|
|
||||||
|
at.remove(user_path);
|
||||||
|
at.rmdir(parent_dir);
|
||||||
|
sleep(Duration::from_millis(delay));
|
||||||
|
|
||||||
|
at.mkdir(parent_dir);
|
||||||
|
at.truncate(user_path, "foo\n");
|
||||||
|
sleep(Duration::from_millis(delay));
|
||||||
|
|
||||||
|
at.remove(user_path);
|
||||||
|
at.rmdir(parent_dir);
|
||||||
|
sleep(Duration::from_millis(delay));
|
||||||
|
|
||||||
|
at.mkdir(parent_dir);
|
||||||
|
at.truncate(user_path, "bar\n");
|
||||||
|
sleep(Duration::from_millis(delay));
|
||||||
|
|
||||||
|
p.kill().unwrap();
|
||||||
|
|
||||||
|
let (buf_stdout, buf_stderr) = take_stdout_stderr(&mut p);
|
||||||
|
// println!("stdout:\n{}\nstderr:\n{}", buf_stdout, buf_stderr); // dbg
|
||||||
|
assert_eq!(buf_stdout, expected_stdout);
|
||||||
|
assert_eq!(buf_stderr, expected_stderr);
|
||||||
|
}
|
||||||
|
|
||||||
// gnu/tests/tail-2/descriptor-vs-rename.sh
|
// gnu/tests/tail-2/descriptor-vs-rename.sh
|
||||||
let ts = TestScenario::new(util_name!());
|
let ts = TestScenario::new(util_name!());
|
||||||
let at = &ts.fixtures;
|
let at = &ts.fixtures;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue