xref: /aosp_15_r20/external/golang-protobuf/internal/impl/legacy_test.go (revision 1c12ee1efe575feb122dbf939ff15148a3b3e8f2)
1*1c12ee1eSDan Willemsen// Copyright 2018 The Go Authors. All rights reserved.
2*1c12ee1eSDan Willemsen// Use of this source code is governed by a BSD-style
3*1c12ee1eSDan Willemsen// license that can be found in the LICENSE file.
4*1c12ee1eSDan Willemsen
5*1c12ee1eSDan Willemsenpackage impl_test
6*1c12ee1eSDan Willemsen
7*1c12ee1eSDan Willemsenimport (
8*1c12ee1eSDan Willemsen	"fmt"
9*1c12ee1eSDan Willemsen	"reflect"
10*1c12ee1eSDan Willemsen	"sync"
11*1c12ee1eSDan Willemsen	"testing"
12*1c12ee1eSDan Willemsen
13*1c12ee1eSDan Willemsen	"github.com/google/go-cmp/cmp"
14*1c12ee1eSDan Willemsen	"github.com/google/go-cmp/cmp/cmpopts"
15*1c12ee1eSDan Willemsen
16*1c12ee1eSDan Willemsen	"google.golang.org/protobuf/encoding/prototext"
17*1c12ee1eSDan Willemsen	pimpl "google.golang.org/protobuf/internal/impl"
18*1c12ee1eSDan Willemsen	"google.golang.org/protobuf/internal/pragma"
19*1c12ee1eSDan Willemsen	"google.golang.org/protobuf/proto"
20*1c12ee1eSDan Willemsen	"google.golang.org/protobuf/reflect/protodesc"
21*1c12ee1eSDan Willemsen	"google.golang.org/protobuf/reflect/protoreflect"
22*1c12ee1eSDan Willemsen	"google.golang.org/protobuf/reflect/protoregistry"
23*1c12ee1eSDan Willemsen	"google.golang.org/protobuf/runtime/protoiface"
24*1c12ee1eSDan Willemsen
25*1c12ee1eSDan Willemsen	proto2_20180125 "google.golang.org/protobuf/internal/testprotos/legacy/proto2_20180125_92554152"
26*1c12ee1eSDan Willemsen	"google.golang.org/protobuf/types/descriptorpb"
27*1c12ee1eSDan Willemsen)
28*1c12ee1eSDan Willemsen
29*1c12ee1eSDan Willemsentype LegacyTestMessage struct {
30*1c12ee1eSDan Willemsen	XXX_unrecognized       []byte
31*1c12ee1eSDan Willemsen	XXX_InternalExtensions map[int32]pimpl.ExtensionField
32*1c12ee1eSDan Willemsen}
33*1c12ee1eSDan Willemsen
34*1c12ee1eSDan Willemsenfunc (*LegacyTestMessage) Reset()         {}
35*1c12ee1eSDan Willemsenfunc (*LegacyTestMessage) String() string { return "" }
36*1c12ee1eSDan Willemsenfunc (*LegacyTestMessage) ProtoMessage()  {}
37*1c12ee1eSDan Willemsenfunc (*LegacyTestMessage) ExtensionRangeArray() []protoiface.ExtensionRangeV1 {
38*1c12ee1eSDan Willemsen	return []protoiface.ExtensionRangeV1{{Start: 10, End: 20}, {Start: 40, End: 80}, {Start: 10000, End: 20000}}
39*1c12ee1eSDan Willemsen}
40*1c12ee1eSDan Willemsenfunc (*LegacyTestMessage) Descriptor() ([]byte, []int) { return legacyFD, []int{0} }
41*1c12ee1eSDan Willemsen
42*1c12ee1eSDan Willemsenvar legacyFD = func() []byte {
43*1c12ee1eSDan Willemsen	b, _ := proto.Marshal(protodesc.ToFileDescriptorProto(mustMakeFileDesc(`
44*1c12ee1eSDan Willemsen		name:   "legacy.proto"
45*1c12ee1eSDan Willemsen		syntax: "proto2"
46*1c12ee1eSDan Willemsen		message_type: [{
47*1c12ee1eSDan Willemsen			name:            "LegacyTestMessage"
48*1c12ee1eSDan Willemsen			extension_range: [{start:10 end:20}, {start:40 end:80}, {start:10000 end:20000}]
49*1c12ee1eSDan Willemsen		}]
50*1c12ee1eSDan Willemsen	`, nil)))
51*1c12ee1eSDan Willemsen	return pimpl.Export{}.CompressGZIP(b)
52*1c12ee1eSDan Willemsen}()
53*1c12ee1eSDan Willemsen
54*1c12ee1eSDan Willemsenfunc init() {
55*1c12ee1eSDan Willemsen	mt := pimpl.Export{}.MessageTypeOf((*LegacyTestMessage)(nil))
56*1c12ee1eSDan Willemsen	protoregistry.GlobalFiles.RegisterFile(mt.Descriptor().ParentFile())
57*1c12ee1eSDan Willemsen	protoregistry.GlobalTypes.RegisterMessage(mt)
58*1c12ee1eSDan Willemsen}
59*1c12ee1eSDan Willemsen
60*1c12ee1eSDan Willemsenfunc mustMakeExtensionType(fileDesc, extDesc string, t reflect.Type, r protodesc.Resolver) protoreflect.ExtensionType {
61*1c12ee1eSDan Willemsen	s := fmt.Sprintf(`name:"test.proto" syntax:"proto2" %s extension:[{%s}]`, fileDesc, extDesc)
62*1c12ee1eSDan Willemsen	xd := mustMakeFileDesc(s, r).Extensions().Get(0)
63*1c12ee1eSDan Willemsen	xi := &pimpl.ExtensionInfo{}
64*1c12ee1eSDan Willemsen	pimpl.InitExtensionInfo(xi, xd, t)
65*1c12ee1eSDan Willemsen	return xi
66*1c12ee1eSDan Willemsen}
67*1c12ee1eSDan Willemsen
68*1c12ee1eSDan Willemsenfunc mustMakeFileDesc(s string, r protodesc.Resolver) protoreflect.FileDescriptor {
69*1c12ee1eSDan Willemsen	pb := new(descriptorpb.FileDescriptorProto)
70*1c12ee1eSDan Willemsen	if err := prototext.Unmarshal([]byte(s), pb); err != nil {
71*1c12ee1eSDan Willemsen		panic(err)
72*1c12ee1eSDan Willemsen	}
73*1c12ee1eSDan Willemsen	fd, err := protodesc.NewFile(pb, r)
74*1c12ee1eSDan Willemsen	if err != nil {
75*1c12ee1eSDan Willemsen		panic(err)
76*1c12ee1eSDan Willemsen	}
77*1c12ee1eSDan Willemsen	return fd
78*1c12ee1eSDan Willemsen}
79*1c12ee1eSDan Willemsen
80*1c12ee1eSDan Willemsenvar (
81*1c12ee1eSDan Willemsen	testParentDesc    = pimpl.Export{}.MessageDescriptorOf((*LegacyTestMessage)(nil))
82*1c12ee1eSDan Willemsen	testEnumV1Desc    = pimpl.Export{}.EnumDescriptorOf(proto2_20180125.Message_ChildEnum(0))
83*1c12ee1eSDan Willemsen	testMessageV1Desc = pimpl.Export{}.MessageDescriptorOf((*proto2_20180125.Message_ChildMessage)(nil))
84*1c12ee1eSDan Willemsen	testMessageV2Desc = enumMessagesType.Desc
85*1c12ee1eSDan Willemsen
86*1c12ee1eSDan Willemsen	depReg = newFileRegistry(
87*1c12ee1eSDan Willemsen		testParentDesc.ParentFile(),
88*1c12ee1eSDan Willemsen		testEnumV1Desc.ParentFile(),
89*1c12ee1eSDan Willemsen		testMessageV1Desc.ParentFile(),
90*1c12ee1eSDan Willemsen		enumProto2Desc.ParentFile(),
91*1c12ee1eSDan Willemsen		testMessageV2Desc.ParentFile(),
92*1c12ee1eSDan Willemsen	)
93*1c12ee1eSDan Willemsen	extensionTypes = []protoreflect.ExtensionType{
94*1c12ee1eSDan Willemsen		mustMakeExtensionType(
95*1c12ee1eSDan Willemsen			`package:"fizz.buzz" dependency:"legacy.proto"`,
96*1c12ee1eSDan Willemsen			`name:"optional_bool" number:10000 label:LABEL_OPTIONAL type:TYPE_BOOL default_value:"true" extendee:".LegacyTestMessage"`,
97*1c12ee1eSDan Willemsen			reflect.TypeOf(false), depReg,
98*1c12ee1eSDan Willemsen		),
99*1c12ee1eSDan Willemsen		mustMakeExtensionType(
100*1c12ee1eSDan Willemsen			`package:"fizz.buzz" dependency:"legacy.proto"`,
101*1c12ee1eSDan Willemsen			`name:"optional_int32" number:10001 label:LABEL_OPTIONAL type:TYPE_INT32 default_value:"-12345" extendee:".LegacyTestMessage"`,
102*1c12ee1eSDan Willemsen			reflect.TypeOf(int32(0)), depReg,
103*1c12ee1eSDan Willemsen		),
104*1c12ee1eSDan Willemsen		mustMakeExtensionType(
105*1c12ee1eSDan Willemsen			`package:"fizz.buzz" dependency:"legacy.proto"`,
106*1c12ee1eSDan Willemsen			`name:"optional_uint32" number:10002 label:LABEL_OPTIONAL type:TYPE_UINT32 default_value:"3200" extendee:".LegacyTestMessage"`,
107*1c12ee1eSDan Willemsen			reflect.TypeOf(uint32(0)), depReg,
108*1c12ee1eSDan Willemsen		),
109*1c12ee1eSDan Willemsen		mustMakeExtensionType(
110*1c12ee1eSDan Willemsen			`package:"fizz.buzz" dependency:"legacy.proto"`,
111*1c12ee1eSDan Willemsen			`name:"optional_float" number:10003 label:LABEL_OPTIONAL type:TYPE_FLOAT default_value:"3.14159" extendee:".LegacyTestMessage"`,
112*1c12ee1eSDan Willemsen			reflect.TypeOf(float32(0)), depReg,
113*1c12ee1eSDan Willemsen		),
114*1c12ee1eSDan Willemsen		mustMakeExtensionType(
115*1c12ee1eSDan Willemsen			`package:"fizz.buzz" dependency:"legacy.proto"`,
116*1c12ee1eSDan Willemsen			`name:"optional_string" number:10004 label:LABEL_OPTIONAL type:TYPE_STRING default_value:"hello, \"world!\"\n" extendee:".LegacyTestMessage"`,
117*1c12ee1eSDan Willemsen			reflect.TypeOf(""), depReg,
118*1c12ee1eSDan Willemsen		),
119*1c12ee1eSDan Willemsen		mustMakeExtensionType(
120*1c12ee1eSDan Willemsen			`package:"fizz.buzz" dependency:"legacy.proto"`,
121*1c12ee1eSDan Willemsen			`name:"optional_bytes" number:10005 label:LABEL_OPTIONAL type:TYPE_BYTES default_value:"dead\\336\\255\\276\\357beef" extendee:".LegacyTestMessage"`,
122*1c12ee1eSDan Willemsen			reflect.TypeOf(([]byte)(nil)), depReg,
123*1c12ee1eSDan Willemsen		),
124*1c12ee1eSDan Willemsen		mustMakeExtensionType(
125*1c12ee1eSDan Willemsen			`package:"fizz.buzz" dependency:["legacy.proto", "proto2_20180125_92554152/test.proto"]`,
126*1c12ee1eSDan Willemsen			`name:"optional_enum_v1" number:10006 label:LABEL_OPTIONAL type:TYPE_ENUM type_name:".google.golang.org.proto2_20180125.Message.ChildEnum" default_value:"ALPHA" extendee:".LegacyTestMessage"`,
127*1c12ee1eSDan Willemsen			reflect.TypeOf(proto2_20180125.Message_ChildEnum(0)), depReg,
128*1c12ee1eSDan Willemsen		),
129*1c12ee1eSDan Willemsen		mustMakeExtensionType(
130*1c12ee1eSDan Willemsen			`package:"fizz.buzz" dependency:["legacy.proto", "proto2_20180125_92554152/test.proto"]`,
131*1c12ee1eSDan Willemsen			`name:"optional_message_v1" number:10007 label:LABEL_OPTIONAL type:TYPE_MESSAGE type_name:".google.golang.org.proto2_20180125.Message.ChildMessage" extendee:".LegacyTestMessage"`,
132*1c12ee1eSDan Willemsen			reflect.TypeOf((*proto2_20180125.Message_ChildMessage)(nil)), depReg,
133*1c12ee1eSDan Willemsen		),
134*1c12ee1eSDan Willemsen		mustMakeExtensionType(
135*1c12ee1eSDan Willemsen			`package:"fizz.buzz" dependency:["legacy.proto", "enum2.proto"]`,
136*1c12ee1eSDan Willemsen			`name:"optional_enum_v2" number:10008 label:LABEL_OPTIONAL type:TYPE_ENUM type_name:".EnumProto2" default_value:"DEAD" extendee:".LegacyTestMessage"`,
137*1c12ee1eSDan Willemsen			reflect.TypeOf(EnumProto2(0)), depReg,
138*1c12ee1eSDan Willemsen		),
139*1c12ee1eSDan Willemsen		mustMakeExtensionType(
140*1c12ee1eSDan Willemsen			`package:"fizz.buzz" dependency:["legacy.proto", "enum-messages.proto"]`,
141*1c12ee1eSDan Willemsen			`name:"optional_message_v2" number:10009 label:LABEL_OPTIONAL type:TYPE_MESSAGE type_name:".EnumMessages" extendee:".LegacyTestMessage"`,
142*1c12ee1eSDan Willemsen			reflect.TypeOf((*EnumMessages)(nil)), depReg,
143*1c12ee1eSDan Willemsen		),
144*1c12ee1eSDan Willemsen		mustMakeExtensionType(
145*1c12ee1eSDan Willemsen			`package:"fizz.buzz" dependency:"legacy.proto"`,
146*1c12ee1eSDan Willemsen			`name:"repeated_bool" number:10010 label:LABEL_REPEATED type:TYPE_BOOL extendee:".LegacyTestMessage"`,
147*1c12ee1eSDan Willemsen			reflect.TypeOf([]bool(nil)), depReg,
148*1c12ee1eSDan Willemsen		),
149*1c12ee1eSDan Willemsen		mustMakeExtensionType(
150*1c12ee1eSDan Willemsen			`package:"fizz.buzz" dependency:"legacy.proto"`,
151*1c12ee1eSDan Willemsen			`name:"repeated_int32" number:10011 label:LABEL_REPEATED type:TYPE_INT32 extendee:".LegacyTestMessage"`,
152*1c12ee1eSDan Willemsen			reflect.TypeOf([]int32(nil)), depReg,
153*1c12ee1eSDan Willemsen		),
154*1c12ee1eSDan Willemsen		mustMakeExtensionType(
155*1c12ee1eSDan Willemsen			`package:"fizz.buzz" dependency:"legacy.proto"`,
156*1c12ee1eSDan Willemsen			`name:"repeated_uint32" number:10012 label:LABEL_REPEATED type:TYPE_UINT32 extendee:".LegacyTestMessage"`,
157*1c12ee1eSDan Willemsen			reflect.TypeOf([]uint32(nil)), depReg,
158*1c12ee1eSDan Willemsen		),
159*1c12ee1eSDan Willemsen		mustMakeExtensionType(
160*1c12ee1eSDan Willemsen			`package:"fizz.buzz" dependency:"legacy.proto"`,
161*1c12ee1eSDan Willemsen			`name:"repeated_float" number:10013 label:LABEL_REPEATED type:TYPE_FLOAT extendee:".LegacyTestMessage"`,
162*1c12ee1eSDan Willemsen			reflect.TypeOf([]float32(nil)), depReg,
163*1c12ee1eSDan Willemsen		),
164*1c12ee1eSDan Willemsen		mustMakeExtensionType(
165*1c12ee1eSDan Willemsen			`package:"fizz.buzz" dependency:"legacy.proto"`,
166*1c12ee1eSDan Willemsen			`name:"repeated_string" number:10014 label:LABEL_REPEATED type:TYPE_STRING extendee:".LegacyTestMessage"`,
167*1c12ee1eSDan Willemsen			reflect.TypeOf([]string(nil)), depReg,
168*1c12ee1eSDan Willemsen		),
169*1c12ee1eSDan Willemsen		mustMakeExtensionType(
170*1c12ee1eSDan Willemsen			`package:"fizz.buzz" dependency:"legacy.proto"`,
171*1c12ee1eSDan Willemsen			`name:"repeated_bytes" number:10015 label:LABEL_REPEATED type:TYPE_BYTES extendee:".LegacyTestMessage"`,
172*1c12ee1eSDan Willemsen			reflect.TypeOf([][]byte(nil)), depReg,
173*1c12ee1eSDan Willemsen		),
174*1c12ee1eSDan Willemsen		mustMakeExtensionType(
175*1c12ee1eSDan Willemsen			`package:"fizz.buzz" dependency:["legacy.proto", "proto2_20180125_92554152/test.proto"]`,
176*1c12ee1eSDan Willemsen			`name:"repeated_enum_v1" number:10016 label:LABEL_REPEATED type:TYPE_ENUM type_name:".google.golang.org.proto2_20180125.Message.ChildEnum" extendee:".LegacyTestMessage"`,
177*1c12ee1eSDan Willemsen			reflect.TypeOf([]proto2_20180125.Message_ChildEnum(nil)), depReg,
178*1c12ee1eSDan Willemsen		),
179*1c12ee1eSDan Willemsen		mustMakeExtensionType(
180*1c12ee1eSDan Willemsen			`package:"fizz.buzz" dependency:["legacy.proto", "proto2_20180125_92554152/test.proto"]`,
181*1c12ee1eSDan Willemsen			`name:"repeated_message_v1" number:10017 label:LABEL_REPEATED type:TYPE_MESSAGE type_name:".google.golang.org.proto2_20180125.Message.ChildMessage" extendee:".LegacyTestMessage"`,
182*1c12ee1eSDan Willemsen			reflect.TypeOf([]*proto2_20180125.Message_ChildMessage(nil)), depReg,
183*1c12ee1eSDan Willemsen		),
184*1c12ee1eSDan Willemsen		mustMakeExtensionType(
185*1c12ee1eSDan Willemsen			`package:"fizz.buzz" dependency:["legacy.proto", "enum2.proto"]`,
186*1c12ee1eSDan Willemsen			`name:"repeated_enum_v2" number:10018 label:LABEL_REPEATED type:TYPE_ENUM type_name:".EnumProto2" extendee:".LegacyTestMessage"`,
187*1c12ee1eSDan Willemsen			reflect.TypeOf([]EnumProto2(nil)), depReg,
188*1c12ee1eSDan Willemsen		),
189*1c12ee1eSDan Willemsen		mustMakeExtensionType(
190*1c12ee1eSDan Willemsen			`package:"fizz.buzz" dependency:["legacy.proto", "enum-messages.proto"]`,
191*1c12ee1eSDan Willemsen			`name:"repeated_message_v2" number:10019 label:LABEL_REPEATED type:TYPE_MESSAGE type_name:".EnumMessages" extendee:".LegacyTestMessage"`,
192*1c12ee1eSDan Willemsen			reflect.TypeOf([]*EnumMessages(nil)), depReg,
193*1c12ee1eSDan Willemsen		),
194*1c12ee1eSDan Willemsen	}
195*1c12ee1eSDan Willemsen
196*1c12ee1eSDan Willemsen	extensionDescs = []*pimpl.ExtensionInfo{{
197*1c12ee1eSDan Willemsen		ExtendedType:  (*LegacyTestMessage)(nil),
198*1c12ee1eSDan Willemsen		ExtensionType: (*bool)(nil),
199*1c12ee1eSDan Willemsen		Field:         10000,
200*1c12ee1eSDan Willemsen		Name:          "fizz.buzz.optional_bool",
201*1c12ee1eSDan Willemsen		Tag:           "varint,10000,opt,name=optional_bool,def=1",
202*1c12ee1eSDan Willemsen		Filename:      "test.proto",
203*1c12ee1eSDan Willemsen	}, {
204*1c12ee1eSDan Willemsen		ExtendedType:  (*LegacyTestMessage)(nil),
205*1c12ee1eSDan Willemsen		ExtensionType: (*int32)(nil),
206*1c12ee1eSDan Willemsen		Field:         10001,
207*1c12ee1eSDan Willemsen		Name:          "fizz.buzz.optional_int32",
208*1c12ee1eSDan Willemsen		Tag:           "varint,10001,opt,name=optional_int32,def=-12345",
209*1c12ee1eSDan Willemsen		Filename:      "test.proto",
210*1c12ee1eSDan Willemsen	}, {
211*1c12ee1eSDan Willemsen		ExtendedType:  (*LegacyTestMessage)(nil),
212*1c12ee1eSDan Willemsen		ExtensionType: (*uint32)(nil),
213*1c12ee1eSDan Willemsen		Field:         10002,
214*1c12ee1eSDan Willemsen		Name:          "fizz.buzz.optional_uint32",
215*1c12ee1eSDan Willemsen		Tag:           "varint,10002,opt,name=optional_uint32,def=3200",
216*1c12ee1eSDan Willemsen		Filename:      "test.proto",
217*1c12ee1eSDan Willemsen	}, {
218*1c12ee1eSDan Willemsen		ExtendedType:  (*LegacyTestMessage)(nil),
219*1c12ee1eSDan Willemsen		ExtensionType: (*float32)(nil),
220*1c12ee1eSDan Willemsen		Field:         10003,
221*1c12ee1eSDan Willemsen		Name:          "fizz.buzz.optional_float",
222*1c12ee1eSDan Willemsen		Tag:           "fixed32,10003,opt,name=optional_float,def=3.14159",
223*1c12ee1eSDan Willemsen		Filename:      "test.proto",
224*1c12ee1eSDan Willemsen	}, {
225*1c12ee1eSDan Willemsen		ExtendedType:  (*LegacyTestMessage)(nil),
226*1c12ee1eSDan Willemsen		ExtensionType: (*string)(nil),
227*1c12ee1eSDan Willemsen		Field:         10004,
228*1c12ee1eSDan Willemsen		Name:          "fizz.buzz.optional_string",
229*1c12ee1eSDan Willemsen		Tag:           "bytes,10004,opt,name=optional_string,def=hello, \"world!\"\n",
230*1c12ee1eSDan Willemsen		Filename:      "test.proto",
231*1c12ee1eSDan Willemsen	}, {
232*1c12ee1eSDan Willemsen		ExtendedType:  (*LegacyTestMessage)(nil),
233*1c12ee1eSDan Willemsen		ExtensionType: ([]byte)(nil),
234*1c12ee1eSDan Willemsen		Field:         10005,
235*1c12ee1eSDan Willemsen		Name:          "fizz.buzz.optional_bytes",
236*1c12ee1eSDan Willemsen		Tag:           "bytes,10005,opt,name=optional_bytes,def=dead\\336\\255\\276\\357beef",
237*1c12ee1eSDan Willemsen		Filename:      "test.proto",
238*1c12ee1eSDan Willemsen	}, {
239*1c12ee1eSDan Willemsen		ExtendedType:  (*LegacyTestMessage)(nil),
240*1c12ee1eSDan Willemsen		ExtensionType: (*proto2_20180125.Message_ChildEnum)(nil),
241*1c12ee1eSDan Willemsen		Field:         10006,
242*1c12ee1eSDan Willemsen		Name:          "fizz.buzz.optional_enum_v1",
243*1c12ee1eSDan Willemsen		Tag:           "varint,10006,opt,name=optional_enum_v1,enum=google.golang.org.proto2_20180125.Message_ChildEnum,def=0",
244*1c12ee1eSDan Willemsen		Filename:      "test.proto",
245*1c12ee1eSDan Willemsen	}, {
246*1c12ee1eSDan Willemsen		ExtendedType:  (*LegacyTestMessage)(nil),
247*1c12ee1eSDan Willemsen		ExtensionType: (*proto2_20180125.Message_ChildMessage)(nil),
248*1c12ee1eSDan Willemsen		Field:         10007,
249*1c12ee1eSDan Willemsen		Name:          "fizz.buzz.optional_message_v1",
250*1c12ee1eSDan Willemsen		Tag:           "bytes,10007,opt,name=optional_message_v1",
251*1c12ee1eSDan Willemsen		Filename:      "test.proto",
252*1c12ee1eSDan Willemsen	}, {
253*1c12ee1eSDan Willemsen		ExtendedType:  (*LegacyTestMessage)(nil),
254*1c12ee1eSDan Willemsen		ExtensionType: (*EnumProto2)(nil),
255*1c12ee1eSDan Willemsen		Field:         10008,
256*1c12ee1eSDan Willemsen		Name:          "fizz.buzz.optional_enum_v2",
257*1c12ee1eSDan Willemsen		Tag:           "varint,10008,opt,name=optional_enum_v2,enum=EnumProto2,def=57005",
258*1c12ee1eSDan Willemsen		Filename:      "test.proto",
259*1c12ee1eSDan Willemsen	}, {
260*1c12ee1eSDan Willemsen		ExtendedType:  (*LegacyTestMessage)(nil),
261*1c12ee1eSDan Willemsen		ExtensionType: (*EnumMessages)(nil),
262*1c12ee1eSDan Willemsen		Field:         10009,
263*1c12ee1eSDan Willemsen		Name:          "fizz.buzz.optional_message_v2",
264*1c12ee1eSDan Willemsen		Tag:           "bytes,10009,opt,name=optional_message_v2",
265*1c12ee1eSDan Willemsen		Filename:      "test.proto",
266*1c12ee1eSDan Willemsen	}, {
267*1c12ee1eSDan Willemsen		ExtendedType:  (*LegacyTestMessage)(nil),
268*1c12ee1eSDan Willemsen		ExtensionType: ([]bool)(nil),
269*1c12ee1eSDan Willemsen		Field:         10010,
270*1c12ee1eSDan Willemsen		Name:          "fizz.buzz.repeated_bool",
271*1c12ee1eSDan Willemsen		Tag:           "varint,10010,rep,name=repeated_bool",
272*1c12ee1eSDan Willemsen		Filename:      "test.proto",
273*1c12ee1eSDan Willemsen	}, {
274*1c12ee1eSDan Willemsen		ExtendedType:  (*LegacyTestMessage)(nil),
275*1c12ee1eSDan Willemsen		ExtensionType: ([]int32)(nil),
276*1c12ee1eSDan Willemsen		Field:         10011,
277*1c12ee1eSDan Willemsen		Name:          "fizz.buzz.repeated_int32",
278*1c12ee1eSDan Willemsen		Tag:           "varint,10011,rep,name=repeated_int32",
279*1c12ee1eSDan Willemsen		Filename:      "test.proto",
280*1c12ee1eSDan Willemsen	}, {
281*1c12ee1eSDan Willemsen		ExtendedType:  (*LegacyTestMessage)(nil),
282*1c12ee1eSDan Willemsen		ExtensionType: ([]uint32)(nil),
283*1c12ee1eSDan Willemsen		Field:         10012,
284*1c12ee1eSDan Willemsen		Name:          "fizz.buzz.repeated_uint32",
285*1c12ee1eSDan Willemsen		Tag:           "varint,10012,rep,name=repeated_uint32",
286*1c12ee1eSDan Willemsen		Filename:      "test.proto",
287*1c12ee1eSDan Willemsen	}, {
288*1c12ee1eSDan Willemsen		ExtendedType:  (*LegacyTestMessage)(nil),
289*1c12ee1eSDan Willemsen		ExtensionType: ([]float32)(nil),
290*1c12ee1eSDan Willemsen		Field:         10013,
291*1c12ee1eSDan Willemsen		Name:          "fizz.buzz.repeated_float",
292*1c12ee1eSDan Willemsen		Tag:           "fixed32,10013,rep,name=repeated_float",
293*1c12ee1eSDan Willemsen		Filename:      "test.proto",
294*1c12ee1eSDan Willemsen	}, {
295*1c12ee1eSDan Willemsen		ExtendedType:  (*LegacyTestMessage)(nil),
296*1c12ee1eSDan Willemsen		ExtensionType: ([]string)(nil),
297*1c12ee1eSDan Willemsen		Field:         10014,
298*1c12ee1eSDan Willemsen		Name:          "fizz.buzz.repeated_string",
299*1c12ee1eSDan Willemsen		Tag:           "bytes,10014,rep,name=repeated_string",
300*1c12ee1eSDan Willemsen		Filename:      "test.proto",
301*1c12ee1eSDan Willemsen	}, {
302*1c12ee1eSDan Willemsen		ExtendedType:  (*LegacyTestMessage)(nil),
303*1c12ee1eSDan Willemsen		ExtensionType: ([][]byte)(nil),
304*1c12ee1eSDan Willemsen		Field:         10015,
305*1c12ee1eSDan Willemsen		Name:          "fizz.buzz.repeated_bytes",
306*1c12ee1eSDan Willemsen		Tag:           "bytes,10015,rep,name=repeated_bytes",
307*1c12ee1eSDan Willemsen		Filename:      "test.proto",
308*1c12ee1eSDan Willemsen	}, {
309*1c12ee1eSDan Willemsen		ExtendedType:  (*LegacyTestMessage)(nil),
310*1c12ee1eSDan Willemsen		ExtensionType: ([]proto2_20180125.Message_ChildEnum)(nil),
311*1c12ee1eSDan Willemsen		Field:         10016,
312*1c12ee1eSDan Willemsen		Name:          "fizz.buzz.repeated_enum_v1",
313*1c12ee1eSDan Willemsen		Tag:           "varint,10016,rep,name=repeated_enum_v1,enum=google.golang.org.proto2_20180125.Message_ChildEnum",
314*1c12ee1eSDan Willemsen		Filename:      "test.proto",
315*1c12ee1eSDan Willemsen	}, {
316*1c12ee1eSDan Willemsen		ExtendedType:  (*LegacyTestMessage)(nil),
317*1c12ee1eSDan Willemsen		ExtensionType: ([]*proto2_20180125.Message_ChildMessage)(nil),
318*1c12ee1eSDan Willemsen		Field:         10017,
319*1c12ee1eSDan Willemsen		Name:          "fizz.buzz.repeated_message_v1",
320*1c12ee1eSDan Willemsen		Tag:           "bytes,10017,rep,name=repeated_message_v1",
321*1c12ee1eSDan Willemsen		Filename:      "test.proto",
322*1c12ee1eSDan Willemsen	}, {
323*1c12ee1eSDan Willemsen		ExtendedType:  (*LegacyTestMessage)(nil),
324*1c12ee1eSDan Willemsen		ExtensionType: ([]EnumProto2)(nil),
325*1c12ee1eSDan Willemsen		Field:         10018,
326*1c12ee1eSDan Willemsen		Name:          "fizz.buzz.repeated_enum_v2",
327*1c12ee1eSDan Willemsen		Tag:           "varint,10018,rep,name=repeated_enum_v2,enum=EnumProto2",
328*1c12ee1eSDan Willemsen		Filename:      "test.proto",
329*1c12ee1eSDan Willemsen	}, {
330*1c12ee1eSDan Willemsen		ExtendedType:  (*LegacyTestMessage)(nil),
331*1c12ee1eSDan Willemsen		ExtensionType: ([]*EnumMessages)(nil),
332*1c12ee1eSDan Willemsen		Field:         10019,
333*1c12ee1eSDan Willemsen		Name:          "fizz.buzz.repeated_message_v2",
334*1c12ee1eSDan Willemsen		Tag:           "bytes,10019,rep,name=repeated_message_v2",
335*1c12ee1eSDan Willemsen		Filename:      "test.proto",
336*1c12ee1eSDan Willemsen	}}
337*1c12ee1eSDan Willemsen)
338*1c12ee1eSDan Willemsen
339*1c12ee1eSDan Willemsenfunc TestLegacyExtensions(t *testing.T) {
340*1c12ee1eSDan Willemsen	opts := cmp.Options{cmp.Comparer(func(x, y *proto2_20180125.Message_ChildMessage) bool {
341*1c12ee1eSDan Willemsen		return x == y // pointer compare messages for object identity
342*1c12ee1eSDan Willemsen	})}
343*1c12ee1eSDan Willemsen
344*1c12ee1eSDan Willemsen	m := pimpl.Export{}.MessageOf(new(LegacyTestMessage))
345*1c12ee1eSDan Willemsen
346*1c12ee1eSDan Willemsen	// Check that getting the zero value returns the default value for scalars,
347*1c12ee1eSDan Willemsen	// nil for singular messages, and an empty list for repeated fields.
348*1c12ee1eSDan Willemsen	defaultValues := map[int]interface{}{
349*1c12ee1eSDan Willemsen		0: bool(true),
350*1c12ee1eSDan Willemsen		1: int32(-12345),
351*1c12ee1eSDan Willemsen		2: uint32(3200),
352*1c12ee1eSDan Willemsen		3: float32(3.14159),
353*1c12ee1eSDan Willemsen		4: string("hello, \"world!\"\n"),
354*1c12ee1eSDan Willemsen		5: []byte("dead\xde\xad\xbe\xefbeef"),
355*1c12ee1eSDan Willemsen		6: proto2_20180125.Message_ALPHA,
356*1c12ee1eSDan Willemsen		7: nil,
357*1c12ee1eSDan Willemsen		8: EnumProto2(0xdead),
358*1c12ee1eSDan Willemsen		9: nil,
359*1c12ee1eSDan Willemsen	}
360*1c12ee1eSDan Willemsen	for i, xt := range extensionTypes {
361*1c12ee1eSDan Willemsen		var got interface{}
362*1c12ee1eSDan Willemsen		xd := xt.TypeDescriptor()
363*1c12ee1eSDan Willemsen		if !(xd.IsList() || xd.IsMap() || xd.Message() != nil) {
364*1c12ee1eSDan Willemsen			got = xt.InterfaceOf(m.Get(xd))
365*1c12ee1eSDan Willemsen		}
366*1c12ee1eSDan Willemsen		want := defaultValues[i]
367*1c12ee1eSDan Willemsen		if diff := cmp.Diff(want, got, opts); diff != "" {
368*1c12ee1eSDan Willemsen			t.Errorf("Message.Get(%d) mismatch (-want +got):\n%v", xd.Number(), diff)
369*1c12ee1eSDan Willemsen		}
370*1c12ee1eSDan Willemsen	}
371*1c12ee1eSDan Willemsen
372*1c12ee1eSDan Willemsen	// All fields should be unpopulated.
373*1c12ee1eSDan Willemsen	for _, xt := range extensionTypes {
374*1c12ee1eSDan Willemsen		xd := xt.TypeDescriptor()
375*1c12ee1eSDan Willemsen		if m.Has(xd) {
376*1c12ee1eSDan Willemsen			t.Errorf("Message.Has(%d) = true, want false", xd.Number())
377*1c12ee1eSDan Willemsen		}
378*1c12ee1eSDan Willemsen	}
379*1c12ee1eSDan Willemsen
380*1c12ee1eSDan Willemsen	// Set some values and append to values to the lists.
381*1c12ee1eSDan Willemsen	m1a := &proto2_20180125.Message_ChildMessage{F1: proto.String("m1a")}
382*1c12ee1eSDan Willemsen	m1b := &proto2_20180125.Message_ChildMessage{F1: proto.String("m2b")}
383*1c12ee1eSDan Willemsen	m2a := &EnumMessages{EnumP2: EnumProto2(0x1b).Enum()}
384*1c12ee1eSDan Willemsen	m2b := &EnumMessages{EnumP2: EnumProto2(0x2b).Enum()}
385*1c12ee1eSDan Willemsen	setValues := map[int]interface{}{
386*1c12ee1eSDan Willemsen		0:  bool(false),
387*1c12ee1eSDan Willemsen		1:  int32(-54321),
388*1c12ee1eSDan Willemsen		2:  uint32(6400),
389*1c12ee1eSDan Willemsen		3:  float32(2.71828),
390*1c12ee1eSDan Willemsen		4:  string("goodbye, \"world!\"\n"),
391*1c12ee1eSDan Willemsen		5:  []byte("live\xde\xad\xbe\xefchicken"),
392*1c12ee1eSDan Willemsen		6:  proto2_20180125.Message_CHARLIE,
393*1c12ee1eSDan Willemsen		7:  m1a,
394*1c12ee1eSDan Willemsen		8:  EnumProto2(0xbeef),
395*1c12ee1eSDan Willemsen		9:  m2a,
396*1c12ee1eSDan Willemsen		10: []bool{true},
397*1c12ee1eSDan Willemsen		11: []int32{-1000},
398*1c12ee1eSDan Willemsen		12: []uint32{1280},
399*1c12ee1eSDan Willemsen		13: []float32{1.6180},
400*1c12ee1eSDan Willemsen		14: []string{"zero"},
401*1c12ee1eSDan Willemsen		15: [][]byte{[]byte("zero")},
402*1c12ee1eSDan Willemsen		16: []proto2_20180125.Message_ChildEnum{proto2_20180125.Message_BRAVO},
403*1c12ee1eSDan Willemsen		17: []*proto2_20180125.Message_ChildMessage{m1b},
404*1c12ee1eSDan Willemsen		18: []EnumProto2{0xdead},
405*1c12ee1eSDan Willemsen		19: []*EnumMessages{m2b},
406*1c12ee1eSDan Willemsen	}
407*1c12ee1eSDan Willemsen	for i, xt := range extensionTypes {
408*1c12ee1eSDan Willemsen		m.Set(xt.TypeDescriptor(), xt.ValueOf(setValues[i]))
409*1c12ee1eSDan Willemsen	}
410*1c12ee1eSDan Willemsen	for i, xt := range extensionTypes[len(extensionTypes)/2:] {
411*1c12ee1eSDan Willemsen		v := extensionTypes[i].ValueOf(setValues[i])
412*1c12ee1eSDan Willemsen		m.Get(xt.TypeDescriptor()).List().Append(v)
413*1c12ee1eSDan Willemsen	}
414*1c12ee1eSDan Willemsen
415*1c12ee1eSDan Willemsen	// Get the values and check for equality.
416*1c12ee1eSDan Willemsen	getValues := map[int]interface{}{
417*1c12ee1eSDan Willemsen		0:  bool(false),
418*1c12ee1eSDan Willemsen		1:  int32(-54321),
419*1c12ee1eSDan Willemsen		2:  uint32(6400),
420*1c12ee1eSDan Willemsen		3:  float32(2.71828),
421*1c12ee1eSDan Willemsen		4:  string("goodbye, \"world!\"\n"),
422*1c12ee1eSDan Willemsen		5:  []byte("live\xde\xad\xbe\xefchicken"),
423*1c12ee1eSDan Willemsen		6:  proto2_20180125.Message_ChildEnum(proto2_20180125.Message_CHARLIE),
424*1c12ee1eSDan Willemsen		7:  m1a,
425*1c12ee1eSDan Willemsen		8:  EnumProto2(0xbeef),
426*1c12ee1eSDan Willemsen		9:  m2a,
427*1c12ee1eSDan Willemsen		10: []bool{true, false},
428*1c12ee1eSDan Willemsen		11: []int32{-1000, -54321},
429*1c12ee1eSDan Willemsen		12: []uint32{1280, 6400},
430*1c12ee1eSDan Willemsen		13: []float32{1.6180, 2.71828},
431*1c12ee1eSDan Willemsen		14: []string{"zero", "goodbye, \"world!\"\n"},
432*1c12ee1eSDan Willemsen		15: [][]byte{[]byte("zero"), []byte("live\xde\xad\xbe\xefchicken")},
433*1c12ee1eSDan Willemsen		16: []proto2_20180125.Message_ChildEnum{proto2_20180125.Message_BRAVO, proto2_20180125.Message_CHARLIE},
434*1c12ee1eSDan Willemsen		17: []*proto2_20180125.Message_ChildMessage{m1b, m1a},
435*1c12ee1eSDan Willemsen		18: []EnumProto2{0xdead, 0xbeef},
436*1c12ee1eSDan Willemsen		19: []*EnumMessages{m2b, m2a},
437*1c12ee1eSDan Willemsen	}
438*1c12ee1eSDan Willemsen	for i, xt := range extensionTypes {
439*1c12ee1eSDan Willemsen		xd := xt.TypeDescriptor()
440*1c12ee1eSDan Willemsen		got := xt.InterfaceOf(m.Get(xd))
441*1c12ee1eSDan Willemsen		want := getValues[i]
442*1c12ee1eSDan Willemsen		if diff := cmp.Diff(want, got, opts); diff != "" {
443*1c12ee1eSDan Willemsen			t.Errorf("Message.Get(%d) mismatch (-want +got):\n%v", xd.Number(), diff)
444*1c12ee1eSDan Willemsen		}
445*1c12ee1eSDan Willemsen	}
446*1c12ee1eSDan Willemsen
447*1c12ee1eSDan Willemsen	// Clear all singular fields and truncate all repeated fields.
448*1c12ee1eSDan Willemsen	for _, xt := range extensionTypes[:len(extensionTypes)/2] {
449*1c12ee1eSDan Willemsen		m.Clear(xt.TypeDescriptor())
450*1c12ee1eSDan Willemsen	}
451*1c12ee1eSDan Willemsen	for _, xt := range extensionTypes[len(extensionTypes)/2:] {
452*1c12ee1eSDan Willemsen		m.Get(xt.TypeDescriptor()).List().Truncate(0)
453*1c12ee1eSDan Willemsen	}
454*1c12ee1eSDan Willemsen
455*1c12ee1eSDan Willemsen	// Clear all repeated fields.
456*1c12ee1eSDan Willemsen	for _, xt := range extensionTypes[len(extensionTypes)/2:] {
457*1c12ee1eSDan Willemsen		m.Clear(xt.TypeDescriptor())
458*1c12ee1eSDan Willemsen	}
459*1c12ee1eSDan Willemsen}
460*1c12ee1eSDan Willemsen
461*1c12ee1eSDan Willemsenfunc TestLegacyExtensionConvert(t *testing.T) {
462*1c12ee1eSDan Willemsen	for i := range extensionTypes {
463*1c12ee1eSDan Willemsen		i := i
464*1c12ee1eSDan Willemsen		t.Run("", func(t *testing.T) {
465*1c12ee1eSDan Willemsen			t.Parallel()
466*1c12ee1eSDan Willemsen
467*1c12ee1eSDan Willemsen			wantType := extensionTypes[i]
468*1c12ee1eSDan Willemsen			wantDesc := extensionDescs[i]
469*1c12ee1eSDan Willemsen			gotType := (protoreflect.ExtensionType)(wantDesc)
470*1c12ee1eSDan Willemsen			gotDesc := wantType.(*pimpl.ExtensionInfo)
471*1c12ee1eSDan Willemsen
472*1c12ee1eSDan Willemsen			// Concurrently call accessors to trigger possible races.
473*1c12ee1eSDan Willemsen			for _, xt := range []protoreflect.ExtensionType{wantType, wantDesc} {
474*1c12ee1eSDan Willemsen				xt := xt
475*1c12ee1eSDan Willemsen				go func() { xt.New() }()
476*1c12ee1eSDan Willemsen				go func() { xt.Zero() }()
477*1c12ee1eSDan Willemsen				go func() { xt.TypeDescriptor() }()
478*1c12ee1eSDan Willemsen			}
479*1c12ee1eSDan Willemsen
480*1c12ee1eSDan Willemsen			// TODO: We need a test package to compare descriptors.
481*1c12ee1eSDan Willemsen			type list interface {
482*1c12ee1eSDan Willemsen				Len() int
483*1c12ee1eSDan Willemsen				pragma.DoNotImplement
484*1c12ee1eSDan Willemsen			}
485*1c12ee1eSDan Willemsen			opts := cmp.Options{
486*1c12ee1eSDan Willemsen				cmp.Comparer(func(x, y reflect.Type) bool {
487*1c12ee1eSDan Willemsen					return x == y
488*1c12ee1eSDan Willemsen				}),
489*1c12ee1eSDan Willemsen				cmp.Transformer("", func(x list) []interface{} {
490*1c12ee1eSDan Willemsen					out := make([]interface{}, x.Len())
491*1c12ee1eSDan Willemsen					v := reflect.ValueOf(x)
492*1c12ee1eSDan Willemsen					for i := 0; i < x.Len(); i++ {
493*1c12ee1eSDan Willemsen						m := v.MethodByName("Get")
494*1c12ee1eSDan Willemsen						out[i] = m.Call([]reflect.Value{reflect.ValueOf(i)})[0].Interface()
495*1c12ee1eSDan Willemsen					}
496*1c12ee1eSDan Willemsen					return out
497*1c12ee1eSDan Willemsen				}),
498*1c12ee1eSDan Willemsen				cmp.Transformer("", func(x protoreflect.Descriptor) map[string]interface{} {
499*1c12ee1eSDan Willemsen					out := make(map[string]interface{})
500*1c12ee1eSDan Willemsen					v := reflect.ValueOf(x)
501*1c12ee1eSDan Willemsen					for i := 0; i < v.NumMethod(); i++ {
502*1c12ee1eSDan Willemsen						name := v.Type().Method(i).Name
503*1c12ee1eSDan Willemsen						if m := v.Method(i); m.Type().NumIn() == 0 && m.Type().NumOut() == 1 {
504*1c12ee1eSDan Willemsen							switch name {
505*1c12ee1eSDan Willemsen							case "ParentFile", "Parent":
506*1c12ee1eSDan Willemsen							// Ignore parents to avoid recursive cycle.
507*1c12ee1eSDan Willemsen							case "Options":
508*1c12ee1eSDan Willemsen								// Ignore descriptor options since protos are not cmperable.
509*1c12ee1eSDan Willemsen							case "ContainingOneof", "ContainingMessage", "Enum", "Message":
510*1c12ee1eSDan Willemsen								// Avoid descending into a dependency to avoid a cycle.
511*1c12ee1eSDan Willemsen								// Just record the full name if available.
512*1c12ee1eSDan Willemsen								//
513*1c12ee1eSDan Willemsen								// TODO: Cycle support in cmp would be useful here.
514*1c12ee1eSDan Willemsen								v := m.Call(nil)[0]
515*1c12ee1eSDan Willemsen								if !v.IsNil() {
516*1c12ee1eSDan Willemsen									out[name] = v.Interface().(protoreflect.Descriptor).FullName()
517*1c12ee1eSDan Willemsen								}
518*1c12ee1eSDan Willemsen							case "Type":
519*1c12ee1eSDan Willemsen								// Ignore ExtensionTypeDescriptor.Type method to avoid cycle.
520*1c12ee1eSDan Willemsen							default:
521*1c12ee1eSDan Willemsen								out[name] = m.Call(nil)[0].Interface()
522*1c12ee1eSDan Willemsen							}
523*1c12ee1eSDan Willemsen						}
524*1c12ee1eSDan Willemsen					}
525*1c12ee1eSDan Willemsen					return out
526*1c12ee1eSDan Willemsen				}),
527*1c12ee1eSDan Willemsen				cmp.Transformer("", func(xt protoreflect.ExtensionType) map[string]interface{} {
528*1c12ee1eSDan Willemsen					return map[string]interface{}{
529*1c12ee1eSDan Willemsen						"Descriptor": xt.TypeDescriptor(),
530*1c12ee1eSDan Willemsen					}
531*1c12ee1eSDan Willemsen				}),
532*1c12ee1eSDan Willemsen				cmp.Transformer("", func(v protoreflect.Value) interface{} {
533*1c12ee1eSDan Willemsen					return v.Interface()
534*1c12ee1eSDan Willemsen				}),
535*1c12ee1eSDan Willemsen			}
536*1c12ee1eSDan Willemsen			if diff := cmp.Diff(&wantType, &gotType, opts); diff != "" {
537*1c12ee1eSDan Willemsen				t.Errorf("ExtensionType mismatch (-want, +got):\n%v", diff)
538*1c12ee1eSDan Willemsen			}
539*1c12ee1eSDan Willemsen
540*1c12ee1eSDan Willemsen			opts = cmp.Options{
541*1c12ee1eSDan Willemsen				cmpopts.IgnoreFields(pimpl.ExtensionInfo{}, "ExtensionType"),
542*1c12ee1eSDan Willemsen				cmpopts.IgnoreUnexported(pimpl.ExtensionInfo{}),
543*1c12ee1eSDan Willemsen			}
544*1c12ee1eSDan Willemsen			if diff := cmp.Diff(wantDesc, gotDesc, opts); diff != "" {
545*1c12ee1eSDan Willemsen				t.Errorf("ExtensionDesc mismatch (-want, +got):\n%v", diff)
546*1c12ee1eSDan Willemsen			}
547*1c12ee1eSDan Willemsen		})
548*1c12ee1eSDan Willemsen	}
549*1c12ee1eSDan Willemsen}
550*1c12ee1eSDan Willemsen
551*1c12ee1eSDan Willemsentype (
552*1c12ee1eSDan Willemsen	MessageA struct {
553*1c12ee1eSDan Willemsen		A1 *MessageA `protobuf:"bytes,1,req,name=a1"`
554*1c12ee1eSDan Willemsen		A2 *MessageB `protobuf:"bytes,2,req,name=a2"`
555*1c12ee1eSDan Willemsen		A3 Enum      `protobuf:"varint,3,opt,name=a3,enum=legacy.Enum"`
556*1c12ee1eSDan Willemsen	}
557*1c12ee1eSDan Willemsen	MessageB struct {
558*1c12ee1eSDan Willemsen		B1 *MessageA `protobuf:"bytes,1,req,name=b1"`
559*1c12ee1eSDan Willemsen		B2 *MessageB `protobuf:"bytes,2,req,name=b2"`
560*1c12ee1eSDan Willemsen		B3 Enum      `protobuf:"varint,3,opt,name=b3,enum=legacy.Enum"`
561*1c12ee1eSDan Willemsen	}
562*1c12ee1eSDan Willemsen	Enum int32
563*1c12ee1eSDan Willemsen)
564*1c12ee1eSDan Willemsen
565*1c12ee1eSDan Willemsenfunc (*MessageA) Reset()                      { panic("not implemented") }
566*1c12ee1eSDan Willemsenfunc (*MessageA) String() string              { panic("not implemented") }
567*1c12ee1eSDan Willemsenfunc (*MessageA) ProtoMessage()               { panic("not implemented") }
568*1c12ee1eSDan Willemsenfunc (*MessageA) Descriptor() ([]byte, []int) { return concurrentFD, []int{0} }
569*1c12ee1eSDan Willemsen
570*1c12ee1eSDan Willemsenfunc (*MessageB) Reset()                      { panic("not implemented") }
571*1c12ee1eSDan Willemsenfunc (*MessageB) String() string              { panic("not implemented") }
572*1c12ee1eSDan Willemsenfunc (*MessageB) ProtoMessage()               { panic("not implemented") }
573*1c12ee1eSDan Willemsenfunc (*MessageB) Descriptor() ([]byte, []int) { return concurrentFD, []int{1} }
574*1c12ee1eSDan Willemsen
575*1c12ee1eSDan Willemsenfunc (Enum) EnumDescriptor() ([]byte, []int) { return concurrentFD, []int{0} }
576*1c12ee1eSDan Willemsen
577*1c12ee1eSDan Willemsenvar concurrentFD = func() []byte {
578*1c12ee1eSDan Willemsen	b, _ := proto.Marshal(protodesc.ToFileDescriptorProto(mustMakeFileDesc(`
579*1c12ee1eSDan Willemsen		name:    "concurrent.proto"
580*1c12ee1eSDan Willemsen		syntax:  "proto2"
581*1c12ee1eSDan Willemsen		package: "legacy"
582*1c12ee1eSDan Willemsen		message_type: [{
583*1c12ee1eSDan Willemsen			name: "MessageA"
584*1c12ee1eSDan Willemsen			field: [
585*1c12ee1eSDan Willemsen				{name:"a1" number:1 label:LABEL_REQUIRED type:TYPE_MESSAGE type_name:".legacy.MessageA"},
586*1c12ee1eSDan Willemsen				{name:"a2" number:2 label:LABEL_REQUIRED type:TYPE_MESSAGE type_name:".legacy.MessageB"},
587*1c12ee1eSDan Willemsen				{name:"a3" number:3 label:LABEL_OPTIONAL type:TYPE_ENUM    type_name:".legacy.Enum"}
588*1c12ee1eSDan Willemsen			]
589*1c12ee1eSDan Willemsen		}, {
590*1c12ee1eSDan Willemsen			name: "MessageB"
591*1c12ee1eSDan Willemsen			field: [
592*1c12ee1eSDan Willemsen				{name:"a1" number:1 label:LABEL_REQUIRED type:TYPE_MESSAGE type_name:".legacy.MessageA"},
593*1c12ee1eSDan Willemsen				{name:"a2" number:2 label:LABEL_REQUIRED type:TYPE_MESSAGE type_name:".legacy.MessageB"},
594*1c12ee1eSDan Willemsen				{name:"a3" number:3 label:LABEL_OPTIONAL type:TYPE_ENUM    type_name:".legacy.Enum"}
595*1c12ee1eSDan Willemsen			]
596*1c12ee1eSDan Willemsen		}]
597*1c12ee1eSDan Willemsen		enum_type: [{
598*1c12ee1eSDan Willemsen			name:  "Enum"
599*1c12ee1eSDan Willemsen			value: [{name:"FOO" number:500}]
600*1c12ee1eSDan Willemsen		}]
601*1c12ee1eSDan Willemsen	`, nil)))
602*1c12ee1eSDan Willemsen	return pimpl.Export{}.CompressGZIP(b)
603*1c12ee1eSDan Willemsen}()
604*1c12ee1eSDan Willemsen
605*1c12ee1eSDan Willemsen// TestLegacyConcurrentInit tests that concurrent wrapping of multiple legacy types
606*1c12ee1eSDan Willemsen// results in the exact same descriptor being created.
607*1c12ee1eSDan Willemsenfunc TestLegacyConcurrentInit(t *testing.T) {
608*1c12ee1eSDan Willemsen	const numParallel = 5
609*1c12ee1eSDan Willemsen	var messageATypes [numParallel]protoreflect.MessageType
610*1c12ee1eSDan Willemsen	var messageBTypes [numParallel]protoreflect.MessageType
611*1c12ee1eSDan Willemsen	var enumDescs [numParallel]protoreflect.EnumDescriptor
612*1c12ee1eSDan Willemsen
613*1c12ee1eSDan Willemsen	// Concurrently load message and enum types.
614*1c12ee1eSDan Willemsen	var wg sync.WaitGroup
615*1c12ee1eSDan Willemsen	for i := 0; i < numParallel; i++ {
616*1c12ee1eSDan Willemsen		i := i
617*1c12ee1eSDan Willemsen		wg.Add(3)
618*1c12ee1eSDan Willemsen		go func() {
619*1c12ee1eSDan Willemsen			defer wg.Done()
620*1c12ee1eSDan Willemsen			messageATypes[i] = pimpl.Export{}.MessageTypeOf((*MessageA)(nil))
621*1c12ee1eSDan Willemsen		}()
622*1c12ee1eSDan Willemsen		go func() {
623*1c12ee1eSDan Willemsen			defer wg.Done()
624*1c12ee1eSDan Willemsen			messageBTypes[i] = pimpl.Export{}.MessageTypeOf((*MessageB)(nil))
625*1c12ee1eSDan Willemsen		}()
626*1c12ee1eSDan Willemsen		go func() {
627*1c12ee1eSDan Willemsen			defer wg.Done()
628*1c12ee1eSDan Willemsen			enumDescs[i] = pimpl.Export{}.EnumDescriptorOf(Enum(0))
629*1c12ee1eSDan Willemsen		}()
630*1c12ee1eSDan Willemsen	}
631*1c12ee1eSDan Willemsen	wg.Wait()
632*1c12ee1eSDan Willemsen
633*1c12ee1eSDan Willemsen	var (
634*1c12ee1eSDan Willemsen		wantMTA = messageATypes[0]
635*1c12ee1eSDan Willemsen		wantMDA = messageATypes[0].Descriptor().Fields().ByNumber(1).Message()
636*1c12ee1eSDan Willemsen		wantMTB = messageBTypes[0]
637*1c12ee1eSDan Willemsen		wantMDB = messageBTypes[0].Descriptor().Fields().ByNumber(2).Message()
638*1c12ee1eSDan Willemsen		wantED  = messageATypes[0].Descriptor().Fields().ByNumber(3).Enum()
639*1c12ee1eSDan Willemsen	)
640*1c12ee1eSDan Willemsen
641*1c12ee1eSDan Willemsen	for _, gotMT := range messageATypes[1:] {
642*1c12ee1eSDan Willemsen		if gotMT != wantMTA {
643*1c12ee1eSDan Willemsen			t.Error("MessageType(MessageA) mismatch")
644*1c12ee1eSDan Willemsen		}
645*1c12ee1eSDan Willemsen		if gotMDA := gotMT.Descriptor().Fields().ByNumber(1).Message(); gotMDA != wantMDA {
646*1c12ee1eSDan Willemsen			t.Error("MessageDescriptor(MessageA) mismatch")
647*1c12ee1eSDan Willemsen		}
648*1c12ee1eSDan Willemsen		if gotMDB := gotMT.Descriptor().Fields().ByNumber(2).Message(); gotMDB != wantMDB {
649*1c12ee1eSDan Willemsen			t.Error("MessageDescriptor(MessageB) mismatch")
650*1c12ee1eSDan Willemsen		}
651*1c12ee1eSDan Willemsen		if gotED := gotMT.Descriptor().Fields().ByNumber(3).Enum(); gotED != wantED {
652*1c12ee1eSDan Willemsen			t.Error("EnumDescriptor(Enum) mismatch")
653*1c12ee1eSDan Willemsen		}
654*1c12ee1eSDan Willemsen	}
655*1c12ee1eSDan Willemsen	for _, gotMT := range messageBTypes[1:] {
656*1c12ee1eSDan Willemsen		if gotMT != wantMTB {
657*1c12ee1eSDan Willemsen			t.Error("MessageType(MessageB) mismatch")
658*1c12ee1eSDan Willemsen		}
659*1c12ee1eSDan Willemsen		if gotMDA := gotMT.Descriptor().Fields().ByNumber(1).Message(); gotMDA != wantMDA {
660*1c12ee1eSDan Willemsen			t.Error("MessageDescriptor(MessageA) mismatch")
661*1c12ee1eSDan Willemsen		}
662*1c12ee1eSDan Willemsen		if gotMDB := gotMT.Descriptor().Fields().ByNumber(2).Message(); gotMDB != wantMDB {
663*1c12ee1eSDan Willemsen			t.Error("MessageDescriptor(MessageB) mismatch")
664*1c12ee1eSDan Willemsen		}
665*1c12ee1eSDan Willemsen		if gotED := gotMT.Descriptor().Fields().ByNumber(3).Enum(); gotED != wantED {
666*1c12ee1eSDan Willemsen			t.Error("EnumDescriptor(Enum) mismatch")
667*1c12ee1eSDan Willemsen		}
668*1c12ee1eSDan Willemsen	}
669*1c12ee1eSDan Willemsen	for _, gotED := range enumDescs[1:] {
670*1c12ee1eSDan Willemsen		if gotED != wantED {
671*1c12ee1eSDan Willemsen			t.Error("EnumType(Enum) mismatch")
672*1c12ee1eSDan Willemsen		}
673*1c12ee1eSDan Willemsen	}
674*1c12ee1eSDan Willemsen}
675*1c12ee1eSDan Willemsen
676*1c12ee1eSDan Willemsentype LegacyTestMessageName1 struct{}
677*1c12ee1eSDan Willemsen
678*1c12ee1eSDan Willemsenfunc (*LegacyTestMessageName1) Reset()         { panic("not implemented") }
679*1c12ee1eSDan Willemsenfunc (*LegacyTestMessageName1) String() string { panic("not implemented") }
680*1c12ee1eSDan Willemsenfunc (*LegacyTestMessageName1) ProtoMessage()  { panic("not implemented") }
681*1c12ee1eSDan Willemsen
682*1c12ee1eSDan Willemsentype LegacyTestMessageName2 struct{}
683*1c12ee1eSDan Willemsen
684*1c12ee1eSDan Willemsenfunc (*LegacyTestMessageName2) Reset()         { panic("not implemented") }
685*1c12ee1eSDan Willemsenfunc (*LegacyTestMessageName2) String() string { panic("not implemented") }
686*1c12ee1eSDan Willemsenfunc (*LegacyTestMessageName2) ProtoMessage()  { panic("not implemented") }
687*1c12ee1eSDan Willemsenfunc (*LegacyTestMessageName2) XXX_MessageName() string {
688*1c12ee1eSDan Willemsen	return "google.golang.org.LegacyTestMessageName2"
689*1c12ee1eSDan Willemsen}
690*1c12ee1eSDan Willemsen
691*1c12ee1eSDan Willemsenfunc TestLegacyMessageName(t *testing.T) {
692*1c12ee1eSDan Willemsen	tests := []struct {
693*1c12ee1eSDan Willemsen		in          protoiface.MessageV1
694*1c12ee1eSDan Willemsen		suggestName protoreflect.FullName
695*1c12ee1eSDan Willemsen		wantName    protoreflect.FullName
696*1c12ee1eSDan Willemsen	}{
697*1c12ee1eSDan Willemsen		{new(LegacyTestMessageName1), "google.golang.org.LegacyTestMessageName1", "google.golang.org.LegacyTestMessageName1"},
698*1c12ee1eSDan Willemsen		{new(LegacyTestMessageName2), "", "google.golang.org.LegacyTestMessageName2"},
699*1c12ee1eSDan Willemsen	}
700*1c12ee1eSDan Willemsen
701*1c12ee1eSDan Willemsen	for _, tt := range tests {
702*1c12ee1eSDan Willemsen		mt := pimpl.Export{}.LegacyMessageTypeOf(tt.in, tt.suggestName)
703*1c12ee1eSDan Willemsen		if got := mt.Descriptor().FullName(); got != tt.wantName {
704*1c12ee1eSDan Willemsen			t.Errorf("type: %T, name mismatch: got %v, want %v", tt.in, got, tt.wantName)
705*1c12ee1eSDan Willemsen		}
706*1c12ee1eSDan Willemsen	}
707*1c12ee1eSDan Willemsen}
708