diff options
| author | 2026-06-09 03:05:45 +0000 | |
|---|---|---|
| committer | 2026-06-09 05:07:02 +0000 | |
| commit | 3dd2d95b8347b2b0572a5ad90cbb7c1c84e9a07a (patch) | |
| tree | 144a3e94bd4a03097bfb29741be1028d1740422b /internal/clock/cache_test.go | |
| parent | internal/mru: Fewer files (diff) | |
| signature | No signature | |
internal/lru: Add sharded CLOCK
Diffstat (limited to 'internal/clock/cache_test.go')
| -rw-r--r-- | internal/clock/cache_test.go | 100 |
1 files changed, 100 insertions, 0 deletions
diff --git a/internal/clock/cache_test.go b/internal/clock/cache_test.go new file mode 100644 index 00000000..116efdd3 --- /dev/null +++ b/internal/clock/cache_test.go @@ -0,0 +1,100 @@ +package clock_test + +import ( + "fmt" + "strings" + "testing" + + "lindenii.org/go/furgit/internal/clock" + "lindenii.org/go/lgo/intconv" +) + +func byteWeight(_ string, value string) uint64 { + weight, err := intconv.IntToUint64(len(value)) + if err != nil { + return 0 + } + + return weight +} + +func TestCacheAddGetPeek(t *testing.T) { + t.Parallel() + + cache := clock.New(1<<20, byteWeight) + + if !cache.Add("a", "alpha") { + t.Fatalf("Add(a) should succeed") + } + + if got, ok := cache.Get("a"); !ok || got != "alpha" { + t.Fatalf("Get(a) = (%q, %v), want (alpha, true)", got, ok) + } + + if got, ok := cache.Peek("a"); !ok || got != "alpha" { + t.Fatalf("Peek(a) = (%q, %v), want (alpha, true)", got, ok) + } + + if _, ok := cache.Get("missing"); ok { + t.Fatalf("Get(missing) should miss") + } +} + +func TestCacheWeightStaysBounded(t *testing.T) { + t.Parallel() + + const maxWeight = 4096 + + cache := clock.New(maxWeight, byteWeight) + value := strings.Repeat("x", 64) + + for i := range 1000 { + cache.Add(fmt.Sprintf("key-%d", i), value) + } + + if got := cache.Weight(); got > maxWeight { + t.Fatalf("weight = %d, exceeds max %d", got, maxWeight) + } +} + +func TestCacheLenAndClear(t *testing.T) { + t.Parallel() + + cache := clock.New(1<<20, byteWeight) + + for i := range 10 { + cache.Add(fmt.Sprintf("key-%d", i), "v") + } + + if got := cache.Len(); got != 10 { + t.Fatalf("Len = %d, want 10", got) + } + + cache.Clear() + + if got := cache.Len(); got != 0 { + t.Fatalf("Len after Clear = %d, want 0", got) + } + + if got := cache.Weight(); got != 0 { + t.Fatalf("Weight after Clear = %d, want 0", got) + } +} + +func TestCacheRejectsOversized(t *testing.T) { + t.Parallel() + + cache := clock.New(4, byteWeight) + + if cache.Add("a", "xxxxx") { + t.Fatalf("oversized Add should report false") + } + + if _, ok := cache.Get("a"); ok { + t.Fatalf("oversized entry must not be cached") + } + + if got := cache.Weight(); got != 0 { + t.Fatalf("weight = %d, want 0", got) + } +} |
