Major feature addition. For full details read `./docs/development_history/DISTRIBUTION.md`
94 lines
2.6 KiB
Rust
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);
|
|
}
|