Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
projectdiscovery
GitHub Repository: projectdiscovery/nuclei
Path: blob/dev/pkg/templates/cache_test.go
2838 views
1
package templates
2
3
import (
4
"errors"
5
"os"
6
"path/filepath"
7
"testing"
8
"time"
9
10
"github.com/stretchr/testify/require"
11
)
12
13
func TestCache(t *testing.T) {
14
templates := NewCache()
15
testErr := errors.New("test error")
16
17
data, _, err := templates.Has("test")
18
require.Nil(t, err, "invalid value for err")
19
require.Nil(t, data, "invalid value for data")
20
21
item := &Template{}
22
23
templates.Store("test", item, nil, testErr)
24
data, _, err = templates.Has("test")
25
require.Equal(t, testErr, err, "invalid value for err")
26
require.Equal(t, item, data, "invalid value for data")
27
}
28
29
func TestCacheFileBased(t *testing.T) {
30
tempDir, err := os.MkdirTemp("", "cache_test")
31
require.NoError(t, err)
32
defer func() {
33
_ = os.RemoveAll(tempDir)
34
}()
35
36
cache := NewCache()
37
template := &Template{}
38
39
// Create a test file
40
testFile := filepath.Join(tempDir, "test.yaml")
41
err = os.WriteFile(testFile, []byte("test content"), 0644)
42
require.NoError(t, err)
43
44
// Store template with file
45
cache.Store(testFile, template, []byte("raw content"), nil)
46
47
// Should be able to retrieve it
48
retrieved, raw, err := cache.Has(testFile)
49
require.NoError(t, err)
50
require.Equal(t, template, retrieved)
51
require.Equal(t, []byte("raw content"), raw)
52
53
// Modify file content (should invalidate cache)
54
time.Sleep(10 * time.Millisecond) // Ensure mod time difference
55
err = os.WriteFile(testFile, []byte("modified content"), 0644)
56
require.NoError(t, err)
57
58
// Cache should be invalidated
59
retrieved, raw, err = cache.Has(testFile)
60
require.NoError(t, err)
61
require.Nil(t, retrieved)
62
require.Nil(t, raw)
63
}
64
65
func TestCacheFileDeletion(t *testing.T) {
66
tempDir, err := os.MkdirTemp("", "cache_test")
67
require.NoError(t, err)
68
defer func() {
69
_ = os.RemoveAll(tempDir)
70
}()
71
72
cache := NewCache()
73
template := &Template{}
74
75
// Create a test file
76
testFile := filepath.Join(tempDir, "test.yaml")
77
err = os.WriteFile(testFile, []byte("test content"), 0644)
78
require.NoError(t, err)
79
80
// Store template with file
81
cache.Store(testFile, template, []byte("raw content"), nil)
82
83
// Should be able to retrieve it
84
retrieved, raw, err := cache.Has(testFile)
85
require.NoError(t, err)
86
require.Equal(t, template, retrieved)
87
require.Equal(t, []byte("raw content"), raw)
88
89
// Delete the file
90
err = os.Remove(testFile)
91
require.NoError(t, err)
92
93
// Cache should be invalidated
94
retrieved, raw, err = cache.Has(testFile)
95
require.NoError(t, err)
96
require.Nil(t, retrieved)
97
require.Nil(t, raw)
98
}
99
100
func TestCacheStoreWithoutRaw(t *testing.T) {
101
cache := NewCache()
102
template := &Template{}
103
testErr := errors.New("test error")
104
105
// Store without raw data
106
cache.StoreWithoutRaw("test", template, testErr)
107
108
// Should be able to retrieve template but not raw data
109
retrieved, raw, err := cache.Has("test")
110
require.Equal(t, testErr, err)
111
require.Equal(t, template, retrieved)
112
require.Empty(t, raw)
113
}
114
115
func TestCacheGet(t *testing.T) {
116
cache := NewCache()
117
template := &Template{}
118
testErr := errors.New("test error")
119
120
// Test cache miss
121
retrieved, err := cache.Get("nonexistent")
122
require.NoError(t, err)
123
require.Nil(t, retrieved)
124
125
// Store template
126
cache.Store("test", template, []byte("raw"), testErr)
127
128
// Should be able to get template
129
retrieved, err = cache.Get("test")
130
require.Equal(t, testErr, err)
131
require.Equal(t, template, retrieved)
132
}
133
134
func TestCachePurge(t *testing.T) {
135
cache := NewCache()
136
template := &Template{}
137
138
// Store multiple templates
139
cache.Store("test1", template, []byte("raw1"), nil)
140
cache.Store("test2", template, []byte("raw2"), nil)
141
142
// Verify they exist
143
retrieved1, _, _ := cache.Has("test1")
144
require.Equal(t, template, retrieved1)
145
retrieved2, _, _ := cache.Has("test2")
146
require.Equal(t, template, retrieved2)
147
148
// Purge cache
149
cache.Purge()
150
151
// Should be empty now
152
retrieved1, _, _ = cache.Has("test1")
153
require.Nil(t, retrieved1)
154
retrieved2, _, _ = cache.Has("test2")
155
require.Nil(t, retrieved2)
156
}
157
158
func TestCacheNonFileTemplates(t *testing.T) {
159
cache := NewCache()
160
template := &Template{}
161
testErr := errors.New("test error")
162
163
// Store non-file template (like the original test)
164
cache.Store("nonfile", template, []byte("raw"), testErr)
165
166
// Should work normally
167
retrieved, raw, err := cache.Has("nonfile")
168
require.Equal(t, testErr, err)
169
require.Equal(t, template, retrieved)
170
require.Equal(t, []byte("raw"), raw)
171
}
172
173
func TestCacheFileBasedStoreWithoutRaw(t *testing.T) {
174
// Create a temporary directory for test files
175
tempDir, err := os.MkdirTemp("", "cache_test")
176
require.NoError(t, err)
177
defer func() {
178
_ = os.RemoveAll(tempDir)
179
}()
180
181
cache := NewCache()
182
template := &Template{}
183
184
// Create a test file
185
testFile := filepath.Join(tempDir, "test.yaml")
186
err = os.WriteFile(testFile, []byte("test content"), 0644)
187
require.NoError(t, err)
188
189
// Store template without raw data
190
cache.StoreWithoutRaw(testFile, template, nil)
191
192
// Should be able to retrieve template but not raw data
193
retrieved, raw, err := cache.Has(testFile)
194
require.NoError(t, err)
195
require.Equal(t, template, retrieved)
196
require.Empty(t, raw)
197
}
198
199