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