116 lines
No EOL
3.5 KiB
Python
116 lines
No EOL
3.5 KiB
Python
"""
|
|
RLM-MEM - Cache System Tests
|
|
D5.1: Memory caching tests (Disk Cache removed per ADR 0002)
|
|
"""
|
|
|
|
import unittest
|
|
import time
|
|
from pathlib import Path
|
|
|
|
try:
|
|
from brain.scripts.cache_system import MemoryCache, CacheManager
|
|
except ImportError:
|
|
from cache_system import MemoryCache, CacheManager
|
|
|
|
|
|
class TestMemoryCache(unittest.TestCase):
|
|
"""Test in-memory cache."""
|
|
|
|
def setUp(self):
|
|
self.cache = MemoryCache(default_ttl=60)
|
|
|
|
def test_basic_get_set(self):
|
|
"""Should store and retrieve values."""
|
|
self.cache.set("key1", "value1")
|
|
result = self.cache.get("key1")
|
|
self.assertEqual(result, "value1")
|
|
|
|
def test_missing_key(self):
|
|
"""Should return None for missing key."""
|
|
result = self.cache.get("nonexistent")
|
|
self.assertIsNone(result)
|
|
|
|
def test_expiration(self):
|
|
"""Should expire entries after TTL."""
|
|
cache = MemoryCache(default_ttl=1) # 1 second TTL
|
|
cache.set("key", "value")
|
|
|
|
# Should exist immediately
|
|
self.assertEqual(cache.get("key"), "value")
|
|
|
|
# Wait for expiration
|
|
time.sleep(1.1)
|
|
|
|
# Should be expired
|
|
self.assertIsNone(cache.get("key"))
|
|
|
|
def test_delete(self):
|
|
"""Should delete keys."""
|
|
self.cache.set("key", "value")
|
|
self.assertTrue(self.cache.delete("key"))
|
|
self.assertIsNone(self.cache.get("key"))
|
|
|
|
def test_clear(self):
|
|
"""Should clear all entries."""
|
|
self.cache.set("key1", "value1")
|
|
self.cache.set("key2", "value2")
|
|
|
|
self.cache.clear()
|
|
|
|
self.assertIsNone(self.cache.get("key1"))
|
|
self.assertIsNone(self.cache.get("key2"))
|
|
|
|
def test_cleanup(self):
|
|
"""Should remove expired entries."""
|
|
cache = MemoryCache(default_ttl=1)
|
|
cache.set("key1", "value1")
|
|
cache.set("key2", "value2")
|
|
|
|
time.sleep(1.1)
|
|
|
|
removed = cache.cleanup()
|
|
self.assertEqual(removed, 2)
|
|
|
|
def test_stats(self):
|
|
"""Should return stats."""
|
|
self.cache.set("key1", "value1")
|
|
self.cache.set("key2", "value2")
|
|
|
|
stats = self.cache.stats()
|
|
self.assertEqual(stats["size"], 2)
|
|
self.assertEqual(stats["default_ttl"], 60)
|
|
|
|
|
|
class TestCacheManager(unittest.TestCase):
|
|
"""Test simplified cache manager."""
|
|
|
|
def setUp(self):
|
|
self.manager = CacheManager()
|
|
|
|
def test_get_set(self):
|
|
"""Should use memory cache by default."""
|
|
self.manager.set("key", "value")
|
|
result = self.manager.get("key")
|
|
self.assertEqual(result, "value")
|
|
|
|
def test_stats(self):
|
|
"""Should return stats."""
|
|
self.manager.set("key", "value")
|
|
|
|
stats = self.manager.stats()
|
|
self.assertIn("memory", stats)
|
|
self.assertIn("manager", stats)
|
|
|
|
def test_manager_telemetry_memory_hit_and_miss(self):
|
|
"""Should track memory hits and misses at manager level."""
|
|
self.manager.set("k1", "v1")
|
|
self.assertEqual(self.manager.get("k1"), "v1") # memory hit
|
|
self.assertIsNone(self.manager.get("missing")) # miss
|
|
|
|
telemetry = self.manager.telemetry()
|
|
self.assertEqual(telemetry["get_calls"], 2)
|
|
self.assertEqual(telemetry["memory_hits"], 1)
|
|
self.assertEqual(telemetry["misses"], 1)
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main() |