blob: a0032a4b4c7fb07d55ba948a10249b59583e2600 [file] [log] [blame] [edit]
// If this is bootparam we have an import cycle
package bootparam_test
import (
"strings"
"testing"
"github.com/google/go-cmp/cmp"
"source.monogon.dev/metropolis/pkg/bootparam"
"source.monogon.dev/metropolis/pkg/bootparam/ref"
)
// Fuzzers can be run with
// bazel test //metropolis/pkg/bootparam:bootparam_test
// --test_arg=-test.fuzz=FuzzMarshal
// --test_arg=-test.fuzzcachedir=/tmp/fuzz
// --test_arg=-test.fuzztime=60s
func FuzzUnmarshal(f *testing.F) {
f.Add(`initrd="\test\some=value" root=yolo "definitely quoted" ro rootflags=`)
f.Fuzz(func(t *testing.T, a string) {
refOut, refRest := ref.Parse(a)
out, rest, err := bootparam.Unmarshal(a)
if err != nil {
return
}
if diff := cmp.Diff(refOut, out); diff != "" {
t.Errorf("Parse(%q): params mismatch (-want +got):\n%s", a, diff)
}
if refRest != rest {
t.Errorf("Parse(%q): expected rest to be %q, got %q", a, refRest, rest)
}
})
}
func FuzzMarshal(f *testing.F) {
// Choose delimiters which mean nothing to the parser
f.Add("a:b;assd:9dsf;1234", "some fancy rest")
f.Fuzz(func(t *testing.T, paramsRaw string, rest string) {
paramsSeparated := strings.Split(paramsRaw, ";")
var params bootparam.Params
for _, p := range paramsSeparated {
a, b, _ := strings.Cut(p, ":")
params = append(params, bootparam.Param{Param: a, Value: b})
}
rest = bootparam.TrimLeftSpace(rest)
encoded, err := bootparam.Marshal(params, rest)
if err != nil {
return // Invalid input
}
refOut, refRest := ref.Parse(encoded)
if diff := cmp.Diff(refOut, params); diff != "" {
t.Errorf("Marshal(%q): params mismatch (-want +got):\n%s", paramsRaw, diff)
}
if refRest != rest {
t.Errorf("Parse(%q, %q): expected rest to be %q, got %q", paramsRaw, rest, refRest, rest)
}
})
}