Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
projectdiscovery
GitHub Repository: projectdiscovery/nuclei
Path: blob/dev/pkg/operators/extractors/fuzz_harness_test.go
4538 views
1
package extractors
2
3
import (
4
"os"
5
"path/filepath"
6
"testing"
7
8
"github.com/stretchr/testify/require"
9
)
10
11
func TestExtractorFromFuzzDataSeedCorpus(t *testing.T) {
12
entries, err := os.ReadDir("testdata/gofuzz-corpus")
13
require.NoError(t, err)
14
require.NotEmpty(t, entries)
15
16
for _, entry := range entries {
17
if entry.IsDir() {
18
continue
19
}
20
21
path := filepath.Join("testdata/gofuzz-corpus", entry.Name())
22
data, err := os.ReadFile(path)
23
require.NoError(t, err)
24
25
extractor, ok := extractorFromFuzzData(data)
26
require.Truef(t, ok, "seed %s should decode into an extractor", entry.Name())
27
require.NoErrorf(t, extractor.CompileExtractors(), "seed %s should compile", entry.Name())
28
require.NotPanicsf(t, func() {
29
exerciseFuzzExtractor(extractor)
30
}, "seed %s should execute extraction paths", entry.Name())
31
}
32
}
33
34
func TestExtractorFromFuzzDataRejectsOversizeInput(t *testing.T) {
35
data := make([]byte, fuzzMaxInputSize+1)
36
extractor, ok := extractorFromFuzzData(data)
37
require.False(t, ok)
38
require.Nil(t, extractor)
39
}
40
41
func TestExtractorFromFuzzDataFallbacksCompile(t *testing.T) {
42
testcases := []string{
43
"type=regex",
44
"type=kval\ncase-insensitive=true",
45
"type=json",
46
"type=xpath",
47
"type=dsl",
48
}
49
50
for _, testcase := range testcases {
51
extractor, ok := extractorFromFuzzData([]byte(testcase))
52
require.Truef(t, ok, "fallback input %q should decode", testcase)
53
require.NoErrorf(t, extractor.CompileExtractors(), "fallback input %q should compile", testcase)
54
require.NotPanicsf(t, func() {
55
exerciseFuzzExtractor(extractor)
56
}, "fallback input %q should execute extraction paths", testcase)
57
}
58
}
59
60