M13: isolate automation workdirs by call site (#1223)

This commit is contained in:
cyfung1031 2026-10-12 14:29:56 +09:00 committed by GitHub
parent 31938de20a
commit b84ab4507a
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
1 changed files with 30 additions and 1 deletions

View File

@ -36,8 +36,10 @@ fn fixture(n: usize) -> Vec<u8> {
}
/// A fresh directory with `a.pdf` (3 pages) and `b.pdf` (2 pages).
#[track_caller]
fn workdir(test: &str) -> PathBuf {
let dir = std::env::temp_dir().join(format!("pdfcraft-automation-{test}-{}", std::process::id()));
let caller = std::panic::Location::caller();
let dir = std::env::temp_dir().join(format!("pdfcraft-automation-{test}-{}-{}-{}", std::process::id(), caller.line(), caller.column(),));
let _ = std::fs::remove_dir_all(&dir);
std::fs::create_dir_all(&dir).unwrap();
std::fs::write(dir.join("a.pdf"), fixture(3)).unwrap();
@ -45,6 +47,33 @@ fn workdir(test: &str) -> PathBuf {
dir
}
#[test]
fn workdir_call_sites_do_not_delete_each_other() {
let first = workdir("same-tag");
let sentinel = first.join("sentinel");
std::fs::write(&sentinel, b"first call site").unwrap();
let second = workdir("same-tag");
let paths_differ = first != second;
let sentinel_bytes = std::fs::read(&sentinel).ok();
let first_a = std::fs::read(first.join("a.pdf")).ok();
let first_b = std::fs::read(first.join("b.pdf")).ok();
let second_a = std::fs::read(second.join("a.pdf")).ok();
let second_b = std::fs::read(second.join("b.pdf")).ok();
let _ = std::fs::remove_dir_all(&first);
if paths_differ {
let _ = std::fs::remove_dir_all(&second);
}
assert!(paths_differ, "distinct call sites shared {first:?}");
assert_eq!(sentinel_bytes.as_deref(), Some(&b"first call site"[..]));
assert_eq!(first_a, Some(fixture(3)));
assert_eq!(first_b, Some(fixture(2)));
assert_eq!(second_a, Some(fixture(3)));
assert_eq!(second_b, Some(fixture(2)));
}
fn auto(dir: &Path) -> Automation {
Automation::new().with_root(dir).unwrap().with_clock(|| 1_700_000_000)
}