-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathfuzz_parser_test.go
More file actions
85 lines (72 loc) · 2.35 KB
/
Copy pathfuzz_parser_test.go
File metadata and controls
85 lines (72 loc) · 2.35 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
package xref_test
import (
"testing"
"github.com/startvibecoding/xref"
"github.com/startvibecoding/xref/internal/grammars"
)
func fullReplaceEdit(oldSrc, newSrc []byte) xref.InputEdit {
oldEnd := pointAtOffset(oldSrc, len(oldSrc))
newEnd := pointAtOffset(newSrc, len(newSrc))
return xref.InputEdit{
StartByte: 0,
OldEndByte: uint32(len(oldSrc)),
NewEndByte: uint32(len(newSrc)),
StartPoint: xref.Point{},
OldEndPoint: oldEnd,
NewEndPoint: newEnd,
}
}
func FuzzGoParseDoesNotPanic(f *testing.F) {
f.Add([]byte("package main\nfunc main() {}\n"))
f.Add([]byte("package p\nvar x = \"hello\"\n"))
f.Add([]byte("package p\nfunc f() { if ( }\n"))
f.Add([]byte("package p\n/* unterminated"))
f.Add([]byte("package p\nfunc f(){"))
f.Add([]byte("package p\n" + "((((((((((((((\n"))
lang := grammars.GoLanguage()
parser := xref.NewParser(lang)
f.Fuzz(func(t *testing.T, src []byte) {
if len(src) > 1<<16 {
t.Skip()
}
defer func() {
if r := recover(); r != nil {
t.Fatalf("panic while parsing fuzz input (%d bytes): %v", len(src), r)
}
}()
tree, err := parser.ParseWithTokenSource(src, mustGoTokenSource(t, src, lang))
if err != nil {
t.Fatalf("parse failed: %v", err)
}
_ = tree
})
}
func FuzzGoParseIncrementalDoesNotPanic(f *testing.F) {
f.Add([]byte("package main\nfunc main() {}\n"), []byte("package main\nfunc main(){println(1)}\n"))
f.Add([]byte("package p\nvar x = 1\n"), []byte("package p\nvar x = \"\n"))
f.Add([]byte("package p\nfunc f() {\n\treturn\n}\n"), []byte("package p\nfunc f() {\n\treturn 1\n}\n"))
lang := grammars.GoLanguage()
parser := xref.NewParser(lang)
f.Fuzz(func(t *testing.T, oldSrc, newSrc []byte) {
if len(oldSrc) > 1<<15 || len(newSrc) > 1<<15 {
t.Skip()
}
defer func() {
if r := recover(); r != nil {
t.Fatalf("panic while incremental parsing fuzz input old=%d new=%d: %v", len(oldSrc), len(newSrc), r)
}
}()
oldTree, err := parser.ParseWithTokenSource(oldSrc, mustGoTokenSource(t, oldSrc, lang))
if err != nil {
t.Fatalf("initial parse failed: %v", err)
}
oldTree.Edit(fullReplaceEdit(oldSrc, newSrc))
newTree, err := parser.ParseIncrementalWithTokenSource(newSrc, oldTree, mustGoTokenSource(t, newSrc, lang))
if err != nil {
t.Fatalf("incremental parse failed: %v", err)
}
if root := newTree.RootNode(); root != nil {
_ = root.ChildCount()
}
})
}