#![allow(dead_code)]
use std::path::PathBuf;
use std::sync::atomic::{AtomicU64, Ordering};
use std::sync::Mutex;
use std::time::{SystemTime, UNIX_EPOCH};
use crate::factory::StoreFactory;
use alkblobs::{Error, Store, StoreMode, DEFAULT_DISPATCH_THRESHOLD};
struct MemOnlyBinding;
impl StoreFactory for MemOnlyBinding {
fn name(&self) -> &'static str {
"mem-only (binding demo)"
}
async fn open(&self) -> Result<Store, Error> {
Ok(Store::mem_only())
}
async fn teardown(&self) -> Result<(), Error> {
Ok(())
}
}
fn fresh_temp_root() -> PathBuf {
static SEQ: AtomicU64 = AtomicU64::new(0);
let seq = SEQ.fetch_add(1, Ordering::Relaxed);
let nanos = SystemTime::now()
.duration_since(UNIX_EPOCH)
.map(|d| d.as_nanos())
.unwrap_or(0);
let dir = std::env::temp_dir().join(format!(
"alkblobs-conformance-{}-{:x}-{seq}",
std::process::id(),
nanos
));
std::fs::create_dir_all(&dir).expect("temp root created");
dir
}
struct DualTierBinding {
roots: Mutex<Vec<PathBuf>>,
}
impl Default for DualTierBinding {
fn default() -> Self {
DualTierBinding {
roots: Mutex::new(Vec::new()),
}
}
}
impl StoreFactory for DualTierBinding {
fn name(&self) -> &'static str {
"dual-tier mem+local (binding demo)"
}
async fn open(&self) -> Result<Store, Error> {
let path = fresh_temp_root();
let store = Store::dual_tier_mem_local(path.clone(), DEFAULT_DISPATCH_THRESHOLD).await?;
self.roots
.lock()
.unwrap_or_else(|e| e.into_inner())
.push(path);
Ok(store)
}
async fn teardown(&self) -> Result<(), Error> {
for root in self
.roots
.lock()
.unwrap_or_else(|e| e.into_inner())
.drain(..)
{
match std::fs::remove_dir_all(&root) {
Ok(()) => {}
Err(e) if e.kind() == std::io::ErrorKind::NotFound => {}
Err(e) => return Err(Error::Io(e.to_string())),
}
}
Ok(())
}
}
#[tokio::test]
async fn binding_factory_vends_the_concrete_store_facade() {
let factory = MemOnlyBinding;
assert_eq!(factory.name(), "mem-only (binding demo)");
let store = factory.open().await.expect("open vends the store");
assert_eq!(store.mode(), StoreMode::MemOnly);
factory.teardown().await.expect("teardown is idempotent");
factory.teardown().await.expect("teardown repeats cleanly");
}
#[tokio::test]
async fn dual_tier_binding_factory_vends_isolated_stores() {
let factory = DualTierBinding::default();
assert_eq!(factory.name(), "dual-tier mem+local (binding demo)");
for _ in 0..2 {
let store = factory.open().await.expect("open vends the store");
assert_eq!(store.mode(), StoreMode::DualTier, "dispatch-coverage shape");
}
factory
.teardown()
.await
.expect("teardown removes the roots");
factory.teardown().await.expect("teardown repeats cleanly");
}