blob: cca88d47e73c557c741df17f0be4944f06a00596 [file] [log] [blame]
Joe Tsai851185d2019-07-01 13:45:52 -07001// Copyright 2019 The Go Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style
3// license that can be found in the LICENSE file.
4
5package impl_test
6
7import (
8 "io"
9 "reflect"
Joe Tsai32e8a522019-07-02 10:51:24 -070010 "sync"
Joe Tsai851185d2019-07-01 13:45:52 -070011 "testing"
12
13 "google.golang.org/protobuf/encoding/prototext"
14 "google.golang.org/protobuf/internal/impl"
15 "google.golang.org/protobuf/proto"
16 "google.golang.org/protobuf/reflect/protodesc"
Joe Tsai32e8a522019-07-02 10:51:24 -070017 "google.golang.org/protobuf/reflect/protoreflect"
Joe Tsai851185d2019-07-01 13:45:52 -070018 "google.golang.org/protobuf/runtime/protoiface"
19
20 "google.golang.org/protobuf/types/descriptorpb"
21)
22
23type AberrantMessage struct {
24 OptionalBool *bool `protobuf:"varint,1,opt,name=opt_bool,def=1"`
25 OptionalInt32 *int32 `protobuf:"varint,2,opt,name=opt_int32,def=-12345"`
26 OptionalSint32 *int32 `protobuf:"zigzag32,3,opt,name=opt_sint32,def=-3200"`
27 OptionalUint32 *uint32 `protobuf:"varint,4,opt,name=opt_uint32,def=3200"`
28 OptionalInt64 *int64 `protobuf:"varint,5,opt,name=opt_int64,def=-123456789"`
29 OptionalSint64 *int64 `protobuf:"zigzag64,6,opt,name=opt_sint64,def=-6400"`
30 OptionalUint64 *uint64 `protobuf:"varint,7,opt,name=opt_uint64,def=6400"`
31 OptionalFixed32 *uint32 `protobuf:"fixed32,8,opt,name=opt_fixed32,def=320000"`
32 OptionalSfixed32 *int32 `protobuf:"fixed32,9,opt,name=opt_sfixed32,def=-320000"`
33 OptionalFloat *float32 `protobuf:"fixed32,10,opt,name=opt_float,def=3.14159"`
34 OptionalFixed64 *uint64 `protobuf:"fixed64,11,opt,name=opt_fixed64,def=640000"`
35 OptionalSfixed64 *int64 `protobuf:"fixed64,12,opt,name=opt_sfixed64,def=-640000"`
36 OptionalDouble *float64 `protobuf:"fixed64,13,opt,name=opt_double,def=3.14159265359"`
37 OptionalString *string `protobuf:"bytes,14,opt,name=opt_string,def=hello, \"world!\"\n"`
38 OptionalBytes []byte `protobuf:"bytes,15,opt,name=opt_bytes,def=dead\\336\\255\\276\\357beef"`
39 OptionalEnum *AberrantEnum `protobuf:"varint,16,opt,name=opt_enum,enum=google.golang.org.example.AberrantEnum,def=0"`
40 OptionalMessage *AberrantMessage `protobuf:"bytes,17,opt,name=opt_message"`
41
42 RepeatedBool []bool `protobuf:"varint,18,rep,packed,name=rep_bool"`
43 RepeatedInt32 []int32 `protobuf:"varint,19,rep,packed,name=rep_int32"`
44 RepeatedSint32 []int32 `protobuf:"zigzag32,20,rep,packed,name=rep_sint32"`
45 RepeatedUint32 []uint32 `protobuf:"varint,21,rep,packed,name=rep_uint32"`
46 RepeatedInt64 []int64 `protobuf:"varint,22,rep,packed,name=rep_int64"`
47 RepeatedSint64 []int64 `protobuf:"zigzag64,23,rep,packed,name=rep_sint64"`
48 RepeatedUint64 []uint64 `protobuf:"varint,24,rep,packed,name=rep_uint64"`
49 RepeatedFixed32 []uint32 `protobuf:"fixed32,25,rep,packed,name=rep_fixed32"`
50 RepeatedSfixed32 []int32 `protobuf:"fixed32,26,rep,packed,name=rep_sfixed32"`
51 RepeatedFloat []float32 `protobuf:"fixed32,27,rep,packed,name=rep_float"`
52 RepeatedFixed64 []uint64 `protobuf:"fixed64,28,rep,packed,name=rep_fixed64"`
53 RepeatedSfixed64 []int64 `protobuf:"fixed64,29,rep,packed,name=rep_sfixed64"`
54 RepeatedDouble []float64 `protobuf:"fixed64,30,rep,packed,name=rep_double"`
55 RepeatedString []string `protobuf:"bytes,31,rep,name=rep_string"`
56 RepeatedBytes [][]byte `protobuf:"bytes,32,rep,name=rep_bytes"`
57 RepeatedEnum []AberrantEnum `protobuf:"varint,33,rep,name=rep_enum,enum=google.golang.org.example.AberrantEnum"`
58 RepeatedMessage []*AberrantMessage `protobuf:"bytes,34,rep,name=rep_message"`
59
60 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"`
61 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"`
62 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"`
63 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"`
64 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"`
65 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"`
66 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"`
67 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"`
68 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"`
69 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"`
70 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"`
71 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"`
72 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"`
73 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"`
74 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"`
75 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"`
76 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"`
77
78 OneofUnion isOneofUnion `protobuf_oneof:"oneof_union"`
79
80 Ignored io.Reader
81}
82
Joe Tsai851185d2019-07-01 13:45:52 -070083func (m *AberrantMessage) ExtensionRangeArray() []protoiface.ExtensionRangeV1 {
84 return []protoiface.ExtensionRangeV1{{Start: 10, End: 100}}
85}
86
87func (m *AberrantMessage) XXX_OneofWrappers() []interface{} {
88 return []interface{}{
89 (*OneofBool)(nil),
90 (*OneofInt32)(nil),
91 (*OneofSint32)(nil),
92 (*OneofUint32)(nil),
93 (*OneofInt64)(nil),
94 (*OneofSint64)(nil),
95 (*OneofUint64)(nil),
96 (*OneofFixed32)(nil),
97 (*OneofSfixed32)(nil),
98 (*OneofFloat)(nil),
99 (*OneofFixed64)(nil),
100 (*OneofSfixed64)(nil),
101 (*OneofDouble)(nil),
102 (*OneofString)(nil),
103 (*OneofBytes)(nil),
104 (*OneofEnum)(nil),
105 (*OneofMessage)(nil),
106 }
107}
108
109type isOneofUnion interface{ isOneofUnion() }
110
111type OneofBool struct {
112 OneofBool bool `protobuf:"varint,52,opt,name=oneof_bool,oneof,def=1"`
113}
114type OneofInt32 struct {
115 OneofInt32 int32 `protobuf:"varint,53,opt,name=oneof_int32,oneof,def=-12345"`
116}
117type OneofSint32 struct {
118 OneofSint32 int32 `protobuf:"zigzag32,54,opt,name=oneof_sint32,oneof,def=-3200"`
119}
120type OneofUint32 struct {
121 OneofUint32 uint32 `protobuf:"varint,55,opt,name=oneof_uint32,oneof,def=3200"`
122}
123type OneofInt64 struct {
124 OneofInt64 int64 `protobuf:"varint,56,opt,name=oneof_int64,oneof,def=-123456789"`
125}
126type OneofSint64 struct {
127 OneofSint64 int64 `protobuf:"zigzag64,57,opt,name=oneof_sint64,oneof,def=-6400"`
128}
129type OneofUint64 struct {
130 OneofUint64 uint64 `protobuf:"varint,58,opt,name=oneof_uint64,oneof,def=6400"`
131}
132type OneofFixed32 struct {
133 OneofFixed32 uint32 `protobuf:"fixed32,59,opt,name=oneof_fixed32,oneof,def=320000"`
134}
135type OneofSfixed32 struct {
136 OneofSfixed32 int32 `protobuf:"fixed32,60,opt,name=oneof_sfixed32,oneof,def=-320000"`
137}
138type OneofFloat struct {
139 OneofFloat float32 `protobuf:"fixed32,61,opt,name=oneof_float,oneof,def=3.14159"`
140}
141type OneofFixed64 struct {
142 OneofFixed64 uint64 `protobuf:"fixed64,62,opt,name=oneof_fixed64,oneof,def=640000"`
143}
144type OneofSfixed64 struct {
145 OneofSfixed64 int64 `protobuf:"fixed64,63,opt,name=oneof_sfixed64,oneof,def=-640000"`
146}
147type OneofDouble struct {
148 OneofDouble float64 `protobuf:"fixed64,64,opt,name=oneof_double,oneof,def=3.14159265359"`
149}
150type OneofString struct {
151 OneofString string `protobuf:"bytes,65,opt,name=oneof_string,oneof,def=hello, \"world!\"\n"`
152}
153type OneofBytes struct {
154 OneofBytes []byte `protobuf:"bytes,66,opt,name=oneof_bytes,oneof,def=dead\\336\\255\\276\\357beef"`
155}
156type OneofEnum struct {
157 OneofEnum AberrantEnum `protobuf:"varint,67,opt,name=oneof_enum,enum=google.golang.org.example.AberrantEnum,oneof,def=0"`
158}
159type OneofMessage struct {
160 OneofMessage *AberrantMessage `protobuf:"bytes,68,opt,name=oneof_message,oneof"`
161}
162
163func (OneofBool) isOneofUnion() {}
164func (OneofInt32) isOneofUnion() {}
165func (OneofSint32) isOneofUnion() {}
166func (OneofUint32) isOneofUnion() {}
167func (OneofInt64) isOneofUnion() {}
168func (OneofSint64) isOneofUnion() {}
169func (OneofUint64) isOneofUnion() {}
170func (OneofFixed32) isOneofUnion() {}
171func (OneofSfixed32) isOneofUnion() {}
172func (OneofFloat) isOneofUnion() {}
173func (OneofFixed64) isOneofUnion() {}
174func (OneofSfixed64) isOneofUnion() {}
175func (OneofDouble) isOneofUnion() {}
176func (OneofString) isOneofUnion() {}
177func (OneofBytes) isOneofUnion() {}
178func (OneofEnum) isOneofUnion() {}
179func (OneofMessage) isOneofUnion() {}
180
181type AberrantEnum int32
182
183func TestAberrant(t *testing.T) {
184 want := new(descriptorpb.DescriptorProto)
185 if err := prototext.Unmarshal([]byte(`
186 name: "AberrantMessage"
187 field: [
188 {name:"opt_bool" number:1 label:LABEL_OPTIONAL type:TYPE_BOOL default_value:"true"},
189 {name:"opt_int32" number:2 label:LABEL_OPTIONAL type:TYPE_INT32 default_value:"-12345"},
190 {name:"opt_sint32" number:3 label:LABEL_OPTIONAL type:TYPE_SINT32 default_value:"-3200"},
191 {name:"opt_uint32" number:4 label:LABEL_OPTIONAL type:TYPE_UINT32 default_value:"3200"},
192 {name:"opt_int64" number:5 label:LABEL_OPTIONAL type:TYPE_INT64 default_value:"-123456789"},
193 {name:"opt_sint64" number:6 label:LABEL_OPTIONAL type:TYPE_SINT64 default_value:"-6400"},
194 {name:"opt_uint64" number:7 label:LABEL_OPTIONAL type:TYPE_UINT64 default_value:"6400"},
195 {name:"opt_fixed32" number:8 label:LABEL_OPTIONAL type:TYPE_FIXED32 default_value:"320000"},
196 {name:"opt_sfixed32" number:9 label:LABEL_OPTIONAL type:TYPE_SFIXED32 default_value:"-320000"},
197 {name:"opt_float" number:10 label:LABEL_OPTIONAL type:TYPE_FLOAT default_value:"3.14159"},
198 {name:"opt_fixed64" number:11 label:LABEL_OPTIONAL type:TYPE_FIXED64 default_value:"640000"},
199 {name:"opt_sfixed64" number:12 label:LABEL_OPTIONAL type:TYPE_SFIXED64 default_value:"-640000"},
200 {name:"opt_double" number:13 label:LABEL_OPTIONAL type:TYPE_DOUBLE default_value:"3.14159265359"},
201 {name:"opt_string" number:14 label:LABEL_OPTIONAL type:TYPE_STRING default_value:"hello, \"world!\"\n"},
202 {name:"opt_bytes" number:15 label:LABEL_OPTIONAL type:TYPE_BYTES default_value:"dead\\336\\255\\276\\357beef"},
203 {name:"opt_enum" number:16 label:LABEL_OPTIONAL type:TYPE_ENUM type_name:".google_golang_org.protobuf.internal.impl_test.AberrantEnum" default_value:"UNKNOWN_0"},
Joe Tsai28e61ba2019-07-01 14:33:20 -0700204 {name:"opt_message" number:17 label:LABEL_OPTIONAL type:TYPE_MESSAGE type_name:".google_golang_org.protobuf.internal.impl_test.AberrantMessage"},
Joe Tsai851185d2019-07-01 13:45:52 -0700205
206 {name:"rep_bool" number:18 label:LABEL_REPEATED type:TYPE_BOOL options:{packed:true}},
207 {name:"rep_int32" number:19 label:LABEL_REPEATED type:TYPE_INT32 options:{packed:true}},
208 {name:"rep_sint32" number:20 label:LABEL_REPEATED type:TYPE_SINT32 options:{packed:true}},
209 {name:"rep_uint32" number:21 label:LABEL_REPEATED type:TYPE_UINT32 options:{packed:true}},
210 {name:"rep_int64" number:22 label:LABEL_REPEATED type:TYPE_INT64 options:{packed:true}},
211 {name:"rep_sint64" number:23 label:LABEL_REPEATED type:TYPE_SINT64 options:{packed:true}},
212 {name:"rep_uint64" number:24 label:LABEL_REPEATED type:TYPE_UINT64 options:{packed:true}},
213 {name:"rep_fixed32" number:25 label:LABEL_REPEATED type:TYPE_FIXED32 options:{packed:true}},
214 {name:"rep_sfixed32" number:26 label:LABEL_REPEATED type:TYPE_SFIXED32 options:{packed:true}},
215 {name:"rep_float" number:27 label:LABEL_REPEATED type:TYPE_FLOAT options:{packed:true}},
216 {name:"rep_fixed64" number:28 label:LABEL_REPEATED type:TYPE_FIXED64 options:{packed:true}},
217 {name:"rep_sfixed64" number:29 label:LABEL_REPEATED type:TYPE_SFIXED64 options:{packed:true}},
218 {name:"rep_double" number:30 label:LABEL_REPEATED type:TYPE_DOUBLE options:{packed:true}},
219 {name:"rep_string" number:31 label:LABEL_REPEATED type:TYPE_STRING},
220 {name:"rep_bytes" number:32 label:LABEL_REPEATED type:TYPE_BYTES},
221 {name:"rep_enum" number:33 label:LABEL_REPEATED type:TYPE_ENUM type_name:".google_golang_org.protobuf.internal.impl_test.AberrantEnum"},
Joe Tsai28e61ba2019-07-01 14:33:20 -0700222 {name:"rep_message" number:34 label:LABEL_REPEATED type:TYPE_MESSAGE type_name:".google_golang_org.protobuf.internal.impl_test.AberrantMessage"},
Joe Tsai851185d2019-07-01 13:45:52 -0700223
Joe Tsai28e61ba2019-07-01 14:33:20 -0700224 {name:"map_string_bool" number:35 label:LABEL_REPEATED type:TYPE_MESSAGE type_name:".google_golang_org.protobuf.internal.impl_test.AberrantMessage.MapStringBoolEntry"},
225 {name:"map_string_int32" number:36 label:LABEL_REPEATED type:TYPE_MESSAGE type_name:".google_golang_org.protobuf.internal.impl_test.AberrantMessage.MapStringInt32Entry"},
226 {name:"map_string_sint32" number:37 label:LABEL_REPEATED type:TYPE_MESSAGE type_name:".google_golang_org.protobuf.internal.impl_test.AberrantMessage.MapStringSint32Entry"},
227 {name:"map_string_uint32" number:38 label:LABEL_REPEATED type:TYPE_MESSAGE type_name:".google_golang_org.protobuf.internal.impl_test.AberrantMessage.MapStringUint32Entry"},
228 {name:"map_string_int64" number:39 label:LABEL_REPEATED type:TYPE_MESSAGE type_name:".google_golang_org.protobuf.internal.impl_test.AberrantMessage.MapStringInt64Entry"},
229 {name:"map_string_sint64" number:40 label:LABEL_REPEATED type:TYPE_MESSAGE type_name:".google_golang_org.protobuf.internal.impl_test.AberrantMessage.MapStringSint64Entry"},
230 {name:"map_string_uint64" number:41 label:LABEL_REPEATED type:TYPE_MESSAGE type_name:".google_golang_org.protobuf.internal.impl_test.AberrantMessage.MapStringUint64Entry"},
231 {name:"map_string_fixed32" number:42 label:LABEL_REPEATED type:TYPE_MESSAGE type_name:".google_golang_org.protobuf.internal.impl_test.AberrantMessage.MapStringFixed32Entry"},
232 {name:"map_string_sfixed32" number:43 label:LABEL_REPEATED type:TYPE_MESSAGE type_name:".google_golang_org.protobuf.internal.impl_test.AberrantMessage.MapStringSfixed32Entry"},
233 {name:"map_string_float" number:44 label:LABEL_REPEATED type:TYPE_MESSAGE type_name:".google_golang_org.protobuf.internal.impl_test.AberrantMessage.MapStringFloatEntry"},
234 {name:"map_string_fixed64" number:45 label:LABEL_REPEATED type:TYPE_MESSAGE type_name:".google_golang_org.protobuf.internal.impl_test.AberrantMessage.MapStringFixed64Entry"},
235 {name:"map_string_sfixed64" number:46 label:LABEL_REPEATED type:TYPE_MESSAGE type_name:".google_golang_org.protobuf.internal.impl_test.AberrantMessage.MapStringSfixed64Entry"},
236 {name:"map_string_double" number:47 label:LABEL_REPEATED type:TYPE_MESSAGE type_name:".google_golang_org.protobuf.internal.impl_test.AberrantMessage.MapStringDoubleEntry"},
237 {name:"map_string_string" number:48 label:LABEL_REPEATED type:TYPE_MESSAGE type_name:".google_golang_org.protobuf.internal.impl_test.AberrantMessage.MapStringStringEntry"},
238 {name:"map_string_bytes" number:49 label:LABEL_REPEATED type:TYPE_MESSAGE type_name:".google_golang_org.protobuf.internal.impl_test.AberrantMessage.MapStringBytesEntry"},
239 {name:"map_string_enum" number:50 label:LABEL_REPEATED type:TYPE_MESSAGE type_name:".google_golang_org.protobuf.internal.impl_test.AberrantMessage.MapStringEnumEntry"},
240 {name:"map_string_message" number:51 label:LABEL_REPEATED type:TYPE_MESSAGE type_name:".google_golang_org.protobuf.internal.impl_test.AberrantMessage.MapStringMessageEntry"},
Joe Tsai851185d2019-07-01 13:45:52 -0700241
242 {name:"oneof_bool" number:52 label:LABEL_OPTIONAL type:TYPE_BOOL oneof_index:0 default_value:"true"},
243 {name:"oneof_int32" number:53 label:LABEL_OPTIONAL type:TYPE_INT32 oneof_index:0 default_value:"-12345"},
244 {name:"oneof_sint32" number:54 label:LABEL_OPTIONAL type:TYPE_SINT32 oneof_index:0 default_value:"-3200"},
245 {name:"oneof_uint32" number:55 label:LABEL_OPTIONAL type:TYPE_UINT32 oneof_index:0 default_value:"3200"},
246 {name:"oneof_int64" number:56 label:LABEL_OPTIONAL type:TYPE_INT64 oneof_index:0 default_value:"-123456789"},
247 {name:"oneof_sint64" number:57 label:LABEL_OPTIONAL type:TYPE_SINT64 oneof_index:0 default_value:"-6400"},
248 {name:"oneof_uint64" number:58 label:LABEL_OPTIONAL type:TYPE_UINT64 oneof_index:0 default_value:"6400"},
249 {name:"oneof_fixed32" number:59 label:LABEL_OPTIONAL type:TYPE_FIXED32 oneof_index:0 default_value:"320000"},
250 {name:"oneof_sfixed32" number:60 label:LABEL_OPTIONAL type:TYPE_SFIXED32 oneof_index:0 default_value:"-320000"},
251 {name:"oneof_float" number:61 label:LABEL_OPTIONAL type:TYPE_FLOAT oneof_index:0 default_value:"3.14159"},
252 {name:"oneof_fixed64" number:62 label:LABEL_OPTIONAL type:TYPE_FIXED64 oneof_index:0 default_value:"640000"},
253 {name:"oneof_sfixed64" number:63 label:LABEL_OPTIONAL type:TYPE_SFIXED64 oneof_index:0 default_value:"-640000"},
254 {name:"oneof_double" number:64 label:LABEL_OPTIONAL type:TYPE_DOUBLE oneof_index:0 default_value:"3.14159265359"},
255 {name:"oneof_string" number:65 label:LABEL_OPTIONAL type:TYPE_STRING oneof_index:0 default_value:"hello, \"world!\"\n"},
256 {name:"oneof_bytes" number:66 label:LABEL_OPTIONAL type:TYPE_BYTES oneof_index:0 default_value:"dead\\336\\255\\276\\357beef"},
257 {name:"oneof_enum" number:67 label:LABEL_OPTIONAL type:TYPE_ENUM oneof_index:0 type_name:".google_golang_org.protobuf.internal.impl_test.AberrantEnum" default_value:"UNKNOWN_0"},
Joe Tsai28e61ba2019-07-01 14:33:20 -0700258 {name:"oneof_message" number:68 label:LABEL_OPTIONAL type:TYPE_MESSAGE oneof_index:0 type_name:".google_golang_org.protobuf.internal.impl_test.AberrantMessage"}
Joe Tsai851185d2019-07-01 13:45:52 -0700259 ]
260 oneof_decl: [{name:"oneof_union"}]
261 extension_range: [{start:10 end:101}]
262 nested_type: [
263 {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}},
264 {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}},
265 {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}},
266 {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}},
267 {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}},
268 {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}},
269 {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}},
270 {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}},
271 {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}},
272 {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}},
273 {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}},
274 {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}},
275 {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}},
276 {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}},
277 {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}},
278 {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:".google_golang_org.protobuf.internal.impl_test.AberrantEnum"}] options:{map_entry:true}},
Joe Tsai28e61ba2019-07-01 14:33:20 -0700279 {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:".google_golang_org.protobuf.internal.impl_test.AberrantMessage"}] options:{map_entry:true}}
Joe Tsai851185d2019-07-01 13:45:52 -0700280 ]
281 `), want); err != nil {
282 t.Fatalf("prototext.Unmarshal() error: %v", err)
283 }
284
285 md := impl.LegacyLoadMessageDesc(reflect.TypeOf(&AberrantMessage{}))
286 got := protodesc.ToDescriptorProto(md)
287 if !proto.Equal(got, want) {
288 t.Errorf("mismatching descriptor:\ngot %v\nwant %v", got, want)
289 }
290}
Joe Tsai32e8a522019-07-02 10:51:24 -0700291
292type AberrantMessage1 struct {
293 M *AberrantMessage2 `protobuf:"bytes,1,opt,name=message"`
294}
295
296type AberrantMessage2 struct {
297 M *AberrantMessage1 `protobuf:"bytes,1,opt,name=message"`
298}
299
300func TestAberrantRace(t *testing.T) {
301 var gotMD1, wantMD1, gotMD2, wantMD2 protoreflect.MessageDescriptor
302
303 var wg sync.WaitGroup
304 wg.Add(2)
305 go func() {
306 defer wg.Done()
307 md := impl.LegacyLoadMessageDesc(reflect.TypeOf(&AberrantMessage1{}))
308 wantMD2 = md.Fields().Get(0).Message()
309 gotMD2 = wantMD2.Fields().Get(0).Message().Fields().Get(0).Message()
310 }()
311 go func() {
312 defer wg.Done()
313 md := impl.LegacyLoadMessageDesc(reflect.TypeOf(&AberrantMessage2{}))
314 wantMD1 = md.Fields().Get(0).Message()
315 gotMD1 = wantMD1.Fields().Get(0).Message().Fields().Get(0).Message()
316 }()
317 wg.Wait()
318
319 if gotMD1 != wantMD1 || gotMD2 != wantMD2 {
320 t.Errorf("mismatching exact message descriptors")
321 }
322}