use basemind::config::ConfigV1;
use basemind::index::IndexDb;
use basemind::scanner::{ScanSource, scan};
use basemind::store::{Store, VIEW_WORKING};
use tempfile::TempDir;
fn scanned_repo() -> TempDir {
let dir = tempfile::tempdir().expect("tempdir");
let root = dir.path();
std::fs::write(root.join("a.rs"), b"pub fn alpha() {}\n").expect("write a.rs");
std::fs::write(root.join("b.rs"), b"fn beta() { alpha(); alpha(); }\n").expect("write b.rs");
{
let mut store = Store::open(root, VIEW_WORKING).expect("open store");
scan(
root,
&mut store,
&ConfigV1::with_defaults(),
ScanSource::WorkingTree,
)
.expect("scan");
} dir
}
#[test]
fn fjall_index_rejects_a_second_concurrent_opener() {
let dir = scanned_repo();
let view_dir = dir.path().join(".basemind/views/working");
let first = IndexDb::open(&view_dir).expect("first open succeeds");
let second = IndexDb::open(&view_dir);
assert!(
second.is_err(),
"fjall ALLOWED a second concurrent open — multi-reader works, look elsewhere"
);
drop(first);
}
#[test]
fn second_session_loses_the_fjall_index_but_keeps_blob_reads() {
let dir = scanned_repo();
let root = dir.path();
let serve1 = Store::open(root, VIEW_WORKING).expect("serve #1");
assert!(serve1.index_db.is_some(), "serve #1 owns the Fjall index");
let serve2 = Store::open_read_only(root, VIEW_WORKING).expect("serve #2 read-only fallback");
assert!(
serve2.index_db.is_none(),
"2nd concurrent session has no Fjall index (single-holder lock). \
find_references/find_callers are served from the in-RAM call index instead — \
see concurrency_smoke::second_session_resolves_find_references_from_blobs."
);
let hits = basemind::query::search_symbols(&serve2, "alpha", None).expect("search");
assert_eq!(
hits.len(),
1,
"blob-backed search still works on the 2nd session"
);
}