swactor/crates/distribution/tests/cache.rs
2026-02-12 16:10:28 +07:00

94 lines
2.6 KiB
Rust

use swactor::actor::ActorAddress;
use distribution::cache::LocationCache;
use distribution::types::NodeId;
fn node(byte: u8) -> NodeId {
NodeId([byte; 32])
}
#[test]
fn insert_and_get() {
let mut cache = LocationCache::new(10);
let actor = ActorAddress::new_random();
cache.insert(actor, node(1));
assert_eq!(cache.get(&actor), Some(node(1)));
}
#[test]
fn get_missing_returns_none() {
let mut cache = LocationCache::new(10);
let actor = ActorAddress::new_random();
assert_eq!(cache.get(&actor), None);
}
#[test]
fn invalidate_removes_entry() {
let mut cache = LocationCache::new(10);
let actor = ActorAddress::new_random();
cache.insert(actor, node(1));
assert!(cache.invalidate(&actor));
assert_eq!(cache.get(&actor), None);
}
#[test]
fn capacity_evicts_lru() {
let mut cache = LocationCache::new(2);
let a1 = ActorAddress::new_random();
let a2 = ActorAddress::new_random();
let a3 = ActorAddress::new_random();
cache.insert(a1, node(1));
cache.insert(a2, node(2));
// a1 is LRU, inserting a3 should evict it
cache.insert(a3, node(3));
assert_eq!(cache.len(), 2);
assert_eq!(cache.get(&a1), None, "a1 should have been evicted");
assert_eq!(cache.get(&a2), Some(node(2)));
assert_eq!(cache.get(&a3), Some(node(3)));
}
#[test]
fn get_refreshes_lru_order() {
let mut cache = LocationCache::new(2);
let a1 = ActorAddress::new_random();
let a2 = ActorAddress::new_random();
let a3 = ActorAddress::new_random();
cache.insert(a1, node(1));
cache.insert(a2, node(2));
// Touch a1 — now a2 is LRU
cache.get(&a1);
// Insert a3 — should evict a2 (LRU), not a1
cache.insert(a3, node(3));
assert_eq!(cache.get(&a1), Some(node(1)), "a1 should survive (recently accessed)");
assert_eq!(cache.get(&a2), None, "a2 should have been evicted");
}
#[test]
fn invalidate_node_removes_all_entries_for_that_node() {
let mut cache = LocationCache::new(10);
let a1 = ActorAddress::new_random();
let a2 = ActorAddress::new_random();
let a3 = ActorAddress::new_random();
cache.insert(a1, node(1));
cache.insert(a2, node(1)); // same node
cache.insert(a3, node(2)); // different node
let removed = cache.invalidate_node(&node(1));
assert_eq!(removed, 2);
assert_eq!(cache.len(), 1);
assert_eq!(cache.peek(&a3), Some(node(2)));
}
#[test]
fn update_existing_entry() {
let mut cache = LocationCache::new(10);
let actor = ActorAddress::new_random();
cache.insert(actor, node(1));
cache.insert(actor, node(2));
assert_eq!(cache.get(&actor), Some(node(2)));
assert_eq!(cache.len(), 1);
}