blob: 2d7b7de4393c57ce685374db88c76f7ab72d9d57 [file] [log] [blame]
Herbie Ongcddf8192018-11-28 18:25:20 -08001// Copyright 2018 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 textpb_test
6
7import (
Herbie Onga94f78c2019-01-03 15:39:58 -08008 "encoding/hex"
Herbie Ongcddf8192018-11-28 18:25:20 -08009 "math"
10 "strings"
11 "testing"
12
Herbie Ongcf253082018-12-17 17:13:07 -080013 "github.com/golang/protobuf/protoapi"
Herbie Ongcddf8192018-11-28 18:25:20 -080014 "github.com/golang/protobuf/v2/encoding/textpb"
Herbie Ongcddf8192018-11-28 18:25:20 -080015 "github.com/golang/protobuf/v2/internal/detrand"
Herbie Ong20a1d312018-12-11 21:08:58 -080016 "github.com/golang/protobuf/v2/internal/encoding/pack"
Herbie Ongcf253082018-12-17 17:13:07 -080017 "github.com/golang/protobuf/v2/internal/encoding/wire"
Herbie Ongcddf8192018-11-28 18:25:20 -080018 "github.com/golang/protobuf/v2/internal/scalar"
19 "github.com/golang/protobuf/v2/proto"
Herbie Ongf42b55f2019-01-02 15:46:07 -080020 preg "github.com/golang/protobuf/v2/reflect/protoregistry"
Herbie Ongcddf8192018-11-28 18:25:20 -080021 "github.com/google/go-cmp/cmp"
22 "github.com/google/go-cmp/cmp/cmpopts"
23
Herbie Ong8170d692019-02-13 14:13:21 -080024 "github.com/golang/protobuf/v2/encoding/testprotos/pb2"
25 "github.com/golang/protobuf/v2/encoding/testprotos/pb3"
Joe Tsai19058432019-02-27 21:46:29 -080026 knownpb "github.com/golang/protobuf/v2/types/known"
Herbie Ongcddf8192018-11-28 18:25:20 -080027)
28
29func init() {
30 // Disable detrand to enable direct comparisons on outputs.
31 detrand.Disable()
32}
33
Herbie Ongcddf8192018-11-28 18:25:20 -080034// splitLines is a cmpopts.Option for comparing strings with line breaks.
35var splitLines = cmpopts.AcyclicTransformer("SplitLines", func(s string) []string {
36 return strings.Split(s, "\n")
37})
38
Herbie Ong800c9902018-12-06 15:28:53 -080039func pb2Enum(i int32) *pb2.Enum {
40 p := new(pb2.Enum)
41 *p = pb2.Enum(i)
42 return p
43}
44
45func pb2Enums_NestedEnum(i int32) *pb2.Enums_NestedEnum {
46 p := new(pb2.Enums_NestedEnum)
47 *p = pb2.Enums_NestedEnum(i)
48 return p
49}
50
Herbie Ongcf253082018-12-17 17:13:07 -080051func setExtension(m proto.Message, xd *protoapi.ExtensionDesc, val interface{}) {
Herbie Ongcf253082018-12-17 17:13:07 -080052 knownFields := m.ProtoReflect().KnownFields()
53 extTypes := knownFields.ExtensionTypes()
Joe Tsaiafb455e2019-03-14 16:08:22 -070054 extTypes.Register(xd.Type)
Herbie Ongcf253082018-12-17 17:13:07 -080055 if val == nil {
56 return
57 }
Joe Tsaiafb455e2019-03-14 16:08:22 -070058 pval := xd.Type.ValueOf(val)
Herbie Ongcf253082018-12-17 17:13:07 -080059 knownFields.Set(wire.Number(xd.Field), pval)
60}
61
Herbie Onga94f78c2019-01-03 15:39:58 -080062// dhex decodes a hex-string and returns the bytes and panics if s is invalid.
63func dhex(s string) []byte {
64 b, err := hex.DecodeString(s)
65 if err != nil {
66 panic(err)
67 }
68 return b
69}
70
Herbie Ongcddf8192018-11-28 18:25:20 -080071func TestMarshal(t *testing.T) {
72 tests := []struct {
73 desc string
Herbie Ongf42b55f2019-01-02 15:46:07 -080074 mo textpb.MarshalOptions
Herbie Ong70651952018-12-13 14:19:50 -080075 input proto.Message
Herbie Ongcddf8192018-11-28 18:25:20 -080076 want string
Herbie Ong300cff02019-03-20 18:05:16 -070077 wantErr bool // TODO: Verify error message content.
Herbie Ongcddf8192018-11-28 18:25:20 -080078 }{{
Herbie Ong8170d692019-02-13 14:13:21 -080079 desc: "proto2 optional scalars not set",
Herbie Ong800c9902018-12-06 15:28:53 -080080 input: &pb2.Scalars{},
Herbie Ongcddf8192018-11-28 18:25:20 -080081 want: "\n",
82 }, {
Herbie Ong8170d692019-02-13 14:13:21 -080083 desc: "proto3 scalars not set",
Herbie Ong800c9902018-12-06 15:28:53 -080084 input: &pb3.Scalars{},
Herbie Ongcddf8192018-11-28 18:25:20 -080085 want: "\n",
86 }, {
Herbie Ong8170d692019-02-13 14:13:21 -080087 desc: "proto2 optional scalars set to zero values",
Herbie Ong800c9902018-12-06 15:28:53 -080088 input: &pb2.Scalars{
Herbie Ongcddf8192018-11-28 18:25:20 -080089 OptBool: scalar.Bool(false),
90 OptInt32: scalar.Int32(0),
91 OptInt64: scalar.Int64(0),
92 OptUint32: scalar.Uint32(0),
93 OptUint64: scalar.Uint64(0),
94 OptSint32: scalar.Int32(0),
95 OptSint64: scalar.Int64(0),
96 OptFixed32: scalar.Uint32(0),
97 OptFixed64: scalar.Uint64(0),
98 OptSfixed32: scalar.Int32(0),
99 OptSfixed64: scalar.Int64(0),
100 OptFloat: scalar.Float32(0),
101 OptDouble: scalar.Float64(0),
102 OptBytes: []byte{},
103 OptString: scalar.String(""),
Herbie Ong800c9902018-12-06 15:28:53 -0800104 },
Herbie Ongcddf8192018-11-28 18:25:20 -0800105 want: `opt_bool: false
106opt_int32: 0
107opt_int64: 0
108opt_uint32: 0
109opt_uint64: 0
110opt_sint32: 0
111opt_sint64: 0
112opt_fixed32: 0
113opt_fixed64: 0
114opt_sfixed32: 0
115opt_sfixed64: 0
116opt_float: 0
117opt_double: 0
118opt_bytes: ""
119opt_string: ""
120`,
121 }, {
Herbie Ong8170d692019-02-13 14:13:21 -0800122 desc: "proto3 scalars set to zero values",
Herbie Ong800c9902018-12-06 15:28:53 -0800123 input: &pb3.Scalars{
Herbie Ongcddf8192018-11-28 18:25:20 -0800124 SBool: false,
125 SInt32: 0,
126 SInt64: 0,
127 SUint32: 0,
128 SUint64: 0,
129 SSint32: 0,
130 SSint64: 0,
131 SFixed32: 0,
132 SFixed64: 0,
133 SSfixed32: 0,
134 SSfixed64: 0,
135 SFloat: 0,
136 SDouble: 0,
137 SBytes: []byte{},
138 SString: "",
Herbie Ong800c9902018-12-06 15:28:53 -0800139 },
Herbie Ongcddf8192018-11-28 18:25:20 -0800140 want: "\n",
141 }, {
Herbie Ong8170d692019-02-13 14:13:21 -0800142 desc: "proto2 optional scalars set to some values",
Herbie Ong800c9902018-12-06 15:28:53 -0800143 input: &pb2.Scalars{
Herbie Ongcddf8192018-11-28 18:25:20 -0800144 OptBool: scalar.Bool(true),
145 OptInt32: scalar.Int32(0xff),
146 OptInt64: scalar.Int64(0xdeadbeef),
147 OptUint32: scalar.Uint32(47),
148 OptUint64: scalar.Uint64(0xdeadbeef),
149 OptSint32: scalar.Int32(-1001),
150 OptSint64: scalar.Int64(-0xffff),
151 OptFixed64: scalar.Uint64(64),
152 OptSfixed32: scalar.Int32(-32),
Herbie Ong84f09602019-01-17 19:31:47 -0800153 OptFloat: scalar.Float32(1.02),
154 OptDouble: scalar.Float64(1.0199999809265137),
Herbie Ong8170d692019-02-13 14:13:21 -0800155 OptBytes: []byte("\xe8\xb0\xb7\xe6\xad\x8c"),
156 OptString: scalar.String("谷歌"),
Herbie Ong800c9902018-12-06 15:28:53 -0800157 },
Herbie Ongcddf8192018-11-28 18:25:20 -0800158 want: `opt_bool: true
159opt_int32: 255
160opt_int64: 3735928559
161opt_uint32: 47
162opt_uint64: 3735928559
163opt_sint32: -1001
164opt_sint64: -65535
165opt_fixed64: 64
166opt_sfixed32: -32
Herbie Ong84f09602019-01-17 19:31:47 -0800167opt_float: 1.02
168opt_double: 1.0199999809265137
Herbie Ongcddf8192018-11-28 18:25:20 -0800169opt_bytes: "谷歌"
170opt_string: "谷歌"
171`,
172 }, {
Herbie Ong8170d692019-02-13 14:13:21 -0800173 desc: "float nan",
Herbie Ong800c9902018-12-06 15:28:53 -0800174 input: &pb3.Scalars{
Herbie Ongcddf8192018-11-28 18:25:20 -0800175 SFloat: float32(math.NaN()),
Herbie Ong800c9902018-12-06 15:28:53 -0800176 },
Herbie Ongcddf8192018-11-28 18:25:20 -0800177 want: "s_float: nan\n",
178 }, {
Herbie Ong8170d692019-02-13 14:13:21 -0800179 desc: "float positive infinity",
Herbie Ong800c9902018-12-06 15:28:53 -0800180 input: &pb3.Scalars{
Herbie Ongcddf8192018-11-28 18:25:20 -0800181 SFloat: float32(math.Inf(1)),
Herbie Ong800c9902018-12-06 15:28:53 -0800182 },
Herbie Ongcddf8192018-11-28 18:25:20 -0800183 want: "s_float: inf\n",
184 }, {
Herbie Ong8170d692019-02-13 14:13:21 -0800185 desc: "float negative infinity",
Herbie Ong800c9902018-12-06 15:28:53 -0800186 input: &pb3.Scalars{
Herbie Ongcddf8192018-11-28 18:25:20 -0800187 SFloat: float32(math.Inf(-1)),
Herbie Ong800c9902018-12-06 15:28:53 -0800188 },
Herbie Ongcddf8192018-11-28 18:25:20 -0800189 want: "s_float: -inf\n",
190 }, {
Herbie Ong8170d692019-02-13 14:13:21 -0800191 desc: "double nan",
Herbie Ong800c9902018-12-06 15:28:53 -0800192 input: &pb3.Scalars{
Herbie Ongcddf8192018-11-28 18:25:20 -0800193 SDouble: math.NaN(),
Herbie Ong800c9902018-12-06 15:28:53 -0800194 },
Herbie Ongcddf8192018-11-28 18:25:20 -0800195 want: "s_double: nan\n",
196 }, {
Herbie Ong8170d692019-02-13 14:13:21 -0800197 desc: "double positive infinity",
Herbie Ong800c9902018-12-06 15:28:53 -0800198 input: &pb3.Scalars{
Herbie Ongcddf8192018-11-28 18:25:20 -0800199 SDouble: math.Inf(1),
Herbie Ong800c9902018-12-06 15:28:53 -0800200 },
Herbie Ongcddf8192018-11-28 18:25:20 -0800201 want: "s_double: inf\n",
202 }, {
Herbie Ong8170d692019-02-13 14:13:21 -0800203 desc: "double negative infinity",
Herbie Ong800c9902018-12-06 15:28:53 -0800204 input: &pb3.Scalars{
Herbie Ongcddf8192018-11-28 18:25:20 -0800205 SDouble: math.Inf(-1),
Herbie Ong800c9902018-12-06 15:28:53 -0800206 },
Herbie Ongcddf8192018-11-28 18:25:20 -0800207 want: "s_double: -inf\n",
208 }, {
Herbie Ong800c9902018-12-06 15:28:53 -0800209 desc: "proto2 enum not set",
210 input: &pb2.Enums{},
Herbie Ongcddf8192018-11-28 18:25:20 -0800211 want: "\n",
212 }, {
Herbie Ong800c9902018-12-06 15:28:53 -0800213 desc: "proto2 enum set to zero value",
214 input: &pb2.Enums{
Herbie Ong8170d692019-02-13 14:13:21 -0800215 OptEnum: pb2Enum(0),
Herbie Ong800c9902018-12-06 15:28:53 -0800216 OptNestedEnum: pb2Enums_NestedEnum(0),
217 },
Herbie Ong8170d692019-02-13 14:13:21 -0800218 want: `opt_enum: 0
Herbie Ong800c9902018-12-06 15:28:53 -0800219opt_nested_enum: 0
220`,
221 }, {
222 desc: "proto2 enum",
223 input: &pb2.Enums{
Herbie Ong8170d692019-02-13 14:13:21 -0800224 OptEnum: pb2.Enum_ONE.Enum(),
Herbie Ong800c9902018-12-06 15:28:53 -0800225 OptNestedEnum: pb2.Enums_UNO.Enum(),
226 },
Herbie Ong8170d692019-02-13 14:13:21 -0800227 want: `opt_enum: ONE
Herbie Ong800c9902018-12-06 15:28:53 -0800228opt_nested_enum: UNO
229`,
230 }, {
231 desc: "proto2 enum set to numeric values",
232 input: &pb2.Enums{
Herbie Ong8170d692019-02-13 14:13:21 -0800233 OptEnum: pb2Enum(2),
Herbie Ong800c9902018-12-06 15:28:53 -0800234 OptNestedEnum: pb2Enums_NestedEnum(2),
235 },
Herbie Ong8170d692019-02-13 14:13:21 -0800236 want: `opt_enum: TWO
Herbie Ong800c9902018-12-06 15:28:53 -0800237opt_nested_enum: DOS
238`,
239 }, {
240 desc: "proto2 enum set to unnamed numeric values",
241 input: &pb2.Enums{
242 OptEnum: pb2Enum(101),
243 OptNestedEnum: pb2Enums_NestedEnum(-101),
244 },
245 want: `opt_enum: 101
246opt_nested_enum: -101
247`,
248 }, {
249 desc: "proto3 enum not set",
250 input: &pb3.Enums{},
251 want: "\n",
252 }, {
253 desc: "proto3 enum set to zero value",
254 input: &pb3.Enums{
255 SEnum: pb3.Enum_ZERO,
256 SNestedEnum: pb3.Enums_CERO,
257 },
258 want: "\n",
259 }, {
260 desc: "proto3 enum",
261 input: &pb3.Enums{
262 SEnum: pb3.Enum_ONE,
Herbie Ong8170d692019-02-13 14:13:21 -0800263 SNestedEnum: pb3.Enums_UNO,
Herbie Ong800c9902018-12-06 15:28:53 -0800264 },
265 want: `s_enum: ONE
Herbie Ong8170d692019-02-13 14:13:21 -0800266s_nested_enum: UNO
Herbie Ong800c9902018-12-06 15:28:53 -0800267`,
268 }, {
269 desc: "proto3 enum set to numeric values",
270 input: &pb3.Enums{
271 SEnum: 2,
Herbie Ong8170d692019-02-13 14:13:21 -0800272 SNestedEnum: 2,
Herbie Ong800c9902018-12-06 15:28:53 -0800273 },
274 want: `s_enum: TWO
Herbie Ong8170d692019-02-13 14:13:21 -0800275s_nested_enum: DOS
Herbie Ong800c9902018-12-06 15:28:53 -0800276`,
277 }, {
278 desc: "proto3 enum set to unnamed numeric values",
279 input: &pb3.Enums{
280 SEnum: -47,
281 SNestedEnum: 47,
282 },
283 want: `s_enum: -47
284s_nested_enum: 47
285`,
286 }, {
287 desc: "proto2 nested message not set",
288 input: &pb2.Nests{},
289 want: "\n",
290 }, {
291 desc: "proto2 nested message set to empty",
292 input: &pb2.Nests{
293 OptNested: &pb2.Nested{},
294 Optgroup: &pb2.Nests_OptGroup{},
295 },
296 want: `opt_nested: {}
Herbie Ong0dcfb9a2019-01-14 15:32:26 -0800297OptGroup: {}
Herbie Ong800c9902018-12-06 15:28:53 -0800298`,
299 }, {
300 desc: "proto2 nested messages",
301 input: &pb2.Nests{
302 OptNested: &pb2.Nested{
303 OptString: scalar.String("nested message"),
304 OptNested: &pb2.Nested{
305 OptString: scalar.String("another nested message"),
306 },
307 },
308 },
309 want: `opt_nested: {
310 opt_string: "nested message"
311 opt_nested: {
312 opt_string: "another nested message"
313 }
314}
315`,
316 }, {
Herbie Ong8170d692019-02-13 14:13:21 -0800317 desc: "proto2 groups",
Herbie Ong800c9902018-12-06 15:28:53 -0800318 input: &pb2.Nests{
319 Optgroup: &pb2.Nests_OptGroup{
Herbie Ong800c9902018-12-06 15:28:53 -0800320 OptString: scalar.String("inside a group"),
321 OptNested: &pb2.Nested{
322 OptString: scalar.String("nested message inside a group"),
323 },
324 Optnestedgroup: &pb2.Nests_OptGroup_OptNestedGroup{
Herbie Ong8170d692019-02-13 14:13:21 -0800325 OptFixed32: scalar.Uint32(47),
Herbie Ong800c9902018-12-06 15:28:53 -0800326 },
327 },
328 },
Herbie Ong0dcfb9a2019-01-14 15:32:26 -0800329 want: `OptGroup: {
Herbie Ong800c9902018-12-06 15:28:53 -0800330 opt_string: "inside a group"
331 opt_nested: {
332 opt_string: "nested message inside a group"
333 }
Herbie Ong0dcfb9a2019-01-14 15:32:26 -0800334 OptNestedGroup: {
Herbie Ong8170d692019-02-13 14:13:21 -0800335 opt_fixed32: 47
Herbie Ong800c9902018-12-06 15:28:53 -0800336 }
337}
338`,
339 }, {
340 desc: "proto3 nested message not set",
341 input: &pb3.Nests{},
342 want: "\n",
343 }, {
Herbie Ong8170d692019-02-13 14:13:21 -0800344 desc: "proto3 nested message set to empty",
345 input: &pb3.Nests{
346 SNested: &pb3.Nested{},
347 },
348 want: "s_nested: {}\n",
349 }, {
Herbie Ong800c9902018-12-06 15:28:53 -0800350 desc: "proto3 nested message",
351 input: &pb3.Nests{
352 SNested: &pb3.Nested{
353 SString: "nested message",
354 SNested: &pb3.Nested{
355 SString: "another nested message",
356 },
357 },
358 },
359 want: `s_nested: {
360 s_string: "nested message"
361 s_nested: {
362 s_string: "another nested message"
363 }
364}
365`,
366 }, {
Herbie Ong8170d692019-02-13 14:13:21 -0800367 desc: "oneof not set",
368 input: &pb3.Oneofs{},
Herbie Ong800c9902018-12-06 15:28:53 -0800369 want: "\n",
370 }, {
Herbie Ong8170d692019-02-13 14:13:21 -0800371 desc: "oneof set to empty string",
372 input: &pb3.Oneofs{
373 Union: &pb3.Oneofs_OneofString{},
Herbie Ong800c9902018-12-06 15:28:53 -0800374 },
Herbie Ong8170d692019-02-13 14:13:21 -0800375 want: `oneof_string: ""
376`,
Herbie Ong800c9902018-12-06 15:28:53 -0800377 }, {
Herbie Ong8170d692019-02-13 14:13:21 -0800378 desc: "oneof set to string",
379 input: &pb3.Oneofs{
380 Union: &pb3.Oneofs_OneofString{
381 OneofString: "hello",
Herbie Ong800c9902018-12-06 15:28:53 -0800382 },
383 },
Herbie Ong8170d692019-02-13 14:13:21 -0800384 want: `oneof_string: "hello"
385`,
Herbie Ong800c9902018-12-06 15:28:53 -0800386 }, {
Herbie Ong8170d692019-02-13 14:13:21 -0800387 desc: "oneof set to enum",
388 input: &pb3.Oneofs{
389 Union: &pb3.Oneofs_OneofEnum{
390 OneofEnum: pb3.Enum_ZERO,
Herbie Ong800c9902018-12-06 15:28:53 -0800391 },
392 },
Herbie Ong8170d692019-02-13 14:13:21 -0800393 want: `oneof_enum: ZERO
394`,
Herbie Ong800c9902018-12-06 15:28:53 -0800395 }, {
Herbie Ong8170d692019-02-13 14:13:21 -0800396 desc: "oneof set to empty message",
397 input: &pb3.Oneofs{
398 Union: &pb3.Oneofs_OneofNested{
399 OneofNested: &pb3.Nested{},
400 },
401 },
402 want: "oneof_nested: {}\n",
403 }, {
404 desc: "oneof set to message",
405 input: &pb3.Oneofs{
406 Union: &pb3.Oneofs_OneofNested{
407 OneofNested: &pb3.Nested{
408 SString: "nested message",
Herbie Ong800c9902018-12-06 15:28:53 -0800409 },
410 },
411 },
Herbie Ong8170d692019-02-13 14:13:21 -0800412 want: `oneof_nested: {
413 s_string: "nested message"
Herbie Ong800c9902018-12-06 15:28:53 -0800414}
415`,
416 }, {
Herbie Ong8170d692019-02-13 14:13:21 -0800417 desc: "repeated fields not set",
Herbie Ong800c9902018-12-06 15:28:53 -0800418 input: &pb2.Repeats{},
419 want: "\n",
420 }, {
Herbie Ong8170d692019-02-13 14:13:21 -0800421 desc: "repeated fields set to empty slices",
Herbie Ong800c9902018-12-06 15:28:53 -0800422 input: &pb2.Repeats{
Herbie Ongcddf8192018-11-28 18:25:20 -0800423 RptBool: []bool{},
424 RptInt32: []int32{},
425 RptInt64: []int64{},
426 RptUint32: []uint32{},
427 RptUint64: []uint64{},
428 RptFloat: []float32{},
429 RptDouble: []float64{},
430 RptBytes: [][]byte{},
Herbie Ong800c9902018-12-06 15:28:53 -0800431 },
Herbie Ongcddf8192018-11-28 18:25:20 -0800432 want: "\n",
433 }, {
Herbie Ong8170d692019-02-13 14:13:21 -0800434 desc: "repeated fields set to some values",
Herbie Ong800c9902018-12-06 15:28:53 -0800435 input: &pb2.Repeats{
Herbie Ongcddf8192018-11-28 18:25:20 -0800436 RptBool: []bool{true, false, true, true},
437 RptInt32: []int32{1, 6, 0, 0},
438 RptInt64: []int64{-64, 47},
439 RptUint32: []uint32{0xff, 0xffff},
440 RptUint64: []uint64{0xdeadbeef},
Herbie Ong84f09602019-01-17 19:31:47 -0800441 RptFloat: []float32{float32(math.NaN()), float32(math.Inf(1)), float32(math.Inf(-1)), 1.034},
Herbie Ongcddf8192018-11-28 18:25:20 -0800442 RptDouble: []float64{math.NaN(), math.Inf(1), math.Inf(-1), 1.23e-308},
443 RptString: []string{"hello", "世界"},
444 RptBytes: [][]byte{
445 []byte("hello"),
446 []byte("\xe4\xb8\x96\xe7\x95\x8c"),
447 },
Herbie Ong800c9902018-12-06 15:28:53 -0800448 },
Herbie Ongcddf8192018-11-28 18:25:20 -0800449 want: `rpt_bool: true
450rpt_bool: false
451rpt_bool: true
452rpt_bool: true
453rpt_int32: 1
454rpt_int32: 6
455rpt_int32: 0
456rpt_int32: 0
457rpt_int64: -64
458rpt_int64: 47
459rpt_uint32: 255
460rpt_uint32: 65535
461rpt_uint64: 3735928559
Herbie Ong84f09602019-01-17 19:31:47 -0800462rpt_float: nan
463rpt_float: inf
464rpt_float: -inf
465rpt_float: 1.034
Herbie Ongcddf8192018-11-28 18:25:20 -0800466rpt_double: nan
467rpt_double: inf
468rpt_double: -inf
469rpt_double: 1.23e-308
470rpt_string: "hello"
471rpt_string: "世界"
472rpt_bytes: "hello"
473rpt_bytes: "世界"
474`,
475 }, {
Herbie Ong8170d692019-02-13 14:13:21 -0800476 desc: "repeated enums",
Herbie Ong800c9902018-12-06 15:28:53 -0800477 input: &pb2.Enums{
Herbie Ong8170d692019-02-13 14:13:21 -0800478 RptEnum: []pb2.Enum{pb2.Enum_ONE, 2, pb2.Enum_TEN, 42},
Herbie Ongcddf8192018-11-28 18:25:20 -0800479 RptNestedEnum: []pb2.Enums_NestedEnum{2, 47, 10},
Herbie Ong800c9902018-12-06 15:28:53 -0800480 },
Herbie Ong8170d692019-02-13 14:13:21 -0800481 want: `rpt_enum: ONE
482rpt_enum: TWO
483rpt_enum: TEN
Herbie Ongcddf8192018-11-28 18:25:20 -0800484rpt_enum: 42
Herbie Ongcddf8192018-11-28 18:25:20 -0800485rpt_nested_enum: DOS
486rpt_nested_enum: 47
487rpt_nested_enum: DIEZ
488`,
489 }, {
Herbie Ong8170d692019-02-13 14:13:21 -0800490 desc: "repeated messages set to empty",
Herbie Ong800c9902018-12-06 15:28:53 -0800491 input: &pb2.Nests{
Herbie Ongcddf8192018-11-28 18:25:20 -0800492 RptNested: []*pb2.Nested{},
493 Rptgroup: []*pb2.Nests_RptGroup{},
Herbie Ong800c9902018-12-06 15:28:53 -0800494 },
495 want: "\n",
Herbie Ongcddf8192018-11-28 18:25:20 -0800496 }, {
Herbie Ong8170d692019-02-13 14:13:21 -0800497 desc: "repeated messages",
Herbie Ong800c9902018-12-06 15:28:53 -0800498 input: &pb2.Nests{
Herbie Ongcddf8192018-11-28 18:25:20 -0800499 RptNested: []*pb2.Nested{
500 {
501 OptString: scalar.String("repeat nested one"),
502 },
503 {
504 OptString: scalar.String("repeat nested two"),
505 OptNested: &pb2.Nested{
506 OptString: scalar.String("inside repeat nested two"),
507 },
508 },
509 {},
510 },
Herbie Ong800c9902018-12-06 15:28:53 -0800511 },
512 want: `rpt_nested: {
Herbie Ongcddf8192018-11-28 18:25:20 -0800513 opt_string: "repeat nested one"
514}
515rpt_nested: {
516 opt_string: "repeat nested two"
517 opt_nested: {
518 opt_string: "inside repeat nested two"
519 }
520}
521rpt_nested: {}
522`,
523 }, {
Herbie Ong8170d692019-02-13 14:13:21 -0800524 desc: "repeated messages contains nil value",
Herbie Ongf5db2df2019-02-07 20:17:45 -0800525 input: &pb2.Nests{
526 RptNested: []*pb2.Nested{nil, {}},
527 },
528 want: `rpt_nested: {}
529rpt_nested: {}
530`,
531 }, {
Herbie Ong8170d692019-02-13 14:13:21 -0800532 desc: "repeated groups",
Herbie Ong800c9902018-12-06 15:28:53 -0800533 input: &pb2.Nests{
Herbie Ongcddf8192018-11-28 18:25:20 -0800534 Rptgroup: []*pb2.Nests_RptGroup{
535 {
Herbie Ong8170d692019-02-13 14:13:21 -0800536 RptString: []string{"hello", "world"},
Herbie Ongcddf8192018-11-28 18:25:20 -0800537 },
538 {},
Herbie Ong8170d692019-02-13 14:13:21 -0800539 nil,
Herbie Ongcddf8192018-11-28 18:25:20 -0800540 },
Herbie Ong800c9902018-12-06 15:28:53 -0800541 },
Herbie Ongde7313b2019-01-14 19:26:50 -0800542 want: `RptGroup: {
Herbie Ong8170d692019-02-13 14:13:21 -0800543 rpt_string: "hello"
544 rpt_string: "world"
Herbie Ongcddf8192018-11-28 18:25:20 -0800545}
Herbie Ongde7313b2019-01-14 19:26:50 -0800546RptGroup: {}
Herbie Ong8170d692019-02-13 14:13:21 -0800547RptGroup: {}
Herbie Ongcddf8192018-11-28 18:25:20 -0800548`,
549 }, {
Herbie Ong8170d692019-02-13 14:13:21 -0800550 desc: "map fields not set",
551 input: &pb3.Maps{},
Herbie Ongcddf8192018-11-28 18:25:20 -0800552 want: "\n",
553 }, {
Herbie Ong8170d692019-02-13 14:13:21 -0800554 desc: "map fields set to empty",
555 input: &pb3.Maps{
556 Int32ToStr: map[int32]string{},
557 BoolToUint32: map[bool]uint32{},
558 Uint64ToEnum: map[uint64]pb3.Enum{},
559 StrToNested: map[string]*pb3.Nested{},
560 StrToOneofs: map[string]*pb3.Oneofs{},
Herbie Ong800c9902018-12-06 15:28:53 -0800561 },
Herbie Ongcddf8192018-11-28 18:25:20 -0800562 want: "\n",
563 }, {
564 desc: "map fields 1",
Herbie Ong8170d692019-02-13 14:13:21 -0800565 input: &pb3.Maps{
Herbie Ongcddf8192018-11-28 18:25:20 -0800566 Int32ToStr: map[int32]string{
567 -101: "-101",
568 0xff: "0xff",
569 0: "zero",
570 },
Herbie Ongcddf8192018-11-28 18:25:20 -0800571 BoolToUint32: map[bool]uint32{
572 true: 42,
573 false: 101,
574 },
Herbie Ong800c9902018-12-06 15:28:53 -0800575 },
Herbie Ongcddf8192018-11-28 18:25:20 -0800576 want: `int32_to_str: {
577 key: -101
578 value: "-101"
579}
580int32_to_str: {
581 key: 0
582 value: "zero"
583}
584int32_to_str: {
585 key: 255
586 value: "0xff"
587}
Herbie Ongcddf8192018-11-28 18:25:20 -0800588bool_to_uint32: {
589 key: false
590 value: 101
591}
592bool_to_uint32: {
593 key: true
594 value: 42
595}
596`,
597 }, {
598 desc: "map fields 2",
Herbie Ong8170d692019-02-13 14:13:21 -0800599 input: &pb3.Maps{
600 Uint64ToEnum: map[uint64]pb3.Enum{
601 1: pb3.Enum_ONE,
602 2: pb3.Enum_TWO,
603 10: pb3.Enum_TEN,
604 47: 47,
Herbie Ongcddf8192018-11-28 18:25:20 -0800605 },
Herbie Ong800c9902018-12-06 15:28:53 -0800606 },
Herbie Ongcddf8192018-11-28 18:25:20 -0800607 want: `uint64_to_enum: {
608 key: 1
Herbie Ong8170d692019-02-13 14:13:21 -0800609 value: ONE
Herbie Ongcddf8192018-11-28 18:25:20 -0800610}
611uint64_to_enum: {
612 key: 2
Herbie Ong8170d692019-02-13 14:13:21 -0800613 value: TWO
Herbie Ongcddf8192018-11-28 18:25:20 -0800614}
615uint64_to_enum: {
616 key: 10
Herbie Ong8170d692019-02-13 14:13:21 -0800617 value: TEN
618}
619uint64_to_enum: {
620 key: 47
621 value: 47
Herbie Ongcddf8192018-11-28 18:25:20 -0800622}
623`,
624 }, {
625 desc: "map fields 3",
Herbie Ong8170d692019-02-13 14:13:21 -0800626 input: &pb3.Maps{
627 StrToNested: map[string]*pb3.Nested{
628 "nested": &pb3.Nested{
629 SString: "nested in a map",
Herbie Ongcddf8192018-11-28 18:25:20 -0800630 },
631 },
Herbie Ong800c9902018-12-06 15:28:53 -0800632 },
Herbie Ongcddf8192018-11-28 18:25:20 -0800633 want: `str_to_nested: {
Herbie Ong8170d692019-02-13 14:13:21 -0800634 key: "nested"
Herbie Ongcddf8192018-11-28 18:25:20 -0800635 value: {
Herbie Ong8170d692019-02-13 14:13:21 -0800636 s_string: "nested in a map"
Herbie Ongcddf8192018-11-28 18:25:20 -0800637 }
638}
639`,
640 }, {
641 desc: "map fields 4",
Herbie Ong8170d692019-02-13 14:13:21 -0800642 input: &pb3.Maps{
643 StrToOneofs: map[string]*pb3.Oneofs{
644 "string": &pb3.Oneofs{
645 Union: &pb3.Oneofs_OneofString{
646 OneofString: "hello",
Herbie Ongcddf8192018-11-28 18:25:20 -0800647 },
648 },
Herbie Ong8170d692019-02-13 14:13:21 -0800649 "nested": &pb3.Oneofs{
650 Union: &pb3.Oneofs_OneofNested{
651 OneofNested: &pb3.Nested{
652 SString: "nested oneof in map field value",
Herbie Ongcddf8192018-11-28 18:25:20 -0800653 },
654 },
655 },
656 },
Herbie Ong800c9902018-12-06 15:28:53 -0800657 },
Herbie Ongcddf8192018-11-28 18:25:20 -0800658 want: `str_to_oneofs: {
659 key: "nested"
660 value: {
Herbie Ong8170d692019-02-13 14:13:21 -0800661 oneof_nested: {
662 s_string: "nested oneof in map field value"
Herbie Ongcddf8192018-11-28 18:25:20 -0800663 }
664 }
665}
666str_to_oneofs: {
667 key: "string"
668 value: {
Herbie Ong8170d692019-02-13 14:13:21 -0800669 oneof_string: "hello"
Herbie Ongcddf8192018-11-28 18:25:20 -0800670 }
671}
672`,
673 }, {
Herbie Ong8170d692019-02-13 14:13:21 -0800674 desc: "map field contains nil value",
675 input: &pb3.Maps{
676 StrToNested: map[string]*pb3.Nested{
Herbie Ongf5db2df2019-02-07 20:17:45 -0800677 "nil": nil,
678 },
679 },
680 want: `str_to_nested: {
681 key: "nil"
682 value: {}
683}
684`,
685 }, {
Herbie Ong800c9902018-12-06 15:28:53 -0800686 desc: "proto2 required fields not set",
687 input: &pb2.Requireds{},
688 want: "\n",
689 wantErr: true,
Herbie Ongcddf8192018-11-28 18:25:20 -0800690 }, {
Herbie Ong800c9902018-12-06 15:28:53 -0800691 desc: "proto2 required fields partially set",
692 input: &pb2.Requireds{
693 ReqBool: scalar.Bool(false),
Herbie Ong800c9902018-12-06 15:28:53 -0800694 ReqSfixed64: scalar.Int64(0xbeefcafe),
695 ReqDouble: scalar.Float64(math.NaN()),
696 ReqString: scalar.String("hello"),
Herbie Ong8170d692019-02-13 14:13:21 -0800697 ReqEnum: pb2.Enum_ONE.Enum(),
Herbie Ong800c9902018-12-06 15:28:53 -0800698 },
699 want: `req_bool: false
Herbie Ong800c9902018-12-06 15:28:53 -0800700req_sfixed64: 3203386110
701req_double: nan
702req_string: "hello"
Herbie Ong8170d692019-02-13 14:13:21 -0800703req_enum: ONE
Herbie Ong800c9902018-12-06 15:28:53 -0800704`,
705 wantErr: true,
706 }, {
707 desc: "proto2 required fields all set",
708 input: &pb2.Requireds{
709 ReqBool: scalar.Bool(false),
Herbie Ong800c9902018-12-06 15:28:53 -0800710 ReqSfixed64: scalar.Int64(0),
Herbie Ong8170d692019-02-13 14:13:21 -0800711 ReqDouble: scalar.Float64(1.23),
Herbie Ong800c9902018-12-06 15:28:53 -0800712 ReqString: scalar.String(""),
Herbie Ong8170d692019-02-13 14:13:21 -0800713 ReqEnum: pb2.Enum_ONE.Enum(),
Herbie Ong800c9902018-12-06 15:28:53 -0800714 ReqNested: &pb2.Nested{},
715 },
716 want: `req_bool: false
Herbie Ong800c9902018-12-06 15:28:53 -0800717req_sfixed64: 0
Herbie Ong8170d692019-02-13 14:13:21 -0800718req_double: 1.23
Herbie Ong800c9902018-12-06 15:28:53 -0800719req_string: ""
Herbie Ong8170d692019-02-13 14:13:21 -0800720req_enum: ONE
Herbie Ong800c9902018-12-06 15:28:53 -0800721req_nested: {}
Herbie Ongcddf8192018-11-28 18:25:20 -0800722`,
723 }, {
Herbie Ong800c9902018-12-06 15:28:53 -0800724 desc: "indirect required field",
725 input: &pb2.IndirectRequired{
726 OptNested: &pb2.NestedWithRequired{},
727 },
728 want: "opt_nested: {}\n",
729 wantErr: true,
Herbie Ongcddf8192018-11-28 18:25:20 -0800730 }, {
Herbie Ong800c9902018-12-06 15:28:53 -0800731 desc: "indirect required field in empty repeated",
732 input: &pb2.IndirectRequired{
733 RptNested: []*pb2.NestedWithRequired{},
734 },
735 want: "\n",
Herbie Ongcddf8192018-11-28 18:25:20 -0800736 }, {
Herbie Ong800c9902018-12-06 15:28:53 -0800737 desc: "indirect required field in repeated",
738 input: &pb2.IndirectRequired{
739 RptNested: []*pb2.NestedWithRequired{
740 &pb2.NestedWithRequired{},
Herbie Ongcddf8192018-11-28 18:25:20 -0800741 },
Herbie Ong800c9902018-12-06 15:28:53 -0800742 },
743 want: "rpt_nested: {}\n",
744 wantErr: true,
745 }, {
746 desc: "indirect required field in empty map",
747 input: &pb2.IndirectRequired{
748 StrToNested: map[string]*pb2.NestedWithRequired{},
749 },
750 want: "\n",
751 }, {
752 desc: "indirect required field in map",
753 input: &pb2.IndirectRequired{
754 StrToNested: map[string]*pb2.NestedWithRequired{
755 "fail": &pb2.NestedWithRequired{},
756 },
757 },
758 want: `str_to_nested: {
759 key: "fail"
760 value: {}
Herbie Ongcddf8192018-11-28 18:25:20 -0800761}
762`,
Herbie Ong800c9902018-12-06 15:28:53 -0800763 wantErr: true,
Herbie Ong20a1d312018-12-11 21:08:58 -0800764 }, {
Herbie Ong8170d692019-02-13 14:13:21 -0800765 desc: "indirect required field in oneof",
766 input: &pb2.IndirectRequired{
767 Union: &pb2.IndirectRequired_OneofNested{
768 OneofNested: &pb2.NestedWithRequired{},
769 },
770 },
771 want: "oneof_nested: {}\n",
772 wantErr: true,
773 }, {
Herbie Ong20a1d312018-12-11 21:08:58 -0800774 desc: "unknown varint and fixed types",
775 input: &pb2.Scalars{
776 OptString: scalar.String("this message contains unknown fields"),
777 XXX_unrecognized: pack.Message{
778 pack.Tag{101, pack.VarintType}, pack.Bool(true),
779 pack.Tag{102, pack.VarintType}, pack.Varint(0xff),
780 pack.Tag{103, pack.Fixed32Type}, pack.Uint32(47),
781 pack.Tag{104, pack.Fixed64Type}, pack.Int64(0xdeadbeef),
782 }.Marshal(),
783 },
784 want: `opt_string: "this message contains unknown fields"
785101: 1
786102: 255
787103: 47
788104: 3735928559
789`,
790 }, {
791 desc: "unknown length-delimited",
792 input: &pb2.Scalars{
793 XXX_unrecognized: pack.Message{
794 pack.Tag{101, pack.BytesType}, pack.LengthPrefix{pack.Bool(true), pack.Bool(false)},
795 pack.Tag{102, pack.BytesType}, pack.String("hello world"),
796 pack.Tag{103, pack.BytesType}, pack.Bytes("\xe4\xb8\x96\xe7\x95\x8c"),
797 }.Marshal(),
798 },
799 want: `101: "\x01\x00"
800102: "hello world"
801103: "世界"
802`,
803 }, {
804 desc: "unknown group type",
805 input: &pb2.Scalars{
806 XXX_unrecognized: pack.Message{
807 pack.Tag{101, pack.StartGroupType}, pack.Tag{101, pack.EndGroupType},
808 pack.Tag{102, pack.StartGroupType},
809 pack.Tag{101, pack.VarintType}, pack.Bool(false),
810 pack.Tag{102, pack.BytesType}, pack.String("inside a group"),
811 pack.Tag{102, pack.EndGroupType},
812 }.Marshal(),
813 },
814 want: `101: {}
815102: {
816 101: 0
817 102: "inside a group"
818}
819`,
820 }, {
821 desc: "unknown unpack repeated field",
822 input: &pb2.Scalars{
823 XXX_unrecognized: pack.Message{
824 pack.Tag{101, pack.BytesType}, pack.LengthPrefix{pack.Bool(true), pack.Bool(false), pack.Bool(true)},
825 pack.Tag{102, pack.BytesType}, pack.String("hello"),
826 pack.Tag{101, pack.VarintType}, pack.Bool(true),
827 pack.Tag{102, pack.BytesType}, pack.String("世界"),
828 }.Marshal(),
829 },
830 want: `101: "\x01\x00\x01"
831101: 1
832102: "hello"
833102: "世界"
834`,
Herbie Ongcf253082018-12-17 17:13:07 -0800835 }, {
836 desc: "extensions of non-repeated fields",
837 input: func() proto.Message {
838 m := &pb2.Extensions{
839 OptString: scalar.String("non-extension field"),
840 OptBool: scalar.Bool(true),
841 OptInt32: scalar.Int32(42),
842 }
843 setExtension(m, pb2.E_OptExtBool, true)
844 setExtension(m, pb2.E_OptExtString, "extension field")
Herbie Ong8170d692019-02-13 14:13:21 -0800845 setExtension(m, pb2.E_OptExtEnum, pb2.Enum_TEN)
Herbie Ongcf253082018-12-17 17:13:07 -0800846 setExtension(m, pb2.E_OptExtNested, &pb2.Nested{
847 OptString: scalar.String("nested in an extension"),
848 OptNested: &pb2.Nested{
849 OptString: scalar.String("another nested in an extension"),
850 },
851 })
852 return m
853 }(),
854 want: `opt_string: "non-extension field"
855opt_bool: true
856opt_int32: 42
857[pb2.opt_ext_bool]: true
Herbie Ong8170d692019-02-13 14:13:21 -0800858[pb2.opt_ext_enum]: TEN
Herbie Ongcf253082018-12-17 17:13:07 -0800859[pb2.opt_ext_nested]: {
860 opt_string: "nested in an extension"
861 opt_nested: {
862 opt_string: "another nested in an extension"
863 }
864}
865[pb2.opt_ext_string]: "extension field"
866`,
867 }, {
Herbie Ong8170d692019-02-13 14:13:21 -0800868 desc: "extension message field set to nil",
Herbie Ongcf253082018-12-17 17:13:07 -0800869 input: func() proto.Message {
870 m := &pb2.Extensions{}
871 setExtension(m, pb2.E_OptExtNested, nil)
872 return m
873 }(),
874 want: "\n",
875 }, {
876 desc: "extensions of repeated fields",
877 input: func() proto.Message {
878 m := &pb2.Extensions{}
Herbie Ong8170d692019-02-13 14:13:21 -0800879 setExtension(m, pb2.E_RptExtEnum, &[]pb2.Enum{pb2.Enum_TEN, 101, pb2.Enum_ONE})
Herbie Ongcf253082018-12-17 17:13:07 -0800880 setExtension(m, pb2.E_RptExtFixed32, &[]uint32{42, 47})
881 setExtension(m, pb2.E_RptExtNested, &[]*pb2.Nested{
882 &pb2.Nested{OptString: scalar.String("one")},
883 &pb2.Nested{OptString: scalar.String("two")},
884 &pb2.Nested{OptString: scalar.String("three")},
885 })
886 return m
887 }(),
Herbie Ong8170d692019-02-13 14:13:21 -0800888 want: `[pb2.rpt_ext_enum]: TEN
Herbie Ongcf253082018-12-17 17:13:07 -0800889[pb2.rpt_ext_enum]: 101
Herbie Ong8170d692019-02-13 14:13:21 -0800890[pb2.rpt_ext_enum]: ONE
Herbie Ongcf253082018-12-17 17:13:07 -0800891[pb2.rpt_ext_fixed32]: 42
892[pb2.rpt_ext_fixed32]: 47
893[pb2.rpt_ext_nested]: {
894 opt_string: "one"
895}
896[pb2.rpt_ext_nested]: {
897 opt_string: "two"
898}
899[pb2.rpt_ext_nested]: {
900 opt_string: "three"
901}
902`,
903 }, {
904 desc: "extensions of non-repeated fields in another message",
905 input: func() proto.Message {
906 m := &pb2.Extensions{}
907 setExtension(m, pb2.E_ExtensionsContainer_OptExtBool, true)
908 setExtension(m, pb2.E_ExtensionsContainer_OptExtString, "extension field")
Herbie Ong8170d692019-02-13 14:13:21 -0800909 setExtension(m, pb2.E_ExtensionsContainer_OptExtEnum, pb2.Enum_TEN)
Herbie Ongcf253082018-12-17 17:13:07 -0800910 setExtension(m, pb2.E_ExtensionsContainer_OptExtNested, &pb2.Nested{
911 OptString: scalar.String("nested in an extension"),
912 OptNested: &pb2.Nested{
913 OptString: scalar.String("another nested in an extension"),
914 },
915 })
916 return m
917 }(),
918 want: `[pb2.ExtensionsContainer.opt_ext_bool]: true
Herbie Ong8170d692019-02-13 14:13:21 -0800919[pb2.ExtensionsContainer.opt_ext_enum]: TEN
Herbie Ongcf253082018-12-17 17:13:07 -0800920[pb2.ExtensionsContainer.opt_ext_nested]: {
921 opt_string: "nested in an extension"
922 opt_nested: {
923 opt_string: "another nested in an extension"
924 }
925}
926[pb2.ExtensionsContainer.opt_ext_string]: "extension field"
927`,
928 }, {
929 desc: "extensions of repeated fields in another message",
930 input: func() proto.Message {
931 m := &pb2.Extensions{
932 OptString: scalar.String("non-extension field"),
933 OptBool: scalar.Bool(true),
934 OptInt32: scalar.Int32(42),
935 }
Herbie Ong8170d692019-02-13 14:13:21 -0800936 setExtension(m, pb2.E_ExtensionsContainer_RptExtEnum, &[]pb2.Enum{pb2.Enum_TEN, 101, pb2.Enum_ONE})
Herbie Ongcf253082018-12-17 17:13:07 -0800937 setExtension(m, pb2.E_ExtensionsContainer_RptExtString, &[]string{"hello", "world"})
938 setExtension(m, pb2.E_ExtensionsContainer_RptExtNested, &[]*pb2.Nested{
939 &pb2.Nested{OptString: scalar.String("one")},
940 &pb2.Nested{OptString: scalar.String("two")},
941 &pb2.Nested{OptString: scalar.String("three")},
942 })
943 return m
944 }(),
945 want: `opt_string: "non-extension field"
946opt_bool: true
947opt_int32: 42
Herbie Ong8170d692019-02-13 14:13:21 -0800948[pb2.ExtensionsContainer.rpt_ext_enum]: TEN
Herbie Ongcf253082018-12-17 17:13:07 -0800949[pb2.ExtensionsContainer.rpt_ext_enum]: 101
Herbie Ong8170d692019-02-13 14:13:21 -0800950[pb2.ExtensionsContainer.rpt_ext_enum]: ONE
Herbie Ongcf253082018-12-17 17:13:07 -0800951[pb2.ExtensionsContainer.rpt_ext_nested]: {
952 opt_string: "one"
953}
954[pb2.ExtensionsContainer.rpt_ext_nested]: {
955 opt_string: "two"
956}
957[pb2.ExtensionsContainer.rpt_ext_nested]: {
958 opt_string: "three"
959}
960[pb2.ExtensionsContainer.rpt_ext_string]: "hello"
961[pb2.ExtensionsContainer.rpt_ext_string]: "world"
962`,
Herbie Ong6470ea62019-01-07 18:56:57 -0800963 }, {
964 desc: "MessageSet",
965 input: func() proto.Message {
966 m := &pb2.MessageSet{}
967 setExtension(m, pb2.E_MessageSetExtension_MessageSetExtension, &pb2.MessageSetExtension{
968 OptString: scalar.String("a messageset extension"),
969 })
970 setExtension(m, pb2.E_MessageSetExtension_NotMessageSetExtension, &pb2.MessageSetExtension{
971 OptString: scalar.String("not a messageset extension"),
972 })
973 setExtension(m, pb2.E_MessageSetExtension_ExtNested, &pb2.Nested{
974 OptString: scalar.String("just a regular extension"),
975 })
976 return m
977 }(),
978 want: `[pb2.MessageSetExtension]: {
979 opt_string: "a messageset extension"
980}
981[pb2.MessageSetExtension.ext_nested]: {
982 opt_string: "just a regular extension"
983}
984[pb2.MessageSetExtension.not_message_set_extension]: {
985 opt_string: "not a messageset extension"
986}
987`,
988 }, {
989 desc: "not real MessageSet 1",
990 input: func() proto.Message {
991 m := &pb2.FakeMessageSet{}
992 setExtension(m, pb2.E_FakeMessageSetExtension_MessageSetExtension, &pb2.FakeMessageSetExtension{
993 OptString: scalar.String("not a messageset extension"),
994 })
995 return m
996 }(),
997 want: `[pb2.FakeMessageSetExtension.message_set_extension]: {
998 opt_string: "not a messageset extension"
999}
1000`,
1001 }, {
1002 desc: "not real MessageSet 2",
1003 input: func() proto.Message {
1004 m := &pb2.MessageSet{}
1005 setExtension(m, pb2.E_MessageSetExtension, &pb2.FakeMessageSetExtension{
1006 OptString: scalar.String("another not a messageset extension"),
1007 })
1008 return m
1009 }(),
1010 want: `[pb2.message_set_extension]: {
1011 opt_string: "another not a messageset extension"
1012}
1013`,
Herbie Ongf42b55f2019-01-02 15:46:07 -08001014 }, {
Herbie Ong8170d692019-02-13 14:13:21 -08001015 desc: "Any not expanded",
Herbie Ong66c365c2019-01-04 14:08:41 -08001016 mo: textpb.MarshalOptions{
1017 Resolver: preg.NewTypes(),
1018 },
Herbie Ongf42b55f2019-01-02 15:46:07 -08001019 input: func() proto.Message {
1020 m := &pb2.Nested{
1021 OptString: scalar.String("embedded inside Any"),
1022 OptNested: &pb2.Nested{
1023 OptString: scalar.String("inception"),
1024 },
1025 }
Herbie Ong4d1c3be2019-03-15 18:22:36 -07001026 b, err := proto.MarshalOptions{Deterministic: true}.Marshal(m)
Herbie Ongf42b55f2019-01-02 15:46:07 -08001027 if err != nil {
1028 t.Fatalf("error in binary marshaling message for Any.value: %v", err)
1029 }
Herbie Ong300cff02019-03-20 18:05:16 -07001030 return &knownpb.Any{
Herbie Ong66c365c2019-01-04 14:08:41 -08001031 TypeUrl: "pb2.Nested",
Herbie Ongf42b55f2019-01-02 15:46:07 -08001032 Value: b,
Herbie Ong300cff02019-03-20 18:05:16 -07001033 }
Herbie Ongf42b55f2019-01-02 15:46:07 -08001034 }(),
1035 want: `type_url: "pb2.Nested"
1036value: "\n\x13embedded inside Any\x12\x0b\n\tinception"
1037`,
1038 }, {
Herbie Ong8170d692019-02-13 14:13:21 -08001039 desc: "Any expanded",
Herbie Ong66c365c2019-01-04 14:08:41 -08001040 mo: textpb.MarshalOptions{
1041 Resolver: preg.NewTypes((&pb2.Nested{}).ProtoReflect().Type()),
1042 },
Herbie Ongf42b55f2019-01-02 15:46:07 -08001043 input: func() proto.Message {
1044 m := &pb2.Nested{
1045 OptString: scalar.String("embedded inside Any"),
1046 OptNested: &pb2.Nested{
1047 OptString: scalar.String("inception"),
1048 },
1049 }
Herbie Ong4d1c3be2019-03-15 18:22:36 -07001050 b, err := proto.MarshalOptions{Deterministic: true}.Marshal(m)
Herbie Ongf42b55f2019-01-02 15:46:07 -08001051 if err != nil {
1052 t.Fatalf("error in binary marshaling message for Any.value: %v", err)
1053 }
Herbie Ong300cff02019-03-20 18:05:16 -07001054 return &knownpb.Any{
Herbie Ong66c365c2019-01-04 14:08:41 -08001055 TypeUrl: "foo/pb2.Nested",
Herbie Ongf42b55f2019-01-02 15:46:07 -08001056 Value: b,
Herbie Ong300cff02019-03-20 18:05:16 -07001057 }
Herbie Ongf42b55f2019-01-02 15:46:07 -08001058 }(),
Herbie Ong66c365c2019-01-04 14:08:41 -08001059 want: `[foo/pb2.Nested]: {
Herbie Ongf42b55f2019-01-02 15:46:07 -08001060 opt_string: "embedded inside Any"
1061 opt_nested: {
1062 opt_string: "inception"
1063 }
1064}
1065`,
1066 }, {
Herbie Ong8170d692019-02-13 14:13:21 -08001067 desc: "Any expanded with missing required error",
Herbie Ong66c365c2019-01-04 14:08:41 -08001068 mo: textpb.MarshalOptions{
1069 Resolver: preg.NewTypes((&pb2.PartialRequired{}).ProtoReflect().Type()),
1070 },
Herbie Ongf42b55f2019-01-02 15:46:07 -08001071 input: func() proto.Message {
1072 m := &pb2.PartialRequired{
1073 OptString: scalar.String("embedded inside Any"),
1074 }
Herbie Ong300cff02019-03-20 18:05:16 -07001075 b, err := proto.MarshalOptions{Deterministic: true}.Marshal(m)
1076 // TODO: Marshal may fail due to required field not set at some
1077 // point. Need to ignore required not set error here.
1078 if err != nil {
Herbie Ongf42b55f2019-01-02 15:46:07 -08001079 t.Fatalf("error in binary marshaling message for Any.value: %v", err)
1080 }
Herbie Ong300cff02019-03-20 18:05:16 -07001081 return &knownpb.Any{
Herbie Ongf42b55f2019-01-02 15:46:07 -08001082 TypeUrl: string(m.ProtoReflect().Type().FullName()),
1083 Value: b,
Herbie Ong300cff02019-03-20 18:05:16 -07001084 }
Herbie Ongf42b55f2019-01-02 15:46:07 -08001085 }(),
1086 want: `[pb2.PartialRequired]: {
1087 opt_string: "embedded inside Any"
1088}
1089`,
1090 wantErr: true,
1091 }, {
Herbie Ong8170d692019-02-13 14:13:21 -08001092 desc: "Any with invalid value",
Herbie Ong66c365c2019-01-04 14:08:41 -08001093 mo: textpb.MarshalOptions{
1094 Resolver: preg.NewTypes((&pb2.Nested{}).ProtoReflect().Type()),
1095 },
Herbie Ong300cff02019-03-20 18:05:16 -07001096 input: &knownpb.Any{
Herbie Ong66c365c2019-01-04 14:08:41 -08001097 TypeUrl: "foo/pb2.Nested",
1098 Value: dhex("80"),
Herbie Ong300cff02019-03-20 18:05:16 -07001099 },
Herbie Ong66c365c2019-01-04 14:08:41 -08001100 want: `type_url: "foo/pb2.Nested"
Herbie Onga94f78c2019-01-03 15:39:58 -08001101value: "\x80"
1102`,
Herbie Ongcddf8192018-11-28 18:25:20 -08001103 }}
1104
1105 for _, tt := range tests {
1106 tt := tt
1107 t.Run(tt.desc, func(t *testing.T) {
Herbie Ong3a385912019-03-20 14:04:24 -07001108 // Use 2-space indentation on all MarshalOptions.
1109 tt.mo.Indent = " "
Herbie Ongf42b55f2019-01-02 15:46:07 -08001110 b, err := tt.mo.Marshal(tt.input)
Herbie Ongcddf8192018-11-28 18:25:20 -08001111 if err != nil && !tt.wantErr {
Herbie Ongf42b55f2019-01-02 15:46:07 -08001112 t.Errorf("Marshal() returned error: %v\n", err)
Herbie Ongcddf8192018-11-28 18:25:20 -08001113 }
Herbie Ong800c9902018-12-06 15:28:53 -08001114 if err == nil && tt.wantErr {
Herbie Ongf42b55f2019-01-02 15:46:07 -08001115 t.Error("Marshal() got nil error, want error\n")
Herbie Ongcddf8192018-11-28 18:25:20 -08001116 }
Herbie Ong800c9902018-12-06 15:28:53 -08001117 got := string(b)
1118 if tt.want != "" && got != tt.want {
1119 t.Errorf("Marshal()\n<got>\n%v\n<want>\n%v\n", got, tt.want)
1120 if diff := cmp.Diff(tt.want, got, splitLines); diff != "" {
Herbie Ongcddf8192018-11-28 18:25:20 -08001121 t.Errorf("Marshal() diff -want +got\n%v\n", diff)
1122 }
1123 }
1124 })
1125 }
1126}