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