use std::process::Command;
#[test]
fn second_writer_fails_fast_and_read_only_shared_lock_blocks_while_writer_active() {
let dir = tempfile::tempdir().unwrap();
let path = dir.path().join("t.modelvault");
let _db = modelvault_core::Database::open(&path).unwrap();
let _ro = modelvault_core::Database::open_read_only(&path).unwrap();
let exe = std::env::current_exe().unwrap();
let out_ro = Command::new(&exe)
.env("MODELVAULT_LOCKING_CHILD", "1")
.env("MODELVAULT_LOCK_PATH", path.to_str().unwrap())
.arg("--exact")
.arg("_child_read_only_open")
.arg("--nocapture")
.output()
.unwrap();
assert!(!out_ro.status.success());
let out = Command::new(exe)
.env("MODELVAULT_LOCKING_CHILD", "1")
.env("MODELVAULT_LOCK_PATH", path.to_str().unwrap())
.arg("--exact")
.arg("_child_writer_open")
.arg("--nocapture")
.output()
.unwrap();
assert!(!out.status.success());
}
#[test]
fn _child_writer_open() {
if std::env::var("MODELVAULT_LOCKING_CHILD").ok().as_deref() != Some("1") {
return;
}
let path = std::env::var("MODELVAULT_LOCK_PATH").unwrap();
let res = modelvault_core::Database::open(&path);
if res.is_ok() {
std::process::exit(0);
}
std::process::exit(2);
}
#[test]
fn _child_read_only_open() {
if std::env::var("MODELVAULT_LOCKING_CHILD").ok().as_deref() != Some("1") {
return;
}
let path = std::env::var("MODELVAULT_LOCK_PATH").unwrap();
let res = modelvault_core::Database::open_read_only(&path);
if res.is_ok() {
std::process::exit(0);
}
std::process::exit(2);
}