use rustvello_core::client_data_store::ClientDataStore;
pub async fn test_store_and_retrieve(store: &dyn ClientDataStore) {
store.store("k1", "v1").await.unwrap();
assert_eq!(store.retrieve("k1").await.unwrap(), "v1");
}
pub async fn test_retrieve_missing_key_errors(store: &dyn ClientDataStore) {
let err = store.retrieve("nonexistent").await;
assert!(err.is_err());
}
pub async fn test_purge_removes_all(store: &dyn ClientDataStore) {
store.store("k1", "v1").await.unwrap();
store.store("k2", "v2").await.unwrap();
store.purge().await.unwrap();
assert!(store.retrieve("k1").await.is_err());
assert!(store.retrieve("k2").await.is_err());
}
pub async fn test_upsert_semantics(store: &dyn ClientDataStore) {
store.store("k1", "v1").await.unwrap();
store.store("k1", "v2").await.unwrap();
assert_eq!(store.retrieve("k1").await.unwrap(), "v2");
}
pub async fn test_multiple_keys(store: &dyn ClientDataStore) {
for i in 0..10 {
let key = format!("key_{i}");
let val = format!("val_{i}");
store.store(&key, &val).await.unwrap();
}
for i in 0..10 {
let key = format!("key_{i}");
let val = format!("val_{i}");
assert_eq!(store.retrieve(&key).await.unwrap(), val);
}
}
pub async fn test_large_value(store: &dyn ClientDataStore) {
let large = "x".repeat(1_000_000);
store.store("big", &large).await.unwrap();
let got = store.retrieve("big").await.unwrap();
assert_eq!(got.len(), 1_000_000);
assert_eq!(got, large);
}
pub async fn test_backend_name(store: &dyn ClientDataStore) {
let name = store.backend_name();
assert!(!name.is_empty());
}
#[macro_export]
macro_rules! client_data_store_suite {
($setup:expr) => {
#[tokio::test]
async fn suite_cds_store_and_retrieve() {
let store = $setup;
$crate::client_data_store::test_store_and_retrieve(&store).await;
}
#[tokio::test]
async fn suite_cds_retrieve_missing_key_errors() {
let store = $setup;
$crate::client_data_store::test_retrieve_missing_key_errors(&store).await;
}
#[tokio::test]
async fn suite_cds_purge_removes_all() {
let store = $setup;
$crate::client_data_store::test_purge_removes_all(&store).await;
}
#[tokio::test]
async fn suite_cds_upsert_semantics() {
let store = $setup;
$crate::client_data_store::test_upsert_semantics(&store).await;
}
#[tokio::test]
async fn suite_cds_multiple_keys() {
let store = $setup;
$crate::client_data_store::test_multiple_keys(&store).await;
}
#[tokio::test]
async fn suite_cds_large_value() {
let store = $setup;
$crate::client_data_store::test_large_value(&store).await;
}
#[tokio::test]
async fn suite_cds_backend_name() {
let store = $setup;
$crate::client_data_store::test_backend_name(&store).await;
}
};
}
#[macro_export]
macro_rules! async_client_data_store_suite {
($setup:expr) => {
#[tokio::test]
#[ignore = "requires Docker"]
async fn suite_cds_store_and_retrieve() {
let (_c, store) = $setup.await;
$crate::client_data_store::test_store_and_retrieve(&store).await;
}
#[tokio::test]
#[ignore = "requires Docker"]
async fn suite_cds_retrieve_missing_key_errors() {
let (_c, store) = $setup.await;
$crate::client_data_store::test_retrieve_missing_key_errors(&store).await;
}
#[tokio::test]
#[ignore = "requires Docker"]
async fn suite_cds_purge_removes_all() {
let (_c, store) = $setup.await;
$crate::client_data_store::test_purge_removes_all(&store).await;
}
#[tokio::test]
#[ignore = "requires Docker"]
async fn suite_cds_upsert_semantics() {
let (_c, store) = $setup.await;
$crate::client_data_store::test_upsert_semantics(&store).await;
}
#[tokio::test]
#[ignore = "requires Docker"]
async fn suite_cds_multiple_keys() {
let (_c, store) = $setup.await;
$crate::client_data_store::test_multiple_keys(&store).await;
}
#[tokio::test]
#[ignore = "requires Docker"]
async fn suite_cds_large_value() {
let (_c, store) = $setup.await;
$crate::client_data_store::test_large_value(&store).await;
}
#[tokio::test]
#[ignore = "requires Docker"]
async fn suite_cds_backend_name() {
let (_c, store) = $setup.await;
$crate::client_data_store::test_backend_name(&store).await;
}
};
}