swactor/crates/distribution/tests/cache.rs

98 lines
2.7 KiB
Rust

use distribution::cache::LocationCache;
use distribution::types::NodeId;
use swactor::actor::ActorAddress;
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);
}