Path: blob/dev/pkg/operators/cache/cache_test.go
2851 views
package cache12import (3"regexp"4"testing"56"github.com/Knetic/govaluate"7)89func TestRegexCache_SetGet(t *testing.T) {10// ensure init11c := Regex()12pattern := "abc(\n)?123"13re, err := regexp.Compile(pattern)14if err != nil {15t.Fatalf("compile: %v", err)16}17if err := c.Set(pattern, re); err != nil {18t.Fatalf("set: %v", err)19}20got, err := c.GetIFPresent(pattern)21if err != nil || got == nil {22t.Fatalf("get: %v got=%v", err, got)23}24if got.String() != re.String() {25t.Fatalf("mismatch: %s != %s", got.String(), re.String())26}27}2829func TestDSLCache_SetGet(t *testing.T) {30c := DSL()31expr := "1 + 2 == 3"32ast, err := govaluate.NewEvaluableExpression(expr)33if err != nil {34t.Fatalf("dsl compile: %v", err)35}36if err := c.Set(expr, ast); err != nil {37t.Fatalf("set: %v", err)38}39got, err := c.GetIFPresent(expr)40if err != nil || got == nil {41t.Fatalf("get: %v got=%v", err, got)42}43if got.String() != ast.String() {44t.Fatalf("mismatch: %s != %s", got.String(), ast.String())45}46}4748func TestRegexCache_EvictionByCapacity(t *testing.T) {49SetCapacities(3, 3)50c := Regex()51for i := 0; i < 5; i++ {52k := string(rune('a' + i))53re := regexp.MustCompile(k)54_ = c.Set(k, re)55}56// last 3 keys expected to remain under LRU: 'c','d','e'57if _, err := c.GetIFPresent("a"); err == nil {58t.Fatalf("expected 'a' to be evicted")59}60if _, err := c.GetIFPresent("b"); err == nil {61t.Fatalf("expected 'b' to be evicted")62}63if _, err := c.GetIFPresent("c"); err != nil {64t.Fatalf("expected 'c' present")65}66}6768func TestSetCapacities_NoRebuildOnZero(t *testing.T) {69// init70SetCapacities(4, 4)71c1 := Regex()72_ = c1.Set("k", regexp.MustCompile("k"))73if _, err := c1.GetIFPresent("k"); err != nil {74t.Fatalf("expected key present: %v", err)75}76// zero changes should not rebuild/clear caches77SetCapacities(0, 0)78c2 := Regex()79if _, err := c2.GetIFPresent("k"); err != nil {80t.Fatalf("key lost after zero-capacity SetCapacities: %v", err)81}82}8384func TestSetCapacities_BeforeFirstUse(t *testing.T) {85// This should not be overridden by later initCaches86SetCapacities(2, 0)87c := Regex()88_ = c.Set("a", regexp.MustCompile("a"))89_ = c.Set("b", regexp.MustCompile("b"))90_ = c.Set("c", regexp.MustCompile("c"))91if _, err := c.GetIFPresent("a"); err == nil {92t.Fatalf("expected 'a' to be evicted under cap=2")93}94}9596func TestSetCapacities_ConcurrentAccess(t *testing.T) {97SetCapacities(64, 64)98stop := make(chan struct{})99100go func() {101for i := 0; i < 5000; i++ {102_ = Regex().Set("k"+string(rune('a'+(i%26))), regexp.MustCompile("a"))103_, _ = Regex().GetIFPresent("k" + string(rune('a'+(i%26))))104_, _ = DSL().GetIFPresent("1+2==3")105}106close(stop)107}()108109for i := 0; i < 200; i++ {110SetCapacities(64+(i%5), 64+((i+1)%5))111}112<-stop113}114115116