use assert_cmd::Command;
use serial_test::serial;
use tempfile::TempDir;
#[test]
#[serial]
fn limite_respeitado_sob_carga() {
let tmp = TempDir::new().expect("TempDir deve ser criado");
let bin = assert_cmd::cargo::cargo_bin("sqlite-graphrag");
let handles: Vec<_> = (0..10)
.map(|_| {
std::process::Command::new(&bin)
.env("SQLITE_GRAPHRAG_CACHE_DIR", tmp.path())
.args([
"--skip-memory-guard",
"--max-concurrency",
"4",
"--wait-lock",
"30",
"namespace-detect",
])
.spawn()
.expect("falha ao spawnar invocação paralela")
})
.collect();
let resultados: Vec<_> = handles
.into_iter()
.map(|h| h.wait_with_output().expect("wait falhou"))
.collect();
let successos = resultados.iter().filter(|r| r.status.success()).count();
let falhas = resultados.iter().filter(|r| !r.status.success()).count();
assert_eq!(
successos, 10,
"todas as 10 invocações devem completar com sucesso (--wait-lock 30), \
obtivemos {successos} sucessos e {falhas} falhas"
);
}
#[test]
#[serial]
fn max_concurrency_zero_rejeitado_com_exit_2() {
let tmp = TempDir::new().expect("TempDir deve ser criado");
Command::cargo_bin("sqlite-graphrag")
.expect("binário sqlite-graphrag não encontrado")
.env("SQLITE_GRAPHRAG_CACHE_DIR", tmp.path())
.args([
"--skip-memory-guard",
"--max-concurrency",
"0",
"namespace-detect",
])
.assert()
.failure()
.code(2);
}
#[test]
#[serial]
fn todos_slots_ocupados_retornam_75() {
use fs4::fs_std::FileExt;
use std::fs::OpenOptions;
let tmp = TempDir::new().expect("TempDir deve ser criado");
let max: usize = 4;
let mut handles = Vec::new();
for slot in 1..=max {
let path = tmp.path().join(format!("cli-slot-{slot}.lock"));
let file = OpenOptions::new()
.read(true)
.write(true)
.create(true)
.truncate(false)
.open(&path)
.expect("criação de lock file deve funcionar");
file.try_lock_exclusive()
.unwrap_or_else(|_| panic!("slot {slot} deve estar livre antes do teste"));
handles.push(file);
}
Command::cargo_bin("sqlite-graphrag")
.expect("binário sqlite-graphrag não encontrado")
.env("SQLITE_GRAPHRAG_CACHE_DIR", tmp.path())
.args([
"--skip-memory-guard",
"--max-concurrency",
"4",
"--wait-lock",
"0",
"namespace-detect",
])
.assert()
.failure()
.code(75);
drop(handles);
}
#[test]
#[serial]
fn skip_memory_guard_bypassa_verificacao_de_ram() {
let tmp = TempDir::new().expect("TempDir deve ser criado");
Command::cargo_bin("sqlite-graphrag")
.expect("binário sqlite-graphrag não encontrado")
.env("SQLITE_GRAPHRAG_CACHE_DIR", tmp.path())
.args(["--skip-memory-guard", "namespace-detect"])
.assert()
.success();
}