diff options
| author | 2026-06-09 05:15:58 +0000 | |
|---|---|---|
| committer | 2026-06-09 05:15:58 +0000 | |
| commit | 55676a35757bcbf2fa40cc3fd144ba412c65b658 (patch) | |
| tree | 4c75c8497941d7b8c8c5530f5467bf42610c3f10 /internal/cache/clock/cache_test.go | |
| parent | internal/lru: Add sharded CLOCK (diff) | |
| signature | No signature | |
internal/cache: add (and move clock to internal/cache/clock)
Diffstat (limited to 'internal/cache/clock/cache_test.go')
| -rw-r--r-- | internal/cache/clock/cache_test.go | 100 |
1 files changed, 100 insertions, 0 deletions
diff --git a/internal/cache/clock/cache_test.go b/internal/cache/clock/cache_test.go new file mode 100644 index 00000000..3d734b39 --- /dev/null +++ b/internal/cache/clock/cache_test.go @@ -0,0 +1,100 @@ +package clock_test + +import ( + "fmt" + "strings" + "testing" + + "lindenii.org/go/furgit/internal/cache/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) + } +} |
