package internalgengo import ( "google.golang.org/protobuf/compiler/protogen" ) var testingPackage = protogen.GoImportPath("testing") func GenerateFuzzTests(gen *protogen.Plugin, file *protogen.File) { { filename := file.GeneratedFilenamePrefix + "_frostfs_fuzz.go" g := gen.NewGeneratedFile(filename, file.GoImportPath) g.P("//go:build gofuzz") g.P("// +build gofuzz") g.P("// Code generated by protoc-gen-go-frostfs. DO NOT EDIT.") g.P() g.P("package ", file.GoPackageName) g.P() for _, msg := range file.Messages { emitFuzzWrappers(g, msg) } } { filename := file.GeneratedFilenamePrefix + "_frostfs_test.go" g := gen.NewGeneratedFile(filename, file.GoImportPath) g.P("//go:build gofuzz") g.P("// +build gofuzz") g.P("// Code generated by protoc-gen-go-frostfs. DO NOT EDIT.") g.P() g.P("package ", file.GoPackageName) g.P() for _, msg := range file.Messages { emitFuzzTests(g, msg) } } } func emitFuzzWrappers(g *protogen.GeneratedFile, msg *protogen.Message) { g.P("func DoFuzzProto", msg.GoIdent.GoName, "(data []byte) int {") g.P("msg := new(", msg.GoIdent.GoName, ")") g.P("if err := msg.UnmarshalProtobuf(data); err != nil { return 0 }") g.P("_ = msg.MarshalProtobuf(nil)") g.P("return 1") g.P("}") g.P("func DoFuzzJSON", msg.GoIdent.GoName, "(data []byte) int {") g.P("msg := new(", msg.GoIdent.GoName, ")") g.P("if err := msg.UnmarshalJSON(data); err != nil { return 0 }") g.P("_, err := msg.MarshalJSON()") g.P("if err != nil { panic(err) }") g.P("return 1") g.P("}") } func emitFuzzTests(g *protogen.GeneratedFile, msg *protogen.Message) { g.P("func FuzzProto", msg.GoIdent.GoName, "(f *", testingPackage.Ident("F"), ") {") g.P("f.Fuzz(func(t *", testingPackage.Ident("T"), ", data []byte) {") g.P("DoFuzzProto", msg.GoIdent.GoName, "(data)") g.P("})}") g.P("func FuzzJSON", msg.GoIdent.GoName, "(f *", testingPackage.Ident("F"), ") {") g.P("f.Fuzz(func(t *", testingPackage.Ident("T"), ", data []byte) {") g.P("DoFuzzJSON", msg.GoIdent.GoName, "(data)") g.P("})}") }