#![cfg(any(feature = "redis", feature = "memcache"))]
use std::time::Duration;
use bee_cache::{Cache, CacheError};
async fn exercise(cache: &dyn Cache, tag: &str) {
let key = |name: &str| format!("bee_cache:e2e:{tag}:{name}");
let _ = cache.delete(&key("n")).await;
let blob = vec![0xff, 0x00, 0xfe, 0x80, b'h', b'i'];
cache.set(&key("blob"), blob.clone(), None).await.unwrap();
assert_eq!(cache.get(&key("blob")).await.unwrap(), Some(blob));
assert_eq!(cache.get(&key("missing")).await.unwrap(), None);
assert!(matches!(cache.delete(&key("missing")).await, Err(CacheError::NotFound)));
cache.delete(&key("blob")).await.unwrap();
assert_eq!(cache.get(&key("blob")).await.unwrap(), None);
assert_eq!(cache.incr(&key("n")).await.unwrap(), 1);
assert_eq!(cache.incr(&key("n")).await.unwrap(), 2);
cache.set(&key("text"), b"not a number".to_vec(), None).await.unwrap();
match cache.incr(&key("text")).await {
Err(CacheError::SerializeError(_)) => {}
other => panic!("expected SerializeError, got {other:?}"),
}
cache.delete(&key("text")).await.unwrap();
cache.set(&key("ttl"), b"soon".to_vec(), Some(1)).await.unwrap();
assert!(cache.get(&key("ttl")).await.unwrap().is_some());
tokio::time::sleep(Duration::from_millis(1200)).await;
assert_eq!(cache.get(&key("ttl")).await.unwrap(), None);
cache.set(&key("zero"), b"gone".to_vec(), Some(0)).await.unwrap();
assert_eq!(cache.get(&key("zero")).await.unwrap(), None);
cache.set(&key("long"), b"alive".to_vec(), Some(60 * 60 * 24 * 31)).await.unwrap();
assert_eq!(cache.get(&key("long")).await.unwrap(), Some(b"alive".to_vec()));
cache.delete(&key("n")).await.unwrap();
cache.delete(&key("long")).await.unwrap();
}
#[cfg(feature = "redis")]
#[tokio::test]
async fn redis_cache_satisfies_the_trait() {
let Ok(dsn) = std::env::var("BEE_KV_REDIS_DSN") else {
return;
};
if dsn.is_empty() {
return;
}
let cache = bee_cache::RedisCache::new(&dsn).await.unwrap();
exercise(&cache, "redis").await;
}
#[cfg(feature = "memcache")]
#[tokio::test]
async fn memcache_cache_satisfies_the_trait() {
let Ok(addr) = std::env::var("BEE_KV_MEMCACHE_ADDR") else {
return;
};
if addr.is_empty() {
return;
}
let cache = bee_cache::MemcacheCache::new(&addr).unwrap();
exercise(&cache, "memcache").await;
}