62 lines
1.5 KiB
Go
62 lines
1.5 KiB
Go
package yaml
|
|
|
|
import (
|
|
"bytes"
|
|
"reflect"
|
|
"testing"
|
|
|
|
"gitea.maximumdirect.net/eric/ConfigKit/internal/document"
|
|
)
|
|
|
|
func FuzzParseDocument(f *testing.F) {
|
|
for _, seed := range []string{
|
|
"{}\n",
|
|
"service:\n enabled: true\n ports: [8080, 8081]\n",
|
|
"values: {empty: '', nothing: null, number: -1.5e2}\n",
|
|
"duplicate: one\nduplicate: two\n",
|
|
"alias: &value one\nother: *value\n",
|
|
} {
|
|
f.Add([]byte(seed))
|
|
}
|
|
|
|
limits := Limits{Depth: 64, Nodes: 4096, ParserDepth: 128}
|
|
f.Fuzz(func(t *testing.T, input []byte) {
|
|
if len(input) > 64<<10 {
|
|
return
|
|
}
|
|
parsed, issues := Parse(bytes.NewReader(input), "fuzz-input", limits)
|
|
if len(issues) != 0 {
|
|
return
|
|
}
|
|
|
|
var output bytes.Buffer
|
|
if err := Write(&output, parsed); err != nil {
|
|
t.Fatalf("Write() failed for accepted document: %v", err)
|
|
}
|
|
reparsed, issues := Parse(bytes.NewReader(output.Bytes()), "round-trip", limits)
|
|
if len(issues) != 0 {
|
|
t.Fatalf("rendered accepted document was rejected: %#v", issues)
|
|
}
|
|
clearLocations(parsed)
|
|
clearLocations(reparsed)
|
|
if !reflect.DeepEqual(parsed, reparsed) {
|
|
t.Fatalf("document changed across parse/write/parse: before=%#v after=%#v", parsed, reparsed)
|
|
}
|
|
})
|
|
}
|
|
|
|
func clearLocations(node *document.Node) {
|
|
if node == nil {
|
|
return
|
|
}
|
|
node.Location = document.Location{}
|
|
for index := range node.Mapping {
|
|
node.Mapping[index].KeyLocation = document.Location{}
|
|
node.Mapping[index].ValueLocation = document.Location{}
|
|
clearLocations(node.Mapping[index].Value)
|
|
}
|
|
for _, child := range node.Sequence {
|
|
clearLocations(child)
|
|
}
|
|
}
|