#![cfg(any(
feature = "kv-mem",
feature = "kv-rocksdb",
feature = "kv-indxdb",
feature = "kv-tikv",
feature = "kv-surrealkv",
))]
use std::future::Future;
use uuid::Uuid;
use super::Datastore;
macro_rules! include_tests {
($new_ds:ident => $($name:ident),* $(,)?) => {
$(
super::$name::define_tests!($new_ds);
)*
};
}
#[cfg(feature = "kv-rocksdb")]
mod metrics;
mod multireader;
mod multiwriter_different_keys;
mod multiwriter_same_keys_allow;
mod multiwriter_same_keys_conflict;
mod raw;
#[cfg(feature = "kv-mem")]
mod reclaim_test;
#[cfg(feature = "kv-mem")]
mod rpc_session_test;
mod snapshot;
#[cfg(feature = "kv-mem")]
mod tx_cache_test;
#[derive(Clone, Debug)]
pub(crate) enum Kvs {
#[cfg_attr(not(feature = "kv-mem"), expect(dead_code))]
Mem,
#[cfg_attr(not(feature = "kv-rocksdb"), expect(dead_code))]
Rocksdb,
#[cfg_attr(not(feature = "kv-tikv"), expect(dead_code))]
Tikv,
#[cfg_attr(not(feature = "kv-surrealkv"), expect(dead_code))]
SurrealKV,
}
trait CreateDs {
async fn create_ds(&self, id: Uuid) -> (Datastore, Kvs);
}
impl<F, Fut> CreateDs for F
where
F: Fn(Uuid) -> Fut,
Fut: Future<Output = (Datastore, Kvs)>,
{
async fn create_ds(&self, id: Uuid) -> (Datastore, Kvs) {
(self)(id).await
}
}
#[cfg(feature = "kv-mem")]
mod mem {
use uuid::Uuid;
use super::Kvs;
use crate::CommunityComposer;
use crate::kvs::Datastore;
async fn new_ds(id: Uuid) -> (Datastore, Kvs) {
let path = "memory";
let ds = Datastore::builder()
.with_id(id)
.build_with_factory_path(path, CommunityComposer())
.await
.unwrap();
(ds, Kvs::Mem)
}
include_tests!(new_ds =>
raw,
snapshot,
multireader,
multiwriter_different_keys,
multiwriter_same_keys_conflict,
);
}
#[cfg(feature = "kv-rocksdb")]
mod rocksdb {
use temp_dir::TempDir;
use uuid::Uuid;
use super::Kvs;
use crate::CommunityComposer;
use crate::kvs::Datastore;
async fn new_ds(id: Uuid) -> (Datastore, Kvs) {
let path = TempDir::new().unwrap().path().to_string_lossy().to_string();
let path = format!("rocksdb:{path}");
let ds = Datastore::builder()
.with_id(id)
.build_with_factory_path(&path, CommunityComposer())
.await
.unwrap();
(ds, Kvs::Rocksdb)
}
include_tests!(new_ds =>
raw,
snapshot,
multireader,
multiwriter_different_keys,
multiwriter_same_keys_conflict,
metrics
);
}
#[cfg(feature = "kv-surrealkv")]
mod surrealkv {
use temp_dir::TempDir;
use uuid::Uuid;
use super::Kvs;
use crate::CommunityComposer;
use crate::kvs::Datastore;
async fn new_ds(id: Uuid) -> (Datastore, Kvs) {
let path = TempDir::new().unwrap().path().to_string_lossy().to_string();
let path = format!("surrealkv:{path}");
let ds = Datastore::builder()
.with_id(id)
.build_with_factory_path(&path, CommunityComposer())
.await
.unwrap();
(ds, Kvs::SurrealKV)
}
include_tests!(new_ds =>
raw,
snapshot,
multireader,
multiwriter_different_keys,
multiwriter_same_keys_conflict,
);
}
#[cfg(feature = "kv-tikv")]
mod tikv {
use uuid::Uuid;
use super::Kvs;
use crate::CommunityComposer;
use crate::kvs::{Datastore, LockType, TransactionType};
async fn new_ds(id: Uuid) -> (Datastore, Kvs) {
let path = "tikv:127.0.0.1:2379";
let ds = Datastore::builder()
.with_id(id)
.build_with_factory_path(path, CommunityComposer())
.await
.unwrap();
let tx = ds.transaction(TransactionType::Write, LockType::Optimistic).await.unwrap();
tx.delr(vec![0u8]..vec![0xffu8]).await.unwrap();
tx.commit().await.unwrap();
(ds, Kvs::Tikv)
}
include_tests!(new_ds =>
raw,
snapshot,
multireader,
multiwriter_different_keys,
multiwriter_same_keys_allow,
);
}