|  | // 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) | 
|  | } | 
|  | }) | 
|  | } |