package ctxmgr_test import ( "testing" "chat-agent-system/internal/ctxmgr" ) func TestMultiLevelCache_BasicOpsAndStats(t *testing.T) { cache := ctxmgr.NewMultiLevelCache() cache.Clear() key := ctxmgr.HashKey("test_user", "test_query") // 1. 首次读取未命中 val, ok := cache.Get(ctxmgr.LayerC1Search, key) if ok || val != nil { t.Fatalf("expected cache miss, got %v", val) } // 2. 写入并读取命中 cache.Set(ctxmgr.LayerC1Search, key, "result_items", 45) val, ok = cache.Get(ctxmgr.LayerC1Search, key) if !ok || val.(string) != "result_items" { t.Fatalf("expected cache hit with 'result_items', got %v", val) } // 3. 校验统计指标 stats := cache.Stats() if stats.Hits != 1 || stats.Misses != 1 { t.Errorf("unexpected stats: hits=%d, misses=%d", stats.Hits, stats.Misses) } if stats.SavedMs != 45 { t.Errorf("expected savedMs=45, got %d", stats.SavedMs) } if stats.HitRate != 0.5 { t.Errorf("expected hitRate=0.5, got %f", stats.HitRate) } // 4. 单条 Key 失效 cache.Invalidate(ctxmgr.LayerC1Search, key) _, ok = cache.Get(ctxmgr.LayerC1Search, key) if ok { t.Errorf("expected cache miss after invalidation") } } func TestMultiLevelCache_LayerInvalidation(t *testing.T) { cache := ctxmgr.NewMultiLevelCache() cache.Clear() k1 := ctxmgr.HashKey("u1", "p1") k2 := ctxmgr.HashKey("u2", "p2") cache.Set(ctxmgr.LayerC4Context, k1, "ctx_1", 20) cache.Set(ctxmgr.LayerC4Context, k2, "ctx_2", 20) // 整体清空 C4 层 cache.InvalidateLayer(ctxmgr.LayerC4Context) if _, ok := cache.Get(ctxmgr.LayerC4Context, k1); ok { t.Errorf("expected k1 in C4 to be cleared") } if _, ok := cache.Get(ctxmgr.LayerC4Context, k2); ok { t.Errorf("expected k2 in C4 to be cleared") } } func TestMultiLevelCache_DisabledToggle(t *testing.T) { cache := ctxmgr.NewMultiLevelCache() cache.SetEnabled(false) key := ctxmgr.HashKey("k_disabled") cache.Set(ctxmgr.LayerC2Rewrite, key, "rewritten", 10) if _, ok := cache.Get(ctxmgr.LayerC2Rewrite, key); ok { t.Errorf("expected cache to be inactive when disabled") } cache.SetEnabled(true) cache.Set(ctxmgr.LayerC2Rewrite, key, "rewritten", 10) if _, ok := cache.Get(ctxmgr.LayerC2Rewrite, key); !ok { t.Errorf("expected cache to be active when enabled") } }