// Copyright 2024 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package proto_test import ( "flag" "fmt" "os" "strings" "testing" "google.golang.org/protobuf/internal/impl" "google.golang.org/protobuf/internal/protobuild" "google.golang.org/protobuf/reflect/protoreflect" "google.golang.org/protobuf/reflect/protoregistry" "google.golang.org/protobuf/testing/protopack" _ "google.golang.org/protobuf/internal/testprotos/lazy" _ "google.golang.org/protobuf/internal/testprotos/lazy/lazy_opaque" _ "google.golang.org/protobuf/internal/testprotos/required" _ "google.golang.org/protobuf/internal/testprotos/required/required_opaque" _ "google.golang.org/protobuf/internal/testprotos/test" _ "google.golang.org/protobuf/internal/testprotos/test/weak1" _ "google.golang.org/protobuf/internal/testprotos/test3" _ "google.golang.org/protobuf/internal/testprotos/testeditions/testeditions_hybrid" _ "google.golang.org/protobuf/internal/testprotos/testeditions/testeditions_opaque" ) var testLazyUnmarshal = flag.Bool("test_lazy_unmarshal", false, "test lazy proto.Unmarshal") func TestMain(m *testing.M) { flag.Parse() impl.EnableLazyUnmarshal(*testLazyUnmarshal) os.Exit(m.Run()) } var relatedMessages = func() map[protoreflect.MessageType][]protoreflect.MessageType { related := map[protoreflect.MessageType][]protoreflect.MessageType{} const opaqueNamePrefix = "opaque." protoregistry.GlobalTypes.RangeMessages(func(mt protoreflect.MessageType) bool { name := mt.Descriptor().FullName() if !strings.HasPrefix(string(name), opaqueNamePrefix) { return true } mt1, err := protoregistry.GlobalTypes.FindMessageByName(name[len(opaqueNamePrefix):]) if err != nil { panic(fmt.Sprintf("%v: can't find related message", name)) } related[mt1] = append(related[mt1], mt) return true }) return related }() func init() { testValidMessages = append(testValidMessages, []testProto{ { desc: "lazy field contains wrong wire type", checkFastInit: true, decodeTo: makeMessages(protobuild.Message{ "optional_nested_message": protobuild.Message{ protobuild.Unknown: protopack.Message{ protopack.Tag{2, protopack.VarintType}, protopack.Varint(3), }.Marshal(), }, }), wire: protopack.Message{ protopack.Tag{18, protopack.BytesType}, protopack.LengthPrefix(protopack.Message{ protopack.Tag{2, protopack.VarintType}, protopack.Varint(3), }), }.Marshal(), }, { desc: "lazy field contains right and wrong wire type", checkFastInit: true, decodeTo: makeMessages(protobuild.Message{ "optional_nested_message": protobuild.Message{ "corecursive": protobuild.Message{ "optional_int32": 2, }, protobuild.Unknown: protopack.Message{ protopack.Tag{2, protopack.VarintType}, protopack.Varint(3), }.Marshal(), }, }), wire: protopack.Message{ protopack.Tag{18, protopack.BytesType}, protopack.LengthPrefix(protopack.Message{ protopack.Tag{2, protopack.BytesType}, protopack.LengthPrefix(protopack.Message{ protopack.Tag{1, protopack.VarintType}, protopack.Varint(2), }), protopack.Tag{2, protopack.VarintType}, protopack.Varint(3), }), }.Marshal(), }, }...) }