xref: /aosp_15_r20/external/golang-protobuf/internal/impl/legacy_aberrant_test.go (revision 1c12ee1efe575feb122dbf939ff15148a3b3e8f2)
1*1c12ee1eSDan Willemsen// Copyright 2019 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	"io"
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
15*1c12ee1eSDan Willemsen	"google.golang.org/protobuf/encoding/prototext"
16*1c12ee1eSDan Willemsen	"google.golang.org/protobuf/internal/impl"
17*1c12ee1eSDan Willemsen	"google.golang.org/protobuf/reflect/protodesc"
18*1c12ee1eSDan Willemsen	"google.golang.org/protobuf/reflect/protoreflect"
19*1c12ee1eSDan Willemsen	"google.golang.org/protobuf/runtime/protoiface"
20*1c12ee1eSDan Willemsen	"google.golang.org/protobuf/testing/protocmp"
21*1c12ee1eSDan Willemsen
22*1c12ee1eSDan Willemsen	"google.golang.org/protobuf/types/descriptorpb"
23*1c12ee1eSDan Willemsen)
24*1c12ee1eSDan Willemsen
25*1c12ee1eSDan Willemsentype AberrantMessage struct {
26*1c12ee1eSDan Willemsen	OptionalBool     *bool            `protobuf:"varint,1,opt,name=opt_bool,def=1"`
27*1c12ee1eSDan Willemsen	OptionalInt32    *int32           `protobuf:"varint,2,opt,name=opt_int32,def=-12345"`
28*1c12ee1eSDan Willemsen	OptionalSint32   *int32           `protobuf:"zigzag32,3,opt,name=opt_sint32,def=-3200"`
29*1c12ee1eSDan Willemsen	OptionalUint32   *uint32          `protobuf:"varint,4,opt,name=opt_uint32,def=3200"`
30*1c12ee1eSDan Willemsen	OptionalInt64    *int64           `protobuf:"varint,5,opt,name=opt_int64,def=-123456789"`
31*1c12ee1eSDan Willemsen	OptionalSint64   *int64           `protobuf:"zigzag64,6,opt,name=opt_sint64,def=-6400"`
32*1c12ee1eSDan Willemsen	OptionalUint64   *uint64          `protobuf:"varint,7,opt,name=opt_uint64,def=6400"`
33*1c12ee1eSDan Willemsen	OptionalFixed32  *uint32          `protobuf:"fixed32,8,opt,name=opt_fixed32,def=320000"`
34*1c12ee1eSDan Willemsen	OptionalSfixed32 *int32           `protobuf:"fixed32,9,opt,name=opt_sfixed32,def=-320000"`
35*1c12ee1eSDan Willemsen	OptionalFloat    *float32         `protobuf:"fixed32,10,opt,name=opt_float,def=3.14159"`
36*1c12ee1eSDan Willemsen	OptionalFixed64  *uint64          `protobuf:"fixed64,11,opt,name=opt_fixed64,def=640000"`
37*1c12ee1eSDan Willemsen	OptionalSfixed64 *int64           `protobuf:"fixed64,12,opt,name=opt_sfixed64,def=-640000"`
38*1c12ee1eSDan Willemsen	OptionalDouble   *float64         `protobuf:"fixed64,13,opt,name=opt_double,def=3.14159265359"`
39*1c12ee1eSDan Willemsen	OptionalString   *string          `protobuf:"bytes,14,opt,name=opt_string,def=hello, \"world!\"\n"`
40*1c12ee1eSDan Willemsen	OptionalBytes    []byte           `protobuf:"bytes,15,opt,name=opt_bytes,def=dead\\336\\255\\276\\357beef"`
41*1c12ee1eSDan Willemsen	OptionalEnum     *AberrantEnum    `protobuf:"varint,16,opt,name=opt_enum,enum=google.golang.org.example.AberrantEnum,def=0"`
42*1c12ee1eSDan Willemsen	OptionalMessage  *AberrantMessage `protobuf:"bytes,17,opt,name=opt_message"`
43*1c12ee1eSDan Willemsen
44*1c12ee1eSDan Willemsen	RepeatedBool     []bool             `protobuf:"varint,18,rep,packed,name=rep_bool"`
45*1c12ee1eSDan Willemsen	RepeatedInt32    []int32            `protobuf:"varint,19,rep,packed,name=rep_int32"`
46*1c12ee1eSDan Willemsen	RepeatedSint32   []int32            `protobuf:"zigzag32,20,rep,packed,name=rep_sint32"`
47*1c12ee1eSDan Willemsen	RepeatedUint32   []uint32           `protobuf:"varint,21,rep,packed,name=rep_uint32"`
48*1c12ee1eSDan Willemsen	RepeatedInt64    []int64            `protobuf:"varint,22,rep,packed,name=rep_int64"`
49*1c12ee1eSDan Willemsen	RepeatedSint64   []int64            `protobuf:"zigzag64,23,rep,packed,name=rep_sint64"`
50*1c12ee1eSDan Willemsen	RepeatedUint64   []uint64           `protobuf:"varint,24,rep,packed,name=rep_uint64"`
51*1c12ee1eSDan Willemsen	RepeatedFixed32  []uint32           `protobuf:"fixed32,25,rep,packed,name=rep_fixed32"`
52*1c12ee1eSDan Willemsen	RepeatedSfixed32 []int32            `protobuf:"fixed32,26,rep,packed,name=rep_sfixed32"`
53*1c12ee1eSDan Willemsen	RepeatedFloat    []float32          `protobuf:"fixed32,27,rep,packed,name=rep_float"`
54*1c12ee1eSDan Willemsen	RepeatedFixed64  []uint64           `protobuf:"fixed64,28,rep,packed,name=rep_fixed64"`
55*1c12ee1eSDan Willemsen	RepeatedSfixed64 []int64            `protobuf:"fixed64,29,rep,packed,name=rep_sfixed64"`
56*1c12ee1eSDan Willemsen	RepeatedDouble   []float64          `protobuf:"fixed64,30,rep,packed,name=rep_double"`
57*1c12ee1eSDan Willemsen	RepeatedString   []string           `protobuf:"bytes,31,rep,name=rep_string"`
58*1c12ee1eSDan Willemsen	RepeatedBytes    [][]byte           `protobuf:"bytes,32,rep,name=rep_bytes"`
59*1c12ee1eSDan Willemsen	RepeatedEnum     []AberrantEnum     `protobuf:"varint,33,rep,name=rep_enum,enum=google.golang.org.example.AberrantEnum"`
60*1c12ee1eSDan Willemsen	RepeatedMessage  []*AberrantMessage `protobuf:"bytes,34,rep,name=rep_message"`
61*1c12ee1eSDan Willemsen
62*1c12ee1eSDan Willemsen	MapStringBool     map[string]bool             `protobuf:"bytes,35,rep,name=map_string_bool"     protobuf_key:"bytes,1,opt,name=key" protobuf_val:"varint,2,opt,name=value"`
63*1c12ee1eSDan Willemsen	MapStringInt32    map[string]int32            `protobuf:"bytes,36,rep,name=map_string_int32"    protobuf_key:"bytes,1,opt,name=key" protobuf_val:"varint,2,opt,name=value"`
64*1c12ee1eSDan Willemsen	MapStringSint32   map[string]int32            `protobuf:"bytes,37,rep,name=map_string_sint32"   protobuf_key:"bytes,1,opt,name=key" protobuf_val:"zigzag32,2,opt,name=value"`
65*1c12ee1eSDan Willemsen	MapStringUint32   map[string]uint32           `protobuf:"bytes,38,rep,name=map_string_uint32"   protobuf_key:"bytes,1,opt,name=key" protobuf_val:"varint,2,opt,name=value"`
66*1c12ee1eSDan Willemsen	MapStringInt64    map[string]int64            `protobuf:"bytes,39,rep,name=map_string_int64"    protobuf_key:"bytes,1,opt,name=key" protobuf_val:"varint,2,opt,name=value"`
67*1c12ee1eSDan Willemsen	MapStringSint64   map[string]int64            `protobuf:"bytes,40,rep,name=map_string_sint64"   protobuf_key:"bytes,1,opt,name=key" protobuf_val:"zigzag64,2,opt,name=value"`
68*1c12ee1eSDan Willemsen	MapStringUint64   map[string]uint64           `protobuf:"bytes,41,rep,name=map_string_uint64"   protobuf_key:"bytes,1,opt,name=key" protobuf_val:"varint,2,opt,name=value"`
69*1c12ee1eSDan Willemsen	MapStringFixed32  map[string]uint32           `protobuf:"bytes,42,rep,name=map_string_fixed32"  protobuf_key:"bytes,1,opt,name=key" protobuf_val:"fixed32,2,opt,name=value"`
70*1c12ee1eSDan Willemsen	MapStringSfixed32 map[string]int32            `protobuf:"bytes,43,rep,name=map_string_sfixed32" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"fixed32,2,opt,name=value"`
71*1c12ee1eSDan Willemsen	MapStringFloat    map[string]float32          `protobuf:"bytes,44,rep,name=map_string_float"    protobuf_key:"bytes,1,opt,name=key" protobuf_val:"fixed32,2,opt,name=value"`
72*1c12ee1eSDan Willemsen	MapStringFixed64  map[string]uint64           `protobuf:"bytes,45,rep,name=map_string_fixed64"  protobuf_key:"bytes,1,opt,name=key" protobuf_val:"fixed64,2,opt,name=value"`
73*1c12ee1eSDan Willemsen	MapStringSfixed64 map[string]int64            `protobuf:"bytes,46,rep,name=map_string_sfixed64" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"fixed64,2,opt,name=value"`
74*1c12ee1eSDan Willemsen	MapStringDouble   map[string]float64          `protobuf:"bytes,47,rep,name=map_string_double"   protobuf_key:"bytes,1,opt,name=key" protobuf_val:"fixed64,2,opt,name=value"`
75*1c12ee1eSDan Willemsen	MapStringString   map[string]string           `protobuf:"bytes,48,rep,name=map_string_string"   protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"`
76*1c12ee1eSDan Willemsen	MapStringBytes    map[string][]byte           `protobuf:"bytes,49,rep,name=map_string_bytes"    protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"`
77*1c12ee1eSDan Willemsen	MapStringEnum     map[string]AberrantEnum     `protobuf:"bytes,50,rep,name=map_string_enum"     protobuf_key:"bytes,1,opt,name=key" protobuf_val:"varint,2,opt,name=value,enum=google.golang.org.example.AberrantEnum"`
78*1c12ee1eSDan Willemsen	MapStringMessage  map[string]*AberrantMessage `protobuf:"bytes,51,rep,name=map_string_message"  protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"`
79*1c12ee1eSDan Willemsen
80*1c12ee1eSDan Willemsen	OneofUnion isOneofUnion `protobuf_oneof:"oneof_union"`
81*1c12ee1eSDan Willemsen
82*1c12ee1eSDan Willemsen	Ignored io.Reader
83*1c12ee1eSDan Willemsen}
84*1c12ee1eSDan Willemsen
85*1c12ee1eSDan Willemsenfunc (m *AberrantMessage) ExtensionRangeArray() []protoiface.ExtensionRangeV1 {
86*1c12ee1eSDan Willemsen	return []protoiface.ExtensionRangeV1{{Start: 10, End: 100}}
87*1c12ee1eSDan Willemsen}
88*1c12ee1eSDan Willemsen
89*1c12ee1eSDan Willemsenfunc (m *AberrantMessage) XXX_OneofFuncs() []interface{} {
90*1c12ee1eSDan Willemsen	return []interface{}{
91*1c12ee1eSDan Willemsen		(*OneofBool)(nil),
92*1c12ee1eSDan Willemsen		(*OneofInt32)(nil),
93*1c12ee1eSDan Willemsen		(*OneofSint32)(nil),
94*1c12ee1eSDan Willemsen		(*OneofUint32)(nil),
95*1c12ee1eSDan Willemsen		(*OneofInt64)(nil),
96*1c12ee1eSDan Willemsen		(*OneofSint64)(nil),
97*1c12ee1eSDan Willemsen		(*OneofUint64)(nil),
98*1c12ee1eSDan Willemsen		(*OneofFixed32)(nil),
99*1c12ee1eSDan Willemsen		(*OneofSfixed32)(nil),
100*1c12ee1eSDan Willemsen		(*OneofFloat)(nil),
101*1c12ee1eSDan Willemsen		(*OneofFixed64)(nil),
102*1c12ee1eSDan Willemsen		(*OneofSfixed64)(nil),
103*1c12ee1eSDan Willemsen		(*OneofDouble)(nil),
104*1c12ee1eSDan Willemsen		(*OneofString)(nil),
105*1c12ee1eSDan Willemsen		(*OneofBytes)(nil),
106*1c12ee1eSDan Willemsen		(*OneofEnum)(nil),
107*1c12ee1eSDan Willemsen		(*OneofMessage)(nil),
108*1c12ee1eSDan Willemsen	}
109*1c12ee1eSDan Willemsen}
110*1c12ee1eSDan Willemsen
111*1c12ee1eSDan Willemsentype isOneofUnion interface{ isOneofUnion() }
112*1c12ee1eSDan Willemsen
113*1c12ee1eSDan Willemsentype OneofBool struct {
114*1c12ee1eSDan Willemsen	OneofBool bool `protobuf:"varint,52,opt,name=oneof_bool,oneof,def=1"`
115*1c12ee1eSDan Willemsen}
116*1c12ee1eSDan Willemsentype OneofInt32 struct {
117*1c12ee1eSDan Willemsen	OneofInt32 int32 `protobuf:"varint,53,opt,name=oneof_int32,oneof,def=-12345"`
118*1c12ee1eSDan Willemsen}
119*1c12ee1eSDan Willemsentype OneofSint32 struct {
120*1c12ee1eSDan Willemsen	OneofSint32 int32 `protobuf:"zigzag32,54,opt,name=oneof_sint32,oneof,def=-3200"`
121*1c12ee1eSDan Willemsen}
122*1c12ee1eSDan Willemsentype OneofUint32 struct {
123*1c12ee1eSDan Willemsen	OneofUint32 uint32 `protobuf:"varint,55,opt,name=oneof_uint32,oneof,def=3200"`
124*1c12ee1eSDan Willemsen}
125*1c12ee1eSDan Willemsentype OneofInt64 struct {
126*1c12ee1eSDan Willemsen	OneofInt64 int64 `protobuf:"varint,56,opt,name=oneof_int64,oneof,def=-123456789"`
127*1c12ee1eSDan Willemsen}
128*1c12ee1eSDan Willemsentype OneofSint64 struct {
129*1c12ee1eSDan Willemsen	OneofSint64 int64 `protobuf:"zigzag64,57,opt,name=oneof_sint64,oneof,def=-6400"`
130*1c12ee1eSDan Willemsen}
131*1c12ee1eSDan Willemsentype OneofUint64 struct {
132*1c12ee1eSDan Willemsen	OneofUint64 uint64 `protobuf:"varint,58,opt,name=oneof_uint64,oneof,def=6400"`
133*1c12ee1eSDan Willemsen}
134*1c12ee1eSDan Willemsentype OneofFixed32 struct {
135*1c12ee1eSDan Willemsen	OneofFixed32 uint32 `protobuf:"fixed32,59,opt,name=oneof_fixed32,oneof,def=320000"`
136*1c12ee1eSDan Willemsen}
137*1c12ee1eSDan Willemsentype OneofSfixed32 struct {
138*1c12ee1eSDan Willemsen	OneofSfixed32 int32 `protobuf:"fixed32,60,opt,name=oneof_sfixed32,oneof,def=-320000"`
139*1c12ee1eSDan Willemsen}
140*1c12ee1eSDan Willemsentype OneofFloat struct {
141*1c12ee1eSDan Willemsen	OneofFloat float32 `protobuf:"fixed32,61,opt,name=oneof_float,oneof,def=3.14159"`
142*1c12ee1eSDan Willemsen}
143*1c12ee1eSDan Willemsentype OneofFixed64 struct {
144*1c12ee1eSDan Willemsen	OneofFixed64 uint64 `protobuf:"fixed64,62,opt,name=oneof_fixed64,oneof,def=640000"`
145*1c12ee1eSDan Willemsen}
146*1c12ee1eSDan Willemsentype OneofSfixed64 struct {
147*1c12ee1eSDan Willemsen	OneofSfixed64 int64 `protobuf:"fixed64,63,opt,name=oneof_sfixed64,oneof,def=-640000"`
148*1c12ee1eSDan Willemsen}
149*1c12ee1eSDan Willemsentype OneofDouble struct {
150*1c12ee1eSDan Willemsen	OneofDouble float64 `protobuf:"fixed64,64,opt,name=oneof_double,oneof,def=3.14159265359"`
151*1c12ee1eSDan Willemsen}
152*1c12ee1eSDan Willemsentype OneofString struct {
153*1c12ee1eSDan Willemsen	OneofString string `protobuf:"bytes,65,opt,name=oneof_string,oneof,def=hello, \"world!\"\n"`
154*1c12ee1eSDan Willemsen}
155*1c12ee1eSDan Willemsentype OneofBytes struct {
156*1c12ee1eSDan Willemsen	OneofBytes []byte `protobuf:"bytes,66,opt,name=oneof_bytes,oneof,def=dead\\336\\255\\276\\357beef"`
157*1c12ee1eSDan Willemsen}
158*1c12ee1eSDan Willemsentype OneofEnum struct {
159*1c12ee1eSDan Willemsen	OneofEnum AberrantEnum `protobuf:"varint,67,opt,name=oneof_enum,enum=google.golang.org.example.AberrantEnum,oneof,def=0"`
160*1c12ee1eSDan Willemsen}
161*1c12ee1eSDan Willemsentype OneofMessage struct {
162*1c12ee1eSDan Willemsen	OneofMessage *AberrantMessage `protobuf:"bytes,68,opt,name=oneof_message,oneof"`
163*1c12ee1eSDan Willemsen}
164*1c12ee1eSDan Willemsen
165*1c12ee1eSDan Willemsenfunc (OneofBool) isOneofUnion()     {}
166*1c12ee1eSDan Willemsenfunc (OneofInt32) isOneofUnion()    {}
167*1c12ee1eSDan Willemsenfunc (OneofSint32) isOneofUnion()   {}
168*1c12ee1eSDan Willemsenfunc (OneofUint32) isOneofUnion()   {}
169*1c12ee1eSDan Willemsenfunc (OneofInt64) isOneofUnion()    {}
170*1c12ee1eSDan Willemsenfunc (OneofSint64) isOneofUnion()   {}
171*1c12ee1eSDan Willemsenfunc (OneofUint64) isOneofUnion()   {}
172*1c12ee1eSDan Willemsenfunc (OneofFixed32) isOneofUnion()  {}
173*1c12ee1eSDan Willemsenfunc (OneofSfixed32) isOneofUnion() {}
174*1c12ee1eSDan Willemsenfunc (OneofFloat) isOneofUnion()    {}
175*1c12ee1eSDan Willemsenfunc (OneofFixed64) isOneofUnion()  {}
176*1c12ee1eSDan Willemsenfunc (OneofSfixed64) isOneofUnion() {}
177*1c12ee1eSDan Willemsenfunc (OneofDouble) isOneofUnion()   {}
178*1c12ee1eSDan Willemsenfunc (OneofString) isOneofUnion()   {}
179*1c12ee1eSDan Willemsenfunc (OneofBytes) isOneofUnion()    {}
180*1c12ee1eSDan Willemsenfunc (OneofEnum) isOneofUnion()     {}
181*1c12ee1eSDan Willemsenfunc (OneofMessage) isOneofUnion()  {}
182*1c12ee1eSDan Willemsen
183*1c12ee1eSDan Willemsentype AberrantEnum int32
184*1c12ee1eSDan Willemsen
185*1c12ee1eSDan Willemsenfunc TestAberrantMessages(t *testing.T) {
186*1c12ee1eSDan Willemsen	enumName := impl.AberrantDeriveFullName(reflect.TypeOf(AberrantEnum(0)))
187*1c12ee1eSDan Willemsen	messageName := impl.AberrantDeriveFullName(reflect.TypeOf(AberrantMessage{}))
188*1c12ee1eSDan Willemsen
189*1c12ee1eSDan Willemsen	want := new(descriptorpb.DescriptorProto)
190*1c12ee1eSDan Willemsen	if err := prototext.Unmarshal([]byte(`
191*1c12ee1eSDan Willemsen		name: "AberrantMessage"
192*1c12ee1eSDan Willemsen		field: [
193*1c12ee1eSDan Willemsen			{name:"opt_bool"     number:1  label:LABEL_OPTIONAL type:TYPE_BOOL     default_value:"true"},
194*1c12ee1eSDan Willemsen			{name:"opt_int32"    number:2  label:LABEL_OPTIONAL type:TYPE_INT32    default_value:"-12345"},
195*1c12ee1eSDan Willemsen			{name:"opt_sint32"   number:3  label:LABEL_OPTIONAL type:TYPE_SINT32   default_value:"-3200"},
196*1c12ee1eSDan Willemsen			{name:"opt_uint32"   number:4  label:LABEL_OPTIONAL type:TYPE_UINT32   default_value:"3200"},
197*1c12ee1eSDan Willemsen			{name:"opt_int64"    number:5  label:LABEL_OPTIONAL type:TYPE_INT64    default_value:"-123456789"},
198*1c12ee1eSDan Willemsen			{name:"opt_sint64"   number:6  label:LABEL_OPTIONAL type:TYPE_SINT64   default_value:"-6400"},
199*1c12ee1eSDan Willemsen			{name:"opt_uint64"   number:7  label:LABEL_OPTIONAL type:TYPE_UINT64   default_value:"6400"},
200*1c12ee1eSDan Willemsen			{name:"opt_fixed32"  number:8  label:LABEL_OPTIONAL type:TYPE_FIXED32  default_value:"320000"},
201*1c12ee1eSDan Willemsen			{name:"opt_sfixed32" number:9  label:LABEL_OPTIONAL type:TYPE_SFIXED32 default_value:"-320000"},
202*1c12ee1eSDan Willemsen			{name:"opt_float"    number:10 label:LABEL_OPTIONAL type:TYPE_FLOAT    default_value:"3.14159"},
203*1c12ee1eSDan Willemsen			{name:"opt_fixed64"  number:11 label:LABEL_OPTIONAL type:TYPE_FIXED64  default_value:"640000"},
204*1c12ee1eSDan Willemsen			{name:"opt_sfixed64" number:12 label:LABEL_OPTIONAL type:TYPE_SFIXED64 default_value:"-640000"},
205*1c12ee1eSDan Willemsen			{name:"opt_double"   number:13 label:LABEL_OPTIONAL type:TYPE_DOUBLE   default_value:"3.14159265359"},
206*1c12ee1eSDan Willemsen			{name:"opt_string"   number:14 label:LABEL_OPTIONAL type:TYPE_STRING   default_value:"hello, \"world!\"\n"},
207*1c12ee1eSDan Willemsen			{name:"opt_bytes"    number:15 label:LABEL_OPTIONAL type:TYPE_BYTES    default_value:"dead\\336\\255\\276\\357beef"},
208*1c12ee1eSDan Willemsen			{name:"opt_enum"     number:16 label:LABEL_OPTIONAL type:TYPE_ENUM     type_name:".`+enumName+`" default_value:"UNKNOWN_0"},
209*1c12ee1eSDan Willemsen			{name:"opt_message"  number:17 label:LABEL_OPTIONAL type:TYPE_MESSAGE  type_name:".`+messageName+`"},
210*1c12ee1eSDan Willemsen
211*1c12ee1eSDan Willemsen			{name:"rep_bool"     number:18 label:LABEL_REPEATED type:TYPE_BOOL     options:{packed:true}},
212*1c12ee1eSDan Willemsen			{name:"rep_int32"    number:19 label:LABEL_REPEATED type:TYPE_INT32    options:{packed:true}},
213*1c12ee1eSDan Willemsen			{name:"rep_sint32"   number:20 label:LABEL_REPEATED type:TYPE_SINT32   options:{packed:true}},
214*1c12ee1eSDan Willemsen			{name:"rep_uint32"   number:21 label:LABEL_REPEATED type:TYPE_UINT32   options:{packed:true}},
215*1c12ee1eSDan Willemsen			{name:"rep_int64"    number:22 label:LABEL_REPEATED type:TYPE_INT64    options:{packed:true}},
216*1c12ee1eSDan Willemsen			{name:"rep_sint64"   number:23 label:LABEL_REPEATED type:TYPE_SINT64   options:{packed:true}},
217*1c12ee1eSDan Willemsen			{name:"rep_uint64"   number:24 label:LABEL_REPEATED type:TYPE_UINT64   options:{packed:true}},
218*1c12ee1eSDan Willemsen			{name:"rep_fixed32"  number:25 label:LABEL_REPEATED type:TYPE_FIXED32  options:{packed:true}},
219*1c12ee1eSDan Willemsen			{name:"rep_sfixed32" number:26 label:LABEL_REPEATED type:TYPE_SFIXED32 options:{packed:true}},
220*1c12ee1eSDan Willemsen			{name:"rep_float"    number:27 label:LABEL_REPEATED type:TYPE_FLOAT    options:{packed:true}},
221*1c12ee1eSDan Willemsen			{name:"rep_fixed64"  number:28 label:LABEL_REPEATED type:TYPE_FIXED64  options:{packed:true}},
222*1c12ee1eSDan Willemsen			{name:"rep_sfixed64" number:29 label:LABEL_REPEATED type:TYPE_SFIXED64 options:{packed:true}},
223*1c12ee1eSDan Willemsen			{name:"rep_double"   number:30 label:LABEL_REPEATED type:TYPE_DOUBLE   options:{packed:true}},
224*1c12ee1eSDan Willemsen			{name:"rep_string"   number:31 label:LABEL_REPEATED type:TYPE_STRING},
225*1c12ee1eSDan Willemsen			{name:"rep_bytes"    number:32 label:LABEL_REPEATED type:TYPE_BYTES},
226*1c12ee1eSDan Willemsen			{name:"rep_enum"     number:33 label:LABEL_REPEATED type:TYPE_ENUM     type_name:".`+enumName+`"},
227*1c12ee1eSDan Willemsen			{name:"rep_message"  number:34 label:LABEL_REPEATED type:TYPE_MESSAGE  type_name:".`+messageName+`"},
228*1c12ee1eSDan Willemsen
229*1c12ee1eSDan Willemsen			{name:"map_string_bool"     number:35 label:LABEL_REPEATED type:TYPE_MESSAGE type_name:".`+messageName+`.MapStringBoolEntry"},
230*1c12ee1eSDan Willemsen			{name:"map_string_int32"    number:36 label:LABEL_REPEATED type:TYPE_MESSAGE type_name:".`+messageName+`.MapStringInt32Entry"},
231*1c12ee1eSDan Willemsen			{name:"map_string_sint32"   number:37 label:LABEL_REPEATED type:TYPE_MESSAGE type_name:".`+messageName+`.MapStringSint32Entry"},
232*1c12ee1eSDan Willemsen			{name:"map_string_uint32"   number:38 label:LABEL_REPEATED type:TYPE_MESSAGE type_name:".`+messageName+`.MapStringUint32Entry"},
233*1c12ee1eSDan Willemsen			{name:"map_string_int64"    number:39 label:LABEL_REPEATED type:TYPE_MESSAGE type_name:".`+messageName+`.MapStringInt64Entry"},
234*1c12ee1eSDan Willemsen			{name:"map_string_sint64"   number:40 label:LABEL_REPEATED type:TYPE_MESSAGE type_name:".`+messageName+`.MapStringSint64Entry"},
235*1c12ee1eSDan Willemsen			{name:"map_string_uint64"   number:41 label:LABEL_REPEATED type:TYPE_MESSAGE type_name:".`+messageName+`.MapStringUint64Entry"},
236*1c12ee1eSDan Willemsen			{name:"map_string_fixed32"  number:42 label:LABEL_REPEATED type:TYPE_MESSAGE type_name:".`+messageName+`.MapStringFixed32Entry"},
237*1c12ee1eSDan Willemsen			{name:"map_string_sfixed32" number:43 label:LABEL_REPEATED type:TYPE_MESSAGE type_name:".`+messageName+`.MapStringSfixed32Entry"},
238*1c12ee1eSDan Willemsen			{name:"map_string_float"    number:44 label:LABEL_REPEATED type:TYPE_MESSAGE type_name:".`+messageName+`.MapStringFloatEntry"},
239*1c12ee1eSDan Willemsen			{name:"map_string_fixed64"  number:45 label:LABEL_REPEATED type:TYPE_MESSAGE type_name:".`+messageName+`.MapStringFixed64Entry"},
240*1c12ee1eSDan Willemsen			{name:"map_string_sfixed64" number:46 label:LABEL_REPEATED type:TYPE_MESSAGE type_name:".`+messageName+`.MapStringSfixed64Entry"},
241*1c12ee1eSDan Willemsen			{name:"map_string_double"   number:47 label:LABEL_REPEATED type:TYPE_MESSAGE type_name:".`+messageName+`.MapStringDoubleEntry"},
242*1c12ee1eSDan Willemsen			{name:"map_string_string"   number:48 label:LABEL_REPEATED type:TYPE_MESSAGE type_name:".`+messageName+`.MapStringStringEntry"},
243*1c12ee1eSDan Willemsen			{name:"map_string_bytes"    number:49 label:LABEL_REPEATED type:TYPE_MESSAGE type_name:".`+messageName+`.MapStringBytesEntry"},
244*1c12ee1eSDan Willemsen			{name:"map_string_enum"     number:50 label:LABEL_REPEATED type:TYPE_MESSAGE type_name:".`+messageName+`.MapStringEnumEntry"},
245*1c12ee1eSDan Willemsen			{name:"map_string_message"  number:51 label:LABEL_REPEATED type:TYPE_MESSAGE type_name:".`+messageName+`.MapStringMessageEntry"},
246*1c12ee1eSDan Willemsen
247*1c12ee1eSDan Willemsen			{name:"oneof_bool"     number:52 label:LABEL_OPTIONAL type:TYPE_BOOL     oneof_index:0 default_value:"true"},
248*1c12ee1eSDan Willemsen			{name:"oneof_int32"    number:53 label:LABEL_OPTIONAL type:TYPE_INT32    oneof_index:0 default_value:"-12345"},
249*1c12ee1eSDan Willemsen			{name:"oneof_sint32"   number:54 label:LABEL_OPTIONAL type:TYPE_SINT32   oneof_index:0 default_value:"-3200"},
250*1c12ee1eSDan Willemsen			{name:"oneof_uint32"   number:55 label:LABEL_OPTIONAL type:TYPE_UINT32   oneof_index:0 default_value:"3200"},
251*1c12ee1eSDan Willemsen			{name:"oneof_int64"    number:56 label:LABEL_OPTIONAL type:TYPE_INT64    oneof_index:0 default_value:"-123456789"},
252*1c12ee1eSDan Willemsen			{name:"oneof_sint64"   number:57 label:LABEL_OPTIONAL type:TYPE_SINT64   oneof_index:0 default_value:"-6400"},
253*1c12ee1eSDan Willemsen			{name:"oneof_uint64"   number:58 label:LABEL_OPTIONAL type:TYPE_UINT64   oneof_index:0 default_value:"6400"},
254*1c12ee1eSDan Willemsen			{name:"oneof_fixed32"  number:59 label:LABEL_OPTIONAL type:TYPE_FIXED32  oneof_index:0 default_value:"320000"},
255*1c12ee1eSDan Willemsen			{name:"oneof_sfixed32" number:60 label:LABEL_OPTIONAL type:TYPE_SFIXED32 oneof_index:0 default_value:"-320000"},
256*1c12ee1eSDan Willemsen			{name:"oneof_float"    number:61 label:LABEL_OPTIONAL type:TYPE_FLOAT    oneof_index:0 default_value:"3.14159"},
257*1c12ee1eSDan Willemsen			{name:"oneof_fixed64"  number:62 label:LABEL_OPTIONAL type:TYPE_FIXED64  oneof_index:0 default_value:"640000"},
258*1c12ee1eSDan Willemsen			{name:"oneof_sfixed64" number:63 label:LABEL_OPTIONAL type:TYPE_SFIXED64 oneof_index:0 default_value:"-640000"},
259*1c12ee1eSDan Willemsen			{name:"oneof_double"   number:64 label:LABEL_OPTIONAL type:TYPE_DOUBLE   oneof_index:0 default_value:"3.14159265359"},
260*1c12ee1eSDan Willemsen			{name:"oneof_string"   number:65 label:LABEL_OPTIONAL type:TYPE_STRING   oneof_index:0 default_value:"hello, \"world!\"\n"},
261*1c12ee1eSDan Willemsen			{name:"oneof_bytes"    number:66 label:LABEL_OPTIONAL type:TYPE_BYTES    oneof_index:0 default_value:"dead\\336\\255\\276\\357beef"},
262*1c12ee1eSDan Willemsen			{name:"oneof_enum"     number:67 label:LABEL_OPTIONAL type:TYPE_ENUM     oneof_index:0 type_name:".`+enumName+`" default_value:"UNKNOWN_0"},
263*1c12ee1eSDan Willemsen			{name:"oneof_message"  number:68 label:LABEL_OPTIONAL type:TYPE_MESSAGE  oneof_index:0 type_name:".`+messageName+`"}
264*1c12ee1eSDan Willemsen		]
265*1c12ee1eSDan Willemsen		oneof_decl: [{name:"oneof_union"}]
266*1c12ee1eSDan Willemsen		extension_range: [{start:10 end:101}]
267*1c12ee1eSDan Willemsen		nested_type: [
268*1c12ee1eSDan Willemsen			{name:"MapStringBoolEntry"     field:[{name:"key" number:1 label:LABEL_OPTIONAL type:TYPE_STRING}, {name:"value" number:2 label:LABEL_OPTIONAL type:TYPE_BOOL}]     options:{map_entry:true}},
269*1c12ee1eSDan Willemsen			{name:"MapStringInt32Entry"    field:[{name:"key" number:1 label:LABEL_OPTIONAL type:TYPE_STRING}, {name:"value" number:2 label:LABEL_OPTIONAL type:TYPE_INT32}]    options:{map_entry:true}},
270*1c12ee1eSDan Willemsen			{name:"MapStringSint32Entry"   field:[{name:"key" number:1 label:LABEL_OPTIONAL type:TYPE_STRING}, {name:"value" number:2 label:LABEL_OPTIONAL type:TYPE_SINT32}]   options:{map_entry:true}},
271*1c12ee1eSDan Willemsen			{name:"MapStringUint32Entry"   field:[{name:"key" number:1 label:LABEL_OPTIONAL type:TYPE_STRING}, {name:"value" number:2 label:LABEL_OPTIONAL type:TYPE_UINT32}]   options:{map_entry:true}},
272*1c12ee1eSDan Willemsen			{name:"MapStringInt64Entry"    field:[{name:"key" number:1 label:LABEL_OPTIONAL type:TYPE_STRING}, {name:"value" number:2 label:LABEL_OPTIONAL type:TYPE_INT64}]    options:{map_entry:true}},
273*1c12ee1eSDan Willemsen			{name:"MapStringSint64Entry"   field:[{name:"key" number:1 label:LABEL_OPTIONAL type:TYPE_STRING}, {name:"value" number:2 label:LABEL_OPTIONAL type:TYPE_SINT64}]   options:{map_entry:true}},
274*1c12ee1eSDan Willemsen			{name:"MapStringUint64Entry"   field:[{name:"key" number:1 label:LABEL_OPTIONAL type:TYPE_STRING}, {name:"value" number:2 label:LABEL_OPTIONAL type:TYPE_UINT64}]   options:{map_entry:true}},
275*1c12ee1eSDan Willemsen			{name:"MapStringFixed32Entry"  field:[{name:"key" number:1 label:LABEL_OPTIONAL type:TYPE_STRING}, {name:"value" number:2 label:LABEL_OPTIONAL type:TYPE_FIXED32}]  options:{map_entry:true}},
276*1c12ee1eSDan Willemsen			{name:"MapStringSfixed32Entry" field:[{name:"key" number:1 label:LABEL_OPTIONAL type:TYPE_STRING}, {name:"value" number:2 label:LABEL_OPTIONAL type:TYPE_SFIXED32}] options:{map_entry:true}},
277*1c12ee1eSDan Willemsen			{name:"MapStringFloatEntry"    field:[{name:"key" number:1 label:LABEL_OPTIONAL type:TYPE_STRING}, {name:"value" number:2 label:LABEL_OPTIONAL type:TYPE_FLOAT}]    options:{map_entry:true}},
278*1c12ee1eSDan Willemsen			{name:"MapStringFixed64Entry"  field:[{name:"key" number:1 label:LABEL_OPTIONAL type:TYPE_STRING}, {name:"value" number:2 label:LABEL_OPTIONAL type:TYPE_FIXED64}]  options:{map_entry:true}},
279*1c12ee1eSDan Willemsen			{name:"MapStringSfixed64Entry" field:[{name:"key" number:1 label:LABEL_OPTIONAL type:TYPE_STRING}, {name:"value" number:2 label:LABEL_OPTIONAL type:TYPE_SFIXED64}] options:{map_entry:true}},
280*1c12ee1eSDan Willemsen			{name:"MapStringDoubleEntry"   field:[{name:"key" number:1 label:LABEL_OPTIONAL type:TYPE_STRING}, {name:"value" number:2 label:LABEL_OPTIONAL type:TYPE_DOUBLE}]   options:{map_entry:true}},
281*1c12ee1eSDan Willemsen			{name:"MapStringStringEntry"   field:[{name:"key" number:1 label:LABEL_OPTIONAL type:TYPE_STRING}, {name:"value" number:2 label:LABEL_OPTIONAL type:TYPE_STRING}]   options:{map_entry:true}},
282*1c12ee1eSDan Willemsen			{name:"MapStringBytesEntry"    field:[{name:"key" number:1 label:LABEL_OPTIONAL type:TYPE_STRING}, {name:"value" number:2 label:LABEL_OPTIONAL type:TYPE_BYTES}]    options:{map_entry:true}},
283*1c12ee1eSDan Willemsen			{name:"MapStringEnumEntry"     field:[{name:"key" number:1 label:LABEL_OPTIONAL type:TYPE_STRING}, {name:"value" number:2 label:LABEL_OPTIONAL type:TYPE_ENUM    type_name:".`+enumName+`"}] options:{map_entry:true}},
284*1c12ee1eSDan Willemsen			{name:"MapStringMessageEntry"  field:[{name:"key" number:1 label:LABEL_OPTIONAL type:TYPE_STRING}, {name:"value" number:2 label:LABEL_OPTIONAL type:TYPE_MESSAGE type_name:".`+messageName+`"}]                  options:{map_entry:true}}
285*1c12ee1eSDan Willemsen		]
286*1c12ee1eSDan Willemsen	`), want); err != nil {
287*1c12ee1eSDan Willemsen		t.Fatalf("prototext.Unmarshal() error: %v", err)
288*1c12ee1eSDan Willemsen	}
289*1c12ee1eSDan Willemsen
290*1c12ee1eSDan Willemsen	md := impl.LegacyLoadMessageDesc(reflect.TypeOf(&AberrantMessage{}))
291*1c12ee1eSDan Willemsen	got := protodesc.ToDescriptorProto(md)
292*1c12ee1eSDan Willemsen	if diff := cmp.Diff(want, got, protocmp.Transform()); diff != "" {
293*1c12ee1eSDan Willemsen		t.Errorf("mismatching descriptor (-want +got):\n%s", diff)
294*1c12ee1eSDan Willemsen	}
295*1c12ee1eSDan Willemsen}
296*1c12ee1eSDan Willemsen
297*1c12ee1eSDan Willemsentype AberrantMessage1 struct {
298*1c12ee1eSDan Willemsen	M *AberrantMessage2 `protobuf:"bytes,1,opt,name=message"`
299*1c12ee1eSDan Willemsen}
300*1c12ee1eSDan Willemsen
301*1c12ee1eSDan Willemsentype AberrantMessage2 struct {
302*1c12ee1eSDan Willemsen	M *AberrantMessage1 `protobuf:"bytes,1,opt,name=message"`
303*1c12ee1eSDan Willemsen}
304*1c12ee1eSDan Willemsen
305*1c12ee1eSDan Willemsenfunc TestAberrantRace(t *testing.T) {
306*1c12ee1eSDan Willemsen	var gotMD1, wantMD1, gotMD2, wantMD2 protoreflect.MessageDescriptor
307*1c12ee1eSDan Willemsen
308*1c12ee1eSDan Willemsen	var wg sync.WaitGroup
309*1c12ee1eSDan Willemsen	wg.Add(2)
310*1c12ee1eSDan Willemsen	go func() {
311*1c12ee1eSDan Willemsen		defer wg.Done()
312*1c12ee1eSDan Willemsen		md := impl.LegacyLoadMessageDesc(reflect.TypeOf(&AberrantMessage1{}))
313*1c12ee1eSDan Willemsen		wantMD2 = md.Fields().Get(0).Message()
314*1c12ee1eSDan Willemsen		gotMD2 = wantMD2.Fields().Get(0).Message().Fields().Get(0).Message()
315*1c12ee1eSDan Willemsen	}()
316*1c12ee1eSDan Willemsen	go func() {
317*1c12ee1eSDan Willemsen		defer wg.Done()
318*1c12ee1eSDan Willemsen		md := impl.LegacyLoadMessageDesc(reflect.TypeOf(&AberrantMessage2{}))
319*1c12ee1eSDan Willemsen		wantMD1 = md.Fields().Get(0).Message()
320*1c12ee1eSDan Willemsen		gotMD1 = wantMD1.Fields().Get(0).Message().Fields().Get(0).Message()
321*1c12ee1eSDan Willemsen	}()
322*1c12ee1eSDan Willemsen	wg.Wait()
323*1c12ee1eSDan Willemsen
324*1c12ee1eSDan Willemsen	if gotMD1 != wantMD1 || gotMD2 != wantMD2 {
325*1c12ee1eSDan Willemsen		t.Errorf("mismatching exact message descriptors")
326*1c12ee1eSDan Willemsen	}
327*1c12ee1eSDan Willemsen}
328*1c12ee1eSDan Willemsen
329*1c12ee1eSDan Willemsenfunc TestAberrantExtensions(t *testing.T) {
330*1c12ee1eSDan Willemsen	tests := []struct {
331*1c12ee1eSDan Willemsen		in              *impl.ExtensionInfo
332*1c12ee1eSDan Willemsen		wantName        protoreflect.FullName
333*1c12ee1eSDan Willemsen		wantNumber      protoreflect.FieldNumber
334*1c12ee1eSDan Willemsen		wantPlaceholder bool
335*1c12ee1eSDan Willemsen	}{{
336*1c12ee1eSDan Willemsen		in:              &impl.ExtensionInfo{Field: 500},
337*1c12ee1eSDan Willemsen		wantNumber:      500,
338*1c12ee1eSDan Willemsen		wantPlaceholder: true,
339*1c12ee1eSDan Willemsen	}, {
340*1c12ee1eSDan Willemsen		in:              &impl.ExtensionInfo{Name: "foo.bar.baz"},
341*1c12ee1eSDan Willemsen		wantName:        "foo.bar.baz",
342*1c12ee1eSDan Willemsen		wantPlaceholder: true,
343*1c12ee1eSDan Willemsen	}}
344*1c12ee1eSDan Willemsen
345*1c12ee1eSDan Willemsen	for _, tt := range tests {
346*1c12ee1eSDan Willemsen		t.Run("", func(t *testing.T) {
347*1c12ee1eSDan Willemsen			xtd := tt.in.TypeDescriptor()
348*1c12ee1eSDan Willemsen			switch {
349*1c12ee1eSDan Willemsen			case xtd.FullName() != tt.wantName:
350*1c12ee1eSDan Willemsen				t.Errorf("FullName() = %v, want %v", xtd.FullName(), tt.wantName)
351*1c12ee1eSDan Willemsen			case xtd.Number() != tt.wantNumber:
352*1c12ee1eSDan Willemsen				t.Errorf("Number() = %v, want %v", xtd.Number(), tt.wantNumber)
353*1c12ee1eSDan Willemsen			case xtd.IsPlaceholder() != tt.wantPlaceholder:
354*1c12ee1eSDan Willemsen				t.Errorf("IsPlaceholder() = %v, want %v", xtd.IsPlaceholder(), tt.wantPlaceholder)
355*1c12ee1eSDan Willemsen			}
356*1c12ee1eSDan Willemsen		})
357*1c12ee1eSDan Willemsen	}
358*1c12ee1eSDan Willemsen}
359