use pagedb::vfs::tokio_backend::TokioVfs;
use pagedb::{Db, OpenOptions, PagedbError, RealmId};
const PAGE: usize = 4096;
const KEK: [u8; 32] = [7u8; 32];
const REALM: RealmId = RealmId::new([3u8; 16]);
#[tokio::test(flavor = "current_thread")]
async fn second_disk_open_fails_fast_without_corrupting_first_handle() {
let dir = tempfile::tempdir().unwrap();
let vfs = TokioVfs::new(dir.path());
let db = Db::open(vfs.clone(), KEK, PAGE, REALM, OpenOptions::default())
.await
.unwrap();
let mut w = db.begin_write().await.unwrap();
w.put(b"key", b"value").await.unwrap();
w.commit().await.unwrap();
let err = Db::open(vfs, KEK, PAGE, REALM, OpenOptions::default())
.await
.err()
.unwrap();
assert!(matches!(err, PagedbError::AlreadyOpen));
let r = db.begin_read().await.unwrap();
assert_eq!(
r.get(b"key").await.unwrap().as_deref(),
Some(b"value".as_slice())
);
drop(r);
let mut w2 = db.begin_write().await.unwrap();
w2.put(b"key2", b"value2").await.unwrap();
w2.commit().await.unwrap();
let r2 = db.begin_read().await.unwrap();
assert_eq!(
r2.get(b"key").await.unwrap().as_deref(),
Some(b"value".as_slice())
);
assert_eq!(
r2.get(b"key2").await.unwrap().as_deref(),
Some(b"value2".as_slice())
);
}