Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
projectdiscovery
GitHub Repository: projectdiscovery/nuclei
Path: blob/dev/pkg/operators/cache/cache_test.go
2851 views
1
package cache
2
3
import (
4
"regexp"
5
"testing"
6
7
"github.com/Knetic/govaluate"
8
)
9
10
func TestRegexCache_SetGet(t *testing.T) {
11
// ensure init
12
c := Regex()
13
pattern := "abc(\n)?123"
14
re, err := regexp.Compile(pattern)
15
if err != nil {
16
t.Fatalf("compile: %v", err)
17
}
18
if err := c.Set(pattern, re); err != nil {
19
t.Fatalf("set: %v", err)
20
}
21
got, err := c.GetIFPresent(pattern)
22
if err != nil || got == nil {
23
t.Fatalf("get: %v got=%v", err, got)
24
}
25
if got.String() != re.String() {
26
t.Fatalf("mismatch: %s != %s", got.String(), re.String())
27
}
28
}
29
30
func TestDSLCache_SetGet(t *testing.T) {
31
c := DSL()
32
expr := "1 + 2 == 3"
33
ast, err := govaluate.NewEvaluableExpression(expr)
34
if err != nil {
35
t.Fatalf("dsl compile: %v", err)
36
}
37
if err := c.Set(expr, ast); err != nil {
38
t.Fatalf("set: %v", err)
39
}
40
got, err := c.GetIFPresent(expr)
41
if err != nil || got == nil {
42
t.Fatalf("get: %v got=%v", err, got)
43
}
44
if got.String() != ast.String() {
45
t.Fatalf("mismatch: %s != %s", got.String(), ast.String())
46
}
47
}
48
49
func TestRegexCache_EvictionByCapacity(t *testing.T) {
50
SetCapacities(3, 3)
51
c := Regex()
52
for i := 0; i < 5; i++ {
53
k := string(rune('a' + i))
54
re := regexp.MustCompile(k)
55
_ = c.Set(k, re)
56
}
57
// last 3 keys expected to remain under LRU: 'c','d','e'
58
if _, err := c.GetIFPresent("a"); err == nil {
59
t.Fatalf("expected 'a' to be evicted")
60
}
61
if _, err := c.GetIFPresent("b"); err == nil {
62
t.Fatalf("expected 'b' to be evicted")
63
}
64
if _, err := c.GetIFPresent("c"); err != nil {
65
t.Fatalf("expected 'c' present")
66
}
67
}
68
69
func TestSetCapacities_NoRebuildOnZero(t *testing.T) {
70
// init
71
SetCapacities(4, 4)
72
c1 := Regex()
73
_ = c1.Set("k", regexp.MustCompile("k"))
74
if _, err := c1.GetIFPresent("k"); err != nil {
75
t.Fatalf("expected key present: %v", err)
76
}
77
// zero changes should not rebuild/clear caches
78
SetCapacities(0, 0)
79
c2 := Regex()
80
if _, err := c2.GetIFPresent("k"); err != nil {
81
t.Fatalf("key lost after zero-capacity SetCapacities: %v", err)
82
}
83
}
84
85
func TestSetCapacities_BeforeFirstUse(t *testing.T) {
86
// This should not be overridden by later initCaches
87
SetCapacities(2, 0)
88
c := Regex()
89
_ = c.Set("a", regexp.MustCompile("a"))
90
_ = c.Set("b", regexp.MustCompile("b"))
91
_ = c.Set("c", regexp.MustCompile("c"))
92
if _, err := c.GetIFPresent("a"); err == nil {
93
t.Fatalf("expected 'a' to be evicted under cap=2")
94
}
95
}
96
97
func TestSetCapacities_ConcurrentAccess(t *testing.T) {
98
SetCapacities(64, 64)
99
stop := make(chan struct{})
100
101
go func() {
102
for i := 0; i < 5000; i++ {
103
_ = Regex().Set("k"+string(rune('a'+(i%26))), regexp.MustCompile("a"))
104
_, _ = Regex().GetIFPresent("k" + string(rune('a'+(i%26))))
105
_, _ = DSL().GetIFPresent("1+2==3")
106
}
107
close(stop)
108
}()
109
110
for i := 0; i < 200; i++ {
111
SetCapacities(64+(i%5), 64+((i+1)%5))
112
}
113
<-stop
114
}
115
116