use std::process::Command;
#[cfg(unix)]
pub fn freeze_snapshot_sidecars(path: &std::path::Path) {
use std::os::unix::fs::PermissionsExt;
for suffix in ["-wal", "-shm"] {
let mut name = path.file_name().expect("db file name").to_os_string();
name.push(suffix);
let sidecar = path.parent().expect("db parent dir").join(name);
if sidecar.exists() {
let mut permissions = std::fs::metadata(&sidecar)
.expect("sidecar metadata")
.permissions();
permissions.set_mode(0o444);
std::fs::set_permissions(&sidecar, permissions).expect("freeze sidecar");
}
}
}
pub fn run_exact_test_in_child(
marker: &str,
include_ignored: bool,
configure: impl FnOnce(&mut Command),
) -> bool {
let thread = std::thread::current();
let name = thread.name().expect("libtest names its test threads");
let mut arguments = vec!["--exact", name];
if include_ignored {
arguments.push("--include-ignored");
}
arguments.extend(["--nocapture", "--test-threads=1"]);
if std::env::var(marker).ok().as_deref() == Some(name) {
assert_eq!(
std::env::args().skip(1).collect::<Vec<_>>(),
arguments,
"isolated child must run exactly its one named test"
);
return false;
}
let mut command = Command::new(std::env::current_exe().expect("current test executable"));
configure(&mut command);
let output = command
.args(arguments)
.env(marker, name)
.output()
.expect("spawn isolated test");
assert!(
output.status.success()
&& String::from_utf8_lossy(&output.stdout)
.contains("test result: ok. 1 passed; 0 failed;"),
"isolated test must execute exactly one passing case:\n{}\n{}",
String::from_utf8_lossy(&output.stdout),
String::from_utf8_lossy(&output.stderr)
);
true
}