use ngdp_cache::cached_ribbit_client::CachedRibbitClient;
use ribbit_client::{Endpoint, Region};
use std::path::PathBuf;
async fn test_cache_dir() -> PathBuf {
use std::sync::atomic::{AtomicU64, Ordering};
static COUNTER: AtomicU64 = AtomicU64::new(0);
let unique_id = COUNTER.fetch_add(1, Ordering::SeqCst);
let dir = std::env::temp_dir()
.join("ngdp_cache_test")
.join(format!("cached_ribbit_{}", unique_id));
tokio::fs::create_dir_all(&dir).await.unwrap();
dir
}
async fn cleanup_test_dir(dir: &PathBuf) {
let _ = tokio::fs::remove_dir_all(dir).await;
}
#[tokio::test]
async fn test_cached_client_creation() {
let client = CachedRibbitClient::new(Region::US).await.unwrap();
assert_eq!(client.inner().region(), Region::US);
let test_dir = test_cache_dir().await;
let client = CachedRibbitClient::with_cache_dir(Region::EU, test_dir.clone())
.await
.unwrap();
assert_eq!(client.inner().region(), Region::EU);
cleanup_test_dir(&test_dir).await;
}
#[tokio::test]
async fn test_cache_filename_conventions() {
let test_dir = test_cache_dir().await;
let _client = CachedRibbitClient::with_cache_dir(Region::US, test_dir.clone())
.await
.unwrap();
let _test_cases = vec![
(Endpoint::Summary, None, "summary-#-0.bmime"),
(
Endpoint::ProductVersions("wow".to_string()),
None,
"versions-wow-0.bmime",
),
(
Endpoint::ProductCdns("d4".to_string()),
None,
"cdns-d4-0.bmime",
),
(
Endpoint::ProductBgdl("wow_classic".to_string()),
None,
"bgdl-wow_classic-0.bmime",
),
(
Endpoint::Cert("abc123".to_string()),
None,
"certs-abc123-0.bmime",
),
(
Endpoint::Cert("def456".to_string()),
Some(12345),
"certs-def456-12345.bmime",
),
(
Endpoint::Ocsp("789xyz".to_string()),
None,
"ocsp-789xyz-0.bmime",
),
(
Endpoint::Custom("products/wow/versions".to_string()),
None,
"products-wow-0.bmime",
),
(
Endpoint::Custom("custom".to_string()),
None,
"custom-#-0.bmime",
),
];
cleanup_test_dir(&test_dir).await;
}
#[tokio::test]
async fn test_cache_enable_disable() {
let test_dir = test_cache_dir().await;
let mut client = CachedRibbitClient::with_cache_dir(Region::US, test_dir.clone())
.await
.unwrap();
client.set_caching_enabled(true);
client.set_caching_enabled(false);
cleanup_test_dir(&test_dir).await;
}
#[tokio::test]
async fn test_ttl_differentiation() {
let test_dir = test_cache_dir().await;
let _client = CachedRibbitClient::with_cache_dir(Region::US, test_dir.clone())
.await
.unwrap();
cleanup_test_dir(&test_dir).await;
}
#[tokio::test]
async fn test_cache_clear_operations() {
let test_dir = test_cache_dir().await;
let client = CachedRibbitClient::with_cache_dir(Region::US, test_dir.clone())
.await
.unwrap();
client.clear_cache().await.unwrap();
client.clear_expired().await.unwrap();
cleanup_test_dir(&test_dir).await;
}
#[tokio::test]
async fn test_expired_cache_cleanup() {
let test_dir = test_cache_dir().await;
let client = CachedRibbitClient::with_cache_dir(Region::US, test_dir.clone())
.await
.unwrap();
client.clear_expired().await.unwrap();
cleanup_test_dir(&test_dir).await;
}
#[tokio::test]
async fn test_concurrent_cache_access() {
let test_dir = test_cache_dir().await;
let mut handles = vec![];
for _ in 0..5 {
let test_dir_clone = test_dir.clone();
let handle = tokio::spawn(async move {
let _client = CachedRibbitClient::with_cache_dir(Region::US, test_dir_clone)
.await
.unwrap();
});
handles.push(handle);
}
for handle in handles {
handle.await.unwrap();
}
cleanup_test_dir(&test_dir).await;
}
#[tokio::test]
async fn test_cache_with_different_regions() {
let test_dir = test_cache_dir().await;
let _us_client = CachedRibbitClient::with_cache_dir(Region::US, test_dir.clone())
.await
.unwrap();
let _eu_client = CachedRibbitClient::with_cache_dir(Region::EU, test_dir.clone())
.await
.unwrap();
cleanup_test_dir(&test_dir).await;
}
#[tokio::test]
async fn test_cache_directory_structure() {
let test_dir = test_cache_dir().await;
let _client = CachedRibbitClient::with_cache_dir(Region::KR, test_dir.clone())
.await
.unwrap();
for _attempt in 0..10 {
tokio::task::yield_now().await;
if test_dir.exists() {
break;
}
tokio::time::sleep(tokio::time::Duration::from_millis(10)).await;
}
assert!(
test_dir.exists(),
"Test directory {test_dir:?} should exist"
);
cleanup_test_dir(&test_dir).await;
}