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 protopack 6*1c12ee1eSDan Willemsen 7*1c12ee1eSDan Willemsenimport ( 8*1c12ee1eSDan Willemsen "bytes" 9*1c12ee1eSDan Willemsen "encoding/hex" 10*1c12ee1eSDan Willemsen "fmt" 11*1c12ee1eSDan Willemsen "math" 12*1c12ee1eSDan Willemsen "testing" 13*1c12ee1eSDan Willemsen 14*1c12ee1eSDan Willemsen "github.com/google/go-cmp/cmp" 15*1c12ee1eSDan Willemsen 16*1c12ee1eSDan Willemsen "google.golang.org/protobuf/encoding/prototext" 17*1c12ee1eSDan Willemsen "google.golang.org/protobuf/reflect/protodesc" 18*1c12ee1eSDan Willemsen "google.golang.org/protobuf/reflect/protoreflect" 19*1c12ee1eSDan Willemsen 20*1c12ee1eSDan Willemsen "google.golang.org/protobuf/types/descriptorpb" 21*1c12ee1eSDan Willemsen) 22*1c12ee1eSDan Willemsen 23*1c12ee1eSDan Willemsenvar msgDesc = func() protoreflect.MessageDescriptor { 24*1c12ee1eSDan Willemsen const s = ` 25*1c12ee1eSDan Willemsen name: "test.proto" 26*1c12ee1eSDan Willemsen syntax: "proto2" 27*1c12ee1eSDan Willemsen message_type: [{ 28*1c12ee1eSDan Willemsen name: "Message" 29*1c12ee1eSDan Willemsen field: [ 30*1c12ee1eSDan Willemsen {name:"f1" number:1 label:LABEL_REPEATED type:TYPE_BOOL options:{packed:true}}, 31*1c12ee1eSDan Willemsen {name:"f2" number:2 label:LABEL_REPEATED type:TYPE_INT64 options:{packed:true}}, 32*1c12ee1eSDan Willemsen {name:"f3" number:3 label:LABEL_REPEATED type:TYPE_SINT64 options:{packed:true}}, 33*1c12ee1eSDan Willemsen {name:"f4" number:4 label:LABEL_REPEATED type:TYPE_UINT64 options:{packed:true}}, 34*1c12ee1eSDan Willemsen {name:"f5" number:5 label:LABEL_REPEATED type:TYPE_FIXED32 options:{packed:true}}, 35*1c12ee1eSDan Willemsen {name:"f6" number:6 label:LABEL_REPEATED type:TYPE_SFIXED32 options:{packed:true}}, 36*1c12ee1eSDan Willemsen {name:"f7" number:7 label:LABEL_REPEATED type:TYPE_FLOAT options:{packed:true}}, 37*1c12ee1eSDan Willemsen {name:"f8" number:8 label:LABEL_REPEATED type:TYPE_FIXED64 options:{packed:true}}, 38*1c12ee1eSDan Willemsen {name:"f9" number:9 label:LABEL_REPEATED type:TYPE_SFIXED64 options:{packed:true}}, 39*1c12ee1eSDan Willemsen {name:"f10" number:10 label:LABEL_REPEATED type:TYPE_DOUBLE options:{packed:true}}, 40*1c12ee1eSDan Willemsen {name:"f11" number:11 label:LABEL_OPTIONAL type:TYPE_STRING}, 41*1c12ee1eSDan Willemsen {name:"f12" number:12 label:LABEL_OPTIONAL type:TYPE_BYTES}, 42*1c12ee1eSDan Willemsen {name:"f13" number:13 label:LABEL_OPTIONAL type:TYPE_MESSAGE type_name:".Message"}, 43*1c12ee1eSDan Willemsen {name:"f14" number:14 label:LABEL_OPTIONAL type:TYPE_GROUP type_name:".Message.F14"} 44*1c12ee1eSDan Willemsen ] 45*1c12ee1eSDan Willemsen nested_type: [{name: "F14"}] 46*1c12ee1eSDan Willemsen }] 47*1c12ee1eSDan Willemsen ` 48*1c12ee1eSDan Willemsen pb := new(descriptorpb.FileDescriptorProto) 49*1c12ee1eSDan Willemsen if err := prototext.Unmarshal([]byte(s), pb); err != nil { 50*1c12ee1eSDan Willemsen panic(err) 51*1c12ee1eSDan Willemsen } 52*1c12ee1eSDan Willemsen fd, err := protodesc.NewFile(pb, nil) 53*1c12ee1eSDan Willemsen if err != nil { 54*1c12ee1eSDan Willemsen panic(err) 55*1c12ee1eSDan Willemsen } 56*1c12ee1eSDan Willemsen return fd.Messages().Get(0) 57*1c12ee1eSDan Willemsen}() 58*1c12ee1eSDan Willemsen 59*1c12ee1eSDan Willemsen// dhex decodes a hex-string and returns the bytes and panics if s is invalid. 60*1c12ee1eSDan Willemsenfunc dhex(s string) []byte { 61*1c12ee1eSDan Willemsen b, err := hex.DecodeString(s) 62*1c12ee1eSDan Willemsen if err != nil { 63*1c12ee1eSDan Willemsen panic(err) 64*1c12ee1eSDan Willemsen } 65*1c12ee1eSDan Willemsen return b 66*1c12ee1eSDan Willemsen} 67*1c12ee1eSDan Willemsen 68*1c12ee1eSDan Willemsenfunc TestPack(t *testing.T) { 69*1c12ee1eSDan Willemsen tests := []struct { 70*1c12ee1eSDan Willemsen raw []byte 71*1c12ee1eSDan Willemsen msg Message 72*1c12ee1eSDan Willemsen msgDesc protoreflect.MessageDescriptor 73*1c12ee1eSDan Willemsen inferMsg bool 74*1c12ee1eSDan Willemsen 75*1c12ee1eSDan Willemsen wantOutCompact string 76*1c12ee1eSDan Willemsen wantOutMulti string 77*1c12ee1eSDan Willemsen wantOutSource string 78*1c12ee1eSDan Willemsen }{{ 79*1c12ee1eSDan Willemsen raw: dhex("080088808080800002088280808080000a09010002828080808000"), 80*1c12ee1eSDan Willemsen msg: Message{ 81*1c12ee1eSDan Willemsen Tag{1, VarintType}, Bool(false), 82*1c12ee1eSDan Willemsen Denormalized{5, Tag{1, VarintType}}, Uvarint(2), 83*1c12ee1eSDan Willemsen Tag{1, VarintType}, Denormalized{5, Uvarint(2)}, 84*1c12ee1eSDan Willemsen Tag{1, BytesType}, LengthPrefix{Bool(true), Bool(false), Uvarint(2), Denormalized{5, Uvarint(2)}}, 85*1c12ee1eSDan Willemsen }, 86*1c12ee1eSDan Willemsen msgDesc: msgDesc, 87*1c12ee1eSDan Willemsen wantOutSource: `protopack.Message{ 88*1c12ee1eSDan Willemsen protopack.Tag{1, protopack.VarintType}, protopack.Bool(false), 89*1c12ee1eSDan Willemsen protopack.Denormalized{+5, protopack.Tag{1, protopack.VarintType}}, protopack.Uvarint(2), 90*1c12ee1eSDan Willemsen protopack.Tag{1, protopack.VarintType}, protopack.Denormalized{+5, protopack.Uvarint(2)}, 91*1c12ee1eSDan Willemsen protopack.Tag{1, protopack.BytesType}, protopack.LengthPrefix{protopack.Bool(true), protopack.Bool(false), protopack.Uvarint(2), protopack.Denormalized{+5, protopack.Uvarint(2)}}, 92*1c12ee1eSDan Willemsen}`, 93*1c12ee1eSDan Willemsen }, { 94*1c12ee1eSDan Willemsen raw: dhex("080088808080800002088280808080000a09010002828080808000"), 95*1c12ee1eSDan Willemsen msg: Message{ 96*1c12ee1eSDan Willemsen Tag{1, VarintType}, Uvarint(0), 97*1c12ee1eSDan Willemsen Denormalized{5, Tag{1, VarintType}}, Uvarint(2), 98*1c12ee1eSDan Willemsen Tag{1, VarintType}, Denormalized{5, Uvarint(2)}, 99*1c12ee1eSDan Willemsen Tag{1, BytesType}, Bytes(Message{Bool(true), Bool(false), Uvarint(2), Denormalized{5, Uvarint(2)}}.Marshal()), 100*1c12ee1eSDan Willemsen }, 101*1c12ee1eSDan Willemsen inferMsg: true, 102*1c12ee1eSDan Willemsen }, { 103*1c12ee1eSDan Willemsen raw: dhex("100010828080808000121980808080808080808001ffffffffffffffff7f828080808000"), 104*1c12ee1eSDan Willemsen msg: Message{ 105*1c12ee1eSDan Willemsen Tag{2, VarintType}, Varint(0), 106*1c12ee1eSDan Willemsen Tag{2, VarintType}, Denormalized{5, Varint(2)}, 107*1c12ee1eSDan Willemsen Tag{2, BytesType}, LengthPrefix{Varint(math.MinInt64), Varint(math.MaxInt64), Denormalized{5, Varint(2)}}, 108*1c12ee1eSDan Willemsen }, 109*1c12ee1eSDan Willemsen msgDesc: msgDesc, 110*1c12ee1eSDan Willemsen wantOutCompact: `Message{Tag{2, Varint}, Varint(0), Tag{2, Varint}, Denormalized{+5, Varint(2)}, Tag{2, Bytes}, LengthPrefix{Varint(-9223372036854775808), Varint(9223372036854775807), Denormalized{+5, Varint(2)}}}`, 111*1c12ee1eSDan Willemsen }, { 112*1c12ee1eSDan Willemsen raw: dhex("1801188180808080001a1affffffffffffffffff01feffffffffffffffff01818080808000"), 113*1c12ee1eSDan Willemsen msg: Message{ 114*1c12ee1eSDan Willemsen Tag{3, VarintType}, Svarint(-1), 115*1c12ee1eSDan Willemsen Tag{3, VarintType}, Denormalized{5, Svarint(-1)}, 116*1c12ee1eSDan Willemsen Tag{3, BytesType}, LengthPrefix{Svarint(math.MinInt64), Svarint(math.MaxInt64), Denormalized{5, Svarint(-1)}}, 117*1c12ee1eSDan Willemsen }, 118*1c12ee1eSDan Willemsen msgDesc: msgDesc, 119*1c12ee1eSDan Willemsen wantOutMulti: `Message{ 120*1c12ee1eSDan Willemsen Tag{3, Varint}, Svarint(-1), 121*1c12ee1eSDan Willemsen Tag{3, Varint}, Denormalized{+5, Svarint(-1)}, 122*1c12ee1eSDan Willemsen Tag{3, Bytes}, LengthPrefix{Svarint(-9223372036854775808), Svarint(9223372036854775807), Denormalized{+5, Svarint(-1)}}, 123*1c12ee1eSDan Willemsen}`, 124*1c12ee1eSDan Willemsen }, { 125*1c12ee1eSDan Willemsen raw: dhex("200120818080808000221100ffffffffffffffffff01818080808000"), 126*1c12ee1eSDan Willemsen msg: Message{ 127*1c12ee1eSDan Willemsen Tag{4, VarintType}, Uvarint(+1), 128*1c12ee1eSDan Willemsen Tag{4, VarintType}, Denormalized{5, Uvarint(+1)}, 129*1c12ee1eSDan Willemsen Tag{4, BytesType}, LengthPrefix{Uvarint(0), Uvarint(math.MaxUint64), Denormalized{5, Uvarint(+1)}}, 130*1c12ee1eSDan Willemsen }, 131*1c12ee1eSDan Willemsen msgDesc: msgDesc, 132*1c12ee1eSDan Willemsen wantOutSource: `protopack.Message{ 133*1c12ee1eSDan Willemsen protopack.Tag{4, protopack.VarintType}, protopack.Uvarint(1), 134*1c12ee1eSDan Willemsen protopack.Tag{4, protopack.VarintType}, protopack.Denormalized{+5, protopack.Uvarint(1)}, 135*1c12ee1eSDan Willemsen protopack.Tag{4, protopack.BytesType}, protopack.LengthPrefix{protopack.Uvarint(0), protopack.Uvarint(18446744073709551615), protopack.Denormalized{+5, protopack.Uvarint(1)}}, 136*1c12ee1eSDan Willemsen}`, 137*1c12ee1eSDan Willemsen }, { 138*1c12ee1eSDan Willemsen raw: dhex("2d010000002a0800000000ffffffff"), 139*1c12ee1eSDan Willemsen msg: Message{ 140*1c12ee1eSDan Willemsen Tag{5, Fixed32Type}, Uint32(+1), 141*1c12ee1eSDan Willemsen Tag{5, BytesType}, LengthPrefix{Uint32(0), Uint32(math.MaxUint32)}, 142*1c12ee1eSDan Willemsen }, 143*1c12ee1eSDan Willemsen msgDesc: msgDesc, 144*1c12ee1eSDan Willemsen wantOutCompact: `Message{Tag{5, Fixed32}, Uint32(1), Tag{5, Bytes}, LengthPrefix{Uint32(0), Uint32(4294967295)}}`, 145*1c12ee1eSDan Willemsen }, { 146*1c12ee1eSDan Willemsen raw: dhex("35ffffffff320800000080ffffff7f"), 147*1c12ee1eSDan Willemsen msg: Message{ 148*1c12ee1eSDan Willemsen Tag{6, Fixed32Type}, Int32(-1), 149*1c12ee1eSDan Willemsen Tag{6, BytesType}, LengthPrefix{Int32(math.MinInt32), Int32(math.MaxInt32)}, 150*1c12ee1eSDan Willemsen }, 151*1c12ee1eSDan Willemsen msgDesc: msgDesc, 152*1c12ee1eSDan Willemsen wantOutMulti: `Message{ 153*1c12ee1eSDan Willemsen Tag{6, Fixed32}, Int32(-1), 154*1c12ee1eSDan Willemsen Tag{6, Bytes}, LengthPrefix{Int32(-2147483648), Int32(2147483647)}, 155*1c12ee1eSDan Willemsen}`, 156*1c12ee1eSDan Willemsen }, { 157*1c12ee1eSDan Willemsen raw: dhex("3ddb0f49403a1001000000ffff7f7f0000807f000080ff"), 158*1c12ee1eSDan Willemsen msg: Message{ 159*1c12ee1eSDan Willemsen Tag{7, Fixed32Type}, Float32(math.Pi), 160*1c12ee1eSDan Willemsen Tag{7, BytesType}, LengthPrefix{Float32(math.SmallestNonzeroFloat32), Float32(math.MaxFloat32), Float32(math.Inf(+1)), Float32(math.Inf(-1))}, 161*1c12ee1eSDan Willemsen }, 162*1c12ee1eSDan Willemsen msgDesc: msgDesc, 163*1c12ee1eSDan Willemsen wantOutSource: `protopack.Message{ 164*1c12ee1eSDan Willemsen protopack.Tag{7, protopack.Fixed32Type}, protopack.Float32(3.1415927), 165*1c12ee1eSDan Willemsen protopack.Tag{7, protopack.BytesType}, protopack.LengthPrefix{protopack.Float32(1e-45), protopack.Float32(3.4028235e+38), protopack.Float32(math.Inf(+1)), protopack.Float32(math.Inf(-1))}, 166*1c12ee1eSDan Willemsen}`, 167*1c12ee1eSDan Willemsen }, { 168*1c12ee1eSDan Willemsen raw: dhex("41010000000000000042100000000000000000ffffffffffffffff"), 169*1c12ee1eSDan Willemsen msg: Message{ 170*1c12ee1eSDan Willemsen Tag{8, Fixed64Type}, Uint64(+1), 171*1c12ee1eSDan Willemsen Tag{8, BytesType}, LengthPrefix{Uint64(0), Uint64(math.MaxUint64)}, 172*1c12ee1eSDan Willemsen }, 173*1c12ee1eSDan Willemsen msgDesc: msgDesc, 174*1c12ee1eSDan Willemsen wantOutCompact: `Message{Tag{8, Fixed64}, Uint64(1), Tag{8, Bytes}, LengthPrefix{Uint64(0), Uint64(18446744073709551615)}}`, 175*1c12ee1eSDan Willemsen }, { 176*1c12ee1eSDan Willemsen raw: dhex("49ffffffffffffffff4a100000000000000080ffffffffffffff7f"), 177*1c12ee1eSDan Willemsen msg: Message{ 178*1c12ee1eSDan Willemsen Tag{9, Fixed64Type}, Int64(-1), 179*1c12ee1eSDan Willemsen Tag{9, BytesType}, LengthPrefix{Int64(math.MinInt64), Int64(math.MaxInt64)}, 180*1c12ee1eSDan Willemsen }, 181*1c12ee1eSDan Willemsen msgDesc: msgDesc, 182*1c12ee1eSDan Willemsen wantOutMulti: `Message{ 183*1c12ee1eSDan Willemsen Tag{9, Fixed64}, Int64(-1), 184*1c12ee1eSDan Willemsen Tag{9, Bytes}, LengthPrefix{Int64(-9223372036854775808), Int64(9223372036854775807)}, 185*1c12ee1eSDan Willemsen}`, 186*1c12ee1eSDan Willemsen }, { 187*1c12ee1eSDan Willemsen raw: dhex("51182d4454fb21094052200100000000000000ffffffffffffef7f000000000000f07f000000000000f0ff"), 188*1c12ee1eSDan Willemsen msg: Message{ 189*1c12ee1eSDan Willemsen Tag{10, Fixed64Type}, Float64(math.Pi), 190*1c12ee1eSDan Willemsen Tag{10, BytesType}, LengthPrefix{Float64(math.SmallestNonzeroFloat64), Float64(math.MaxFloat64), Float64(math.Inf(+1)), Float64(math.Inf(-1))}, 191*1c12ee1eSDan Willemsen }, 192*1c12ee1eSDan Willemsen msgDesc: msgDesc, 193*1c12ee1eSDan Willemsen wantOutMulti: `Message{ 194*1c12ee1eSDan Willemsen Tag{10, Fixed64}, Float64(3.141592653589793), 195*1c12ee1eSDan Willemsen Tag{10, Bytes}, LengthPrefix{Float64(5e-324), Float64(1.7976931348623157e+308), Float64(+Inf), Float64(-Inf)}, 196*1c12ee1eSDan Willemsen}`, 197*1c12ee1eSDan Willemsen }, { 198*1c12ee1eSDan Willemsen raw: dhex("5a06737472696e675a868080808000737472696e67"), 199*1c12ee1eSDan Willemsen msg: Message{ 200*1c12ee1eSDan Willemsen Tag{11, BytesType}, String("string"), 201*1c12ee1eSDan Willemsen Tag{11, BytesType}, Denormalized{+5, String("string")}, 202*1c12ee1eSDan Willemsen }, 203*1c12ee1eSDan Willemsen msgDesc: msgDesc, 204*1c12ee1eSDan Willemsen wantOutCompact: `Message{Tag{11, Bytes}, String("string"), Tag{11, Bytes}, Denormalized{+5, String("string")}}`, 205*1c12ee1eSDan Willemsen }, { 206*1c12ee1eSDan Willemsen raw: dhex("62056279746573628580808080006279746573"), 207*1c12ee1eSDan Willemsen msg: Message{ 208*1c12ee1eSDan Willemsen Tag{12, BytesType}, Bytes("bytes"), 209*1c12ee1eSDan Willemsen Tag{12, BytesType}, Denormalized{+5, Bytes("bytes")}, 210*1c12ee1eSDan Willemsen }, 211*1c12ee1eSDan Willemsen msgDesc: msgDesc, 212*1c12ee1eSDan Willemsen wantOutMulti: `Message{ 213*1c12ee1eSDan Willemsen Tag{12, Bytes}, Bytes("bytes"), 214*1c12ee1eSDan Willemsen Tag{12, Bytes}, Denormalized{+5, Bytes("bytes")}, 215*1c12ee1eSDan Willemsen}`, 216*1c12ee1eSDan Willemsen }, { 217*1c12ee1eSDan Willemsen raw: dhex("6a28a006ffffffffffffffffff01a506ffffffffa106ffffffffffffffffa206056279746573a306a406"), 218*1c12ee1eSDan Willemsen msg: Message{ 219*1c12ee1eSDan Willemsen Tag{13, BytesType}, LengthPrefix(Message{ 220*1c12ee1eSDan Willemsen Tag{100, VarintType}, Uvarint(math.MaxUint64), 221*1c12ee1eSDan Willemsen Tag{100, Fixed32Type}, Uint32(math.MaxUint32), 222*1c12ee1eSDan Willemsen Tag{100, Fixed64Type}, Uint64(math.MaxUint64), 223*1c12ee1eSDan Willemsen Tag{100, BytesType}, Bytes("bytes"), 224*1c12ee1eSDan Willemsen Tag{100, StartGroupType}, Tag{100, EndGroupType}, 225*1c12ee1eSDan Willemsen }), 226*1c12ee1eSDan Willemsen }, 227*1c12ee1eSDan Willemsen msgDesc: msgDesc, 228*1c12ee1eSDan Willemsen wantOutSource: `protopack.Message{ 229*1c12ee1eSDan Willemsen protopack.Tag{13, protopack.BytesType}, protopack.LengthPrefix(protopack.Message{ 230*1c12ee1eSDan Willemsen protopack.Tag{100, protopack.VarintType}, protopack.Uvarint(18446744073709551615), 231*1c12ee1eSDan Willemsen protopack.Tag{100, protopack.Fixed32Type}, protopack.Uint32(4294967295), 232*1c12ee1eSDan Willemsen protopack.Tag{100, protopack.Fixed64Type}, protopack.Uint64(18446744073709551615), 233*1c12ee1eSDan Willemsen protopack.Tag{100, protopack.BytesType}, protopack.Bytes("bytes"), 234*1c12ee1eSDan Willemsen protopack.Tag{100, protopack.StartGroupType}, 235*1c12ee1eSDan Willemsen protopack.Tag{100, protopack.EndGroupType}, 236*1c12ee1eSDan Willemsen }), 237*1c12ee1eSDan Willemsen}`, 238*1c12ee1eSDan Willemsen }, { 239*1c12ee1eSDan Willemsen raw: dhex("6a28a006ffffffffffffffffff01a506ffffffffa106ffffffffffffffffa206056279746573a306a406"), 240*1c12ee1eSDan Willemsen msg: Message{ 241*1c12ee1eSDan Willemsen Tag{13, BytesType}, LengthPrefix(Message{ 242*1c12ee1eSDan Willemsen Tag{100, VarintType}, Uvarint(math.MaxUint64), 243*1c12ee1eSDan Willemsen Tag{100, Fixed32Type}, Uint32(math.MaxUint32), 244*1c12ee1eSDan Willemsen Tag{100, Fixed64Type}, Uint64(math.MaxUint64), 245*1c12ee1eSDan Willemsen Tag{100, BytesType}, Bytes("bytes"), 246*1c12ee1eSDan Willemsen Tag{100, StartGroupType}, Tag{100, EndGroupType}, 247*1c12ee1eSDan Willemsen }), 248*1c12ee1eSDan Willemsen }, 249*1c12ee1eSDan Willemsen inferMsg: true, 250*1c12ee1eSDan Willemsen }, { 251*1c12ee1eSDan Willemsen raw: dhex("6a28a006ffffffffffffffffff01a506ffffffffa106ffffffffffffffffa206056279746573a306ac06"), 252*1c12ee1eSDan Willemsen msg: Message{ 253*1c12ee1eSDan Willemsen Tag{13, BytesType}, Bytes(Message{ 254*1c12ee1eSDan Willemsen Tag{100, VarintType}, Uvarint(math.MaxUint64), 255*1c12ee1eSDan Willemsen Tag{100, Fixed32Type}, Uint32(math.MaxUint32), 256*1c12ee1eSDan Willemsen Tag{100, Fixed64Type}, Uint64(math.MaxUint64), 257*1c12ee1eSDan Willemsen Tag{100, BytesType}, Bytes("bytes"), 258*1c12ee1eSDan Willemsen Tag{100, StartGroupType}, Tag{101, EndGroupType}, 259*1c12ee1eSDan Willemsen }.Marshal()), 260*1c12ee1eSDan Willemsen }, 261*1c12ee1eSDan Willemsen inferMsg: true, 262*1c12ee1eSDan Willemsen }, { 263*1c12ee1eSDan Willemsen raw: dhex("6aa88080808000a006ffffffffffffffffff01a506ffffffffa106ffffffffffffffffa206056279746573a306a406"), 264*1c12ee1eSDan Willemsen msg: Message{ 265*1c12ee1eSDan Willemsen Tag{13, BytesType}, Denormalized{5, LengthPrefix(Message{ 266*1c12ee1eSDan Willemsen Tag{100, VarintType}, Uvarint(math.MaxUint64), 267*1c12ee1eSDan Willemsen Tag{100, Fixed32Type}, Uint32(math.MaxUint32), 268*1c12ee1eSDan Willemsen Tag{100, Fixed64Type}, Uint64(math.MaxUint64), 269*1c12ee1eSDan Willemsen Tag{100, BytesType}, Bytes("bytes"), 270*1c12ee1eSDan Willemsen Tag{100, StartGroupType}, Tag{100, EndGroupType}, 271*1c12ee1eSDan Willemsen })}, 272*1c12ee1eSDan Willemsen }, 273*1c12ee1eSDan Willemsen msgDesc: msgDesc, 274*1c12ee1eSDan Willemsen wantOutCompact: `Message{Tag{13, Bytes}, Denormalized{+5, LengthPrefix(Message{Tag{100, Varint}, Uvarint(18446744073709551615), Tag{100, Fixed32}, Uint32(4294967295), Tag{100, Fixed64}, Uint64(18446744073709551615), Tag{100, Bytes}, Bytes("bytes"), Tag{100, StartGroup}, Tag{100, EndGroup}})}}`, 275*1c12ee1eSDan Willemsen }, { 276*1c12ee1eSDan Willemsen raw: dhex("73a006ffffffffffffffffff01a506ffffffffa106ffffffffffffffffa206056279746573a306a40674"), 277*1c12ee1eSDan Willemsen msg: Message{ 278*1c12ee1eSDan Willemsen Tag{14, StartGroupType}, Message{ 279*1c12ee1eSDan Willemsen Tag{100, VarintType}, Uvarint(math.MaxUint64), 280*1c12ee1eSDan Willemsen Tag{100, Fixed32Type}, Uint32(math.MaxUint32), 281*1c12ee1eSDan Willemsen Tag{100, Fixed64Type}, Uint64(math.MaxUint64), 282*1c12ee1eSDan Willemsen Tag{100, BytesType}, Bytes("bytes"), 283*1c12ee1eSDan Willemsen Tag{100, StartGroupType}, Tag{100, EndGroupType}, 284*1c12ee1eSDan Willemsen }, 285*1c12ee1eSDan Willemsen Tag{14, EndGroupType}, 286*1c12ee1eSDan Willemsen }, 287*1c12ee1eSDan Willemsen msgDesc: msgDesc, 288*1c12ee1eSDan Willemsen wantOutMulti: `Message{ 289*1c12ee1eSDan Willemsen Tag{14, StartGroup}, 290*1c12ee1eSDan Willemsen Message{ 291*1c12ee1eSDan Willemsen Tag{100, Varint}, Uvarint(18446744073709551615), 292*1c12ee1eSDan Willemsen Tag{100, Fixed32}, Uint32(4294967295), 293*1c12ee1eSDan Willemsen Tag{100, Fixed64}, Uint64(18446744073709551615), 294*1c12ee1eSDan Willemsen Tag{100, Bytes}, Bytes("bytes"), 295*1c12ee1eSDan Willemsen Tag{100, StartGroup}, 296*1c12ee1eSDan Willemsen Tag{100, EndGroup}, 297*1c12ee1eSDan Willemsen }, 298*1c12ee1eSDan Willemsen Tag{14, EndGroup}, 299*1c12ee1eSDan Willemsen}`, 300*1c12ee1eSDan Willemsen }, { 301*1c12ee1eSDan Willemsen raw: dhex("d0faa972cd02a5f09051c2d8aa0d6a26a89c311eddef024b423c0f6f47b64227a1600db56e3f73d4113096c9a88e2b99f2d847516853d76a1a6e9811c85a2ab3"), 302*1c12ee1eSDan Willemsen msg: Message{ 303*1c12ee1eSDan Willemsen Tag{29970346, VarintType}, Uvarint(333), 304*1c12ee1eSDan Willemsen Tag{21268228, Fixed32Type}, Uint32(229300418), 305*1c12ee1eSDan Willemsen Tag{13, BytesType}, LengthPrefix(Message{ 306*1c12ee1eSDan Willemsen Tag{100805, VarintType}, Uvarint(30), 307*1c12ee1eSDan Willemsen Tag{5883, Fixed32Type}, Uint32(255607371), 308*1c12ee1eSDan Willemsen Tag{13, Type(7)}, 309*1c12ee1eSDan Willemsen Raw("G\xb6B'\xa1`\r\xb5n?s\xd4\x110\x96ɨ\x8e+\x99\xf2\xd8GQhS"), 310*1c12ee1eSDan Willemsen }), 311*1c12ee1eSDan Willemsen Tag{1706, Type(7)}, 312*1c12ee1eSDan Willemsen Raw("\x1an\x98\x11\xc8Z*\xb3"), 313*1c12ee1eSDan Willemsen }, 314*1c12ee1eSDan Willemsen msgDesc: msgDesc, 315*1c12ee1eSDan Willemsen }, { 316*1c12ee1eSDan Willemsen raw: dhex("3d08d0e57f"), 317*1c12ee1eSDan Willemsen msg: Message{ 318*1c12ee1eSDan Willemsen Tag{7, Fixed32Type}, Float32(math.Float32frombits( 319*1c12ee1eSDan Willemsen // TODO: Remove workaround for compiler bug (see https://golang.org/issues/27193). 320*1c12ee1eSDan Willemsen func() uint32 { return 0x7fe5d008 }(), 321*1c12ee1eSDan Willemsen )), 322*1c12ee1eSDan Willemsen }, 323*1c12ee1eSDan Willemsen msgDesc: msgDesc, 324*1c12ee1eSDan Willemsen wantOutSource: `protopack.Message{ 325*1c12ee1eSDan Willemsen protopack.Tag{7, protopack.Fixed32Type}, protopack.Float32(math.Float32frombits(0x7fe5d008)), 326*1c12ee1eSDan Willemsen}`, 327*1c12ee1eSDan Willemsen }, { 328*1c12ee1eSDan Willemsen raw: dhex("51a8d65110771bf97f"), 329*1c12ee1eSDan Willemsen msg: Message{ 330*1c12ee1eSDan Willemsen Tag{10, Fixed64Type}, Float64(math.Float64frombits(0x7ff91b771051d6a8)), 331*1c12ee1eSDan Willemsen }, 332*1c12ee1eSDan Willemsen msgDesc: msgDesc, 333*1c12ee1eSDan Willemsen wantOutSource: `protopack.Message{ 334*1c12ee1eSDan Willemsen protopack.Tag{10, protopack.Fixed64Type}, protopack.Float64(math.Float64frombits(0x7ff91b771051d6a8)), 335*1c12ee1eSDan Willemsen}`, 336*1c12ee1eSDan Willemsen }, { 337*1c12ee1eSDan Willemsen raw: dhex("ab2c14481ab3e9a76d937fb4dd5e6c616ef311f62b7fe888785fca5609ffe81c1064e50dd7a9edb408d317e2891c0d54c719446938d41ab0ccf8e61dc28b0ebb"), 338*1c12ee1eSDan Willemsen msg: Message{ 339*1c12ee1eSDan Willemsen Tag{709, StartGroupType}, 340*1c12ee1eSDan Willemsen Tag{2, EndGroupType}, 341*1c12ee1eSDan Willemsen Tag{9, VarintType}, Uvarint(26), 342*1c12ee1eSDan Willemsen Tag{28655254, StartGroupType}, 343*1c12ee1eSDan Willemsen Message{ 344*1c12ee1eSDan Willemsen Tag{2034, StartGroupType}, 345*1c12ee1eSDan Willemsen Tag{194006, EndGroupType}, 346*1c12ee1eSDan Willemsen }, 347*1c12ee1eSDan Willemsen Tag{13, EndGroupType}, 348*1c12ee1eSDan Willemsen Tag{12, Fixed64Type}, Uint64(9865274810543764334), 349*1c12ee1eSDan Willemsen Tag{15, VarintType}, Uvarint(95), 350*1c12ee1eSDan Willemsen Tag{1385, BytesType}, Bytes("\xff\xe8\x1c\x10d\xe5\rש"), 351*1c12ee1eSDan Willemsen Tag{17229, Fixed32Type}, Uint32(2313295827), 352*1c12ee1eSDan Willemsen Tag{3, EndGroupType}, 353*1c12ee1eSDan Willemsen Tag{1, Fixed32Type}, Uint32(1142540116), 354*1c12ee1eSDan Willemsen Tag{13, Fixed64Type}, Uint64(2154683029754926136), 355*1c12ee1eSDan Willemsen Tag{28856, BytesType}, 356*1c12ee1eSDan Willemsen Raw("\xbb"), 357*1c12ee1eSDan Willemsen }, 358*1c12ee1eSDan Willemsen msgDesc: msgDesc, 359*1c12ee1eSDan Willemsen }, { 360*1c12ee1eSDan Willemsen raw: dhex("29baa4ac1c1e0a20183393bac434b8d3559337ec940050038770eaa9937f98e4"), 361*1c12ee1eSDan Willemsen msg: Message{ 362*1c12ee1eSDan Willemsen Tag{5, Fixed64Type}, Uint64(1738400580611384506), 363*1c12ee1eSDan Willemsen Tag{6, StartGroupType}, 364*1c12ee1eSDan Willemsen Message{ 365*1c12ee1eSDan Willemsen Tag{13771682, StartGroupType}, 366*1c12ee1eSDan Willemsen Message{ 367*1c12ee1eSDan Willemsen Tag{175415, VarintType}, Uvarint(7059), 368*1c12ee1eSDan Willemsen }, 369*1c12ee1eSDan Willemsen Denormalized{+1, Tag{333, EndGroupType}}, 370*1c12ee1eSDan Willemsen Tag{10, VarintType}, Uvarint(3), 371*1c12ee1eSDan Willemsen Tag{1792, Type(7)}, 372*1c12ee1eSDan Willemsen Raw("꩓\u007f\x98\xe4"), 373*1c12ee1eSDan Willemsen }, 374*1c12ee1eSDan Willemsen }, 375*1c12ee1eSDan Willemsen msgDesc: msgDesc, 376*1c12ee1eSDan Willemsen }} 377*1c12ee1eSDan Willemsen 378*1c12ee1eSDan Willemsen equateFloatBits := cmp.Options{ 379*1c12ee1eSDan Willemsen cmp.Comparer(func(x, y Float32) bool { 380*1c12ee1eSDan Willemsen return math.Float32bits(float32(x)) == math.Float32bits(float32(y)) 381*1c12ee1eSDan Willemsen }), 382*1c12ee1eSDan Willemsen cmp.Comparer(func(x, y Float64) bool { 383*1c12ee1eSDan Willemsen return math.Float64bits(float64(x)) == math.Float64bits(float64(y)) 384*1c12ee1eSDan Willemsen }), 385*1c12ee1eSDan Willemsen } 386*1c12ee1eSDan Willemsen for _, tt := range tests { 387*1c12ee1eSDan Willemsen t.Run("", func(t *testing.T) { 388*1c12ee1eSDan Willemsen var msg Message 389*1c12ee1eSDan Willemsen raw := tt.msg.Marshal() 390*1c12ee1eSDan Willemsen msg.unmarshal(tt.raw, tt.msgDesc, tt.inferMsg) 391*1c12ee1eSDan Willemsen 392*1c12ee1eSDan Willemsen if !bytes.Equal(raw, tt.raw) { 393*1c12ee1eSDan Willemsen t.Errorf("Marshal() mismatch:\ngot %x\nwant %x", raw, tt.raw) 394*1c12ee1eSDan Willemsen } 395*1c12ee1eSDan Willemsen if diff := cmp.Diff(tt.msg, msg, equateFloatBits); diff != "" { 396*1c12ee1eSDan Willemsen t.Errorf("Unmarshal() mismatch (-want +got):\n%s", diff) 397*1c12ee1eSDan Willemsen } 398*1c12ee1eSDan Willemsen if got, want := tt.msg.Size(), len(tt.raw); got != want { 399*1c12ee1eSDan Willemsen t.Errorf("Size() = %v, want %v", got, want) 400*1c12ee1eSDan Willemsen } 401*1c12ee1eSDan Willemsen if tt.wantOutCompact != "" { 402*1c12ee1eSDan Willemsen gotOut := fmt.Sprintf("%v", tt.msg) 403*1c12ee1eSDan Willemsen if string(gotOut) != tt.wantOutCompact { 404*1c12ee1eSDan Willemsen t.Errorf("fmt.Sprintf(%q, msg):\ngot: %s\nwant: %s", "%v", gotOut, tt.wantOutCompact) 405*1c12ee1eSDan Willemsen } 406*1c12ee1eSDan Willemsen } 407*1c12ee1eSDan Willemsen if tt.wantOutMulti != "" { 408*1c12ee1eSDan Willemsen gotOut := fmt.Sprintf("%+v", tt.msg) 409*1c12ee1eSDan Willemsen if string(gotOut) != tt.wantOutMulti { 410*1c12ee1eSDan Willemsen t.Errorf("fmt.Sprintf(%q, msg):\ngot: %s\nwant: %s", "%+v", gotOut, tt.wantOutMulti) 411*1c12ee1eSDan Willemsen } 412*1c12ee1eSDan Willemsen } 413*1c12ee1eSDan Willemsen if tt.wantOutSource != "" { 414*1c12ee1eSDan Willemsen gotOut := fmt.Sprintf("%#v", tt.msg) 415*1c12ee1eSDan Willemsen if string(gotOut) != tt.wantOutSource { 416*1c12ee1eSDan Willemsen t.Errorf("fmt.Sprintf(%q, msg):\ngot: %s\nwant: %s", "%#v", gotOut, tt.wantOutSource) 417*1c12ee1eSDan Willemsen } 418*1c12ee1eSDan Willemsen } 419*1c12ee1eSDan Willemsen }) 420*1c12ee1eSDan Willemsen } 421*1c12ee1eSDan Willemsen} 422