blob: f119ce9e43c079fd5e5f65fe9b929a5dcad5bb33 [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 Ongf42b55f2019-01-02 15:46:07 -080013 protoV1 "github.com/golang/protobuf/proto"
Herbie Ongcf253082018-12-17 17:13:07 -080014 "github.com/golang/protobuf/protoapi"
Herbie Ongcddf8192018-11-28 18:25:20 -080015 "github.com/golang/protobuf/v2/encoding/textpb"
Herbie Ongcddf8192018-11-28 18:25:20 -080016 "github.com/golang/protobuf/v2/internal/detrand"
Herbie Ong20a1d312018-12-11 21:08:58 -080017 "github.com/golang/protobuf/v2/internal/encoding/pack"
Herbie Ongcf253082018-12-17 17:13:07 -080018 "github.com/golang/protobuf/v2/internal/encoding/wire"
Herbie Ongf42b55f2019-01-02 15:46:07 -080019 "github.com/golang/protobuf/v2/internal/impl"
Herbie Ongcf253082018-12-17 17:13:07 -080020 "github.com/golang/protobuf/v2/internal/legacy"
Herbie Ongcddf8192018-11-28 18:25:20 -080021 "github.com/golang/protobuf/v2/internal/scalar"
22 "github.com/golang/protobuf/v2/proto"
Herbie Ongf42b55f2019-01-02 15:46:07 -080023 preg "github.com/golang/protobuf/v2/reflect/protoregistry"
Herbie Ongcddf8192018-11-28 18:25:20 -080024 "github.com/google/go-cmp/cmp"
25 "github.com/google/go-cmp/cmp/cmpopts"
26
Herbie Ong8170d692019-02-13 14:13:21 -080027 "github.com/golang/protobuf/v2/encoding/testprotos/pb2"
28 "github.com/golang/protobuf/v2/encoding/testprotos/pb3"
Joe Tsai19058432019-02-27 21:46:29 -080029 knownpb "github.com/golang/protobuf/v2/types/known"
Herbie Ongcddf8192018-11-28 18:25:20 -080030)
31
32func init() {
33 // Disable detrand to enable direct comparisons on outputs.
34 detrand.Disable()
35}
36
Herbie Ongcddf8192018-11-28 18:25:20 -080037// splitLines is a cmpopts.Option for comparing strings with line breaks.
38var splitLines = cmpopts.AcyclicTransformer("SplitLines", func(s string) []string {
39 return strings.Split(s, "\n")
40})
41
Herbie Ong800c9902018-12-06 15:28:53 -080042func pb2Enum(i int32) *pb2.Enum {
43 p := new(pb2.Enum)
44 *p = pb2.Enum(i)
45 return p
46}
47
48func pb2Enums_NestedEnum(i int32) *pb2.Enums_NestedEnum {
49 p := new(pb2.Enums_NestedEnum)
50 *p = pb2.Enums_NestedEnum(i)
51 return p
52}
53
Herbie Ongcf253082018-12-17 17:13:07 -080054func setExtension(m proto.Message, xd *protoapi.ExtensionDesc, val interface{}) {
55 xt := legacy.Export{}.ExtensionTypeFromDesc(xd)
56 knownFields := m.ProtoReflect().KnownFields()
57 extTypes := knownFields.ExtensionTypes()
58 extTypes.Register(xt)
59 if val == nil {
60 return
61 }
62 pval := xt.ValueOf(val)
63 knownFields.Set(wire.Number(xd.Field), pval)
64}
65
Joe Tsai19058432019-02-27 21:46:29 -080066func wrapV1Message(any *knownpb.Any) proto.Message {
Herbie Ong66c365c2019-01-04 14:08:41 -080067 return impl.Export{}.MessageOf(any).Interface()
68}
69
Herbie Onga94f78c2019-01-03 15:39:58 -080070// dhex decodes a hex-string and returns the bytes and panics if s is invalid.
71func dhex(s string) []byte {
72 b, err := hex.DecodeString(s)
73 if err != nil {
74 panic(err)
75 }
76 return b
77}
78
Herbie Ongcddf8192018-11-28 18:25:20 -080079func TestMarshal(t *testing.T) {
80 tests := []struct {
81 desc string
Herbie Ongf42b55f2019-01-02 15:46:07 -080082 mo textpb.MarshalOptions
Herbie Ong70651952018-12-13 14:19:50 -080083 input proto.Message
Herbie Ongcddf8192018-11-28 18:25:20 -080084 want string
85 wantErr bool
86 }{{
Herbie Ong8170d692019-02-13 14:13:21 -080087 desc: "proto2 optional scalars not set",
Herbie Ong800c9902018-12-06 15:28:53 -080088 input: &pb2.Scalars{},
Herbie Ongcddf8192018-11-28 18:25:20 -080089 want: "\n",
90 }, {
Herbie Ong8170d692019-02-13 14:13:21 -080091 desc: "proto3 scalars not set",
Herbie Ong800c9902018-12-06 15:28:53 -080092 input: &pb3.Scalars{},
Herbie Ongcddf8192018-11-28 18:25:20 -080093 want: "\n",
94 }, {
Herbie Ong8170d692019-02-13 14:13:21 -080095 desc: "proto2 optional scalars set to zero values",
Herbie Ong800c9902018-12-06 15:28:53 -080096 input: &pb2.Scalars{
Herbie Ongcddf8192018-11-28 18:25:20 -080097 OptBool: scalar.Bool(false),
98 OptInt32: scalar.Int32(0),
99 OptInt64: scalar.Int64(0),
100 OptUint32: scalar.Uint32(0),
101 OptUint64: scalar.Uint64(0),
102 OptSint32: scalar.Int32(0),
103 OptSint64: scalar.Int64(0),
104 OptFixed32: scalar.Uint32(0),
105 OptFixed64: scalar.Uint64(0),
106 OptSfixed32: scalar.Int32(0),
107 OptSfixed64: scalar.Int64(0),
108 OptFloat: scalar.Float32(0),
109 OptDouble: scalar.Float64(0),
110 OptBytes: []byte{},
111 OptString: scalar.String(""),
Herbie Ong800c9902018-12-06 15:28:53 -0800112 },
Herbie Ongcddf8192018-11-28 18:25:20 -0800113 want: `opt_bool: false
114opt_int32: 0
115opt_int64: 0
116opt_uint32: 0
117opt_uint64: 0
118opt_sint32: 0
119opt_sint64: 0
120opt_fixed32: 0
121opt_fixed64: 0
122opt_sfixed32: 0
123opt_sfixed64: 0
124opt_float: 0
125opt_double: 0
126opt_bytes: ""
127opt_string: ""
128`,
129 }, {
Herbie Ong8170d692019-02-13 14:13:21 -0800130 desc: "proto3 scalars set to zero values",
Herbie Ong800c9902018-12-06 15:28:53 -0800131 input: &pb3.Scalars{
Herbie Ongcddf8192018-11-28 18:25:20 -0800132 SBool: false,
133 SInt32: 0,
134 SInt64: 0,
135 SUint32: 0,
136 SUint64: 0,
137 SSint32: 0,
138 SSint64: 0,
139 SFixed32: 0,
140 SFixed64: 0,
141 SSfixed32: 0,
142 SSfixed64: 0,
143 SFloat: 0,
144 SDouble: 0,
145 SBytes: []byte{},
146 SString: "",
Herbie Ong800c9902018-12-06 15:28:53 -0800147 },
Herbie Ongcddf8192018-11-28 18:25:20 -0800148 want: "\n",
149 }, {
Herbie Ong8170d692019-02-13 14:13:21 -0800150 desc: "proto2 optional scalars set to some values",
Herbie Ong800c9902018-12-06 15:28:53 -0800151 input: &pb2.Scalars{
Herbie Ongcddf8192018-11-28 18:25:20 -0800152 OptBool: scalar.Bool(true),
153 OptInt32: scalar.Int32(0xff),
154 OptInt64: scalar.Int64(0xdeadbeef),
155 OptUint32: scalar.Uint32(47),
156 OptUint64: scalar.Uint64(0xdeadbeef),
157 OptSint32: scalar.Int32(-1001),
158 OptSint64: scalar.Int64(-0xffff),
159 OptFixed64: scalar.Uint64(64),
160 OptSfixed32: scalar.Int32(-32),
Herbie Ong84f09602019-01-17 19:31:47 -0800161 OptFloat: scalar.Float32(1.02),
162 OptDouble: scalar.Float64(1.0199999809265137),
Herbie Ong8170d692019-02-13 14:13:21 -0800163 OptBytes: []byte("\xe8\xb0\xb7\xe6\xad\x8c"),
164 OptString: scalar.String("谷歌"),
Herbie Ong800c9902018-12-06 15:28:53 -0800165 },
Herbie Ongcddf8192018-11-28 18:25:20 -0800166 want: `opt_bool: true
167opt_int32: 255
168opt_int64: 3735928559
169opt_uint32: 47
170opt_uint64: 3735928559
171opt_sint32: -1001
172opt_sint64: -65535
173opt_fixed64: 64
174opt_sfixed32: -32
Herbie Ong84f09602019-01-17 19:31:47 -0800175opt_float: 1.02
176opt_double: 1.0199999809265137
Herbie Ongcddf8192018-11-28 18:25:20 -0800177opt_bytes: "谷歌"
178opt_string: "谷歌"
179`,
180 }, {
Herbie Ong8170d692019-02-13 14:13:21 -0800181 desc: "float nan",
Herbie Ong800c9902018-12-06 15:28:53 -0800182 input: &pb3.Scalars{
Herbie Ongcddf8192018-11-28 18:25:20 -0800183 SFloat: float32(math.NaN()),
Herbie Ong800c9902018-12-06 15:28:53 -0800184 },
Herbie Ongcddf8192018-11-28 18:25:20 -0800185 want: "s_float: nan\n",
186 }, {
Herbie Ong8170d692019-02-13 14:13:21 -0800187 desc: "float positive infinity",
Herbie Ong800c9902018-12-06 15:28:53 -0800188 input: &pb3.Scalars{
Herbie Ongcddf8192018-11-28 18:25:20 -0800189 SFloat: float32(math.Inf(1)),
Herbie Ong800c9902018-12-06 15:28:53 -0800190 },
Herbie Ongcddf8192018-11-28 18:25:20 -0800191 want: "s_float: inf\n",
192 }, {
Herbie Ong8170d692019-02-13 14:13:21 -0800193 desc: "float negative infinity",
Herbie Ong800c9902018-12-06 15:28:53 -0800194 input: &pb3.Scalars{
Herbie Ongcddf8192018-11-28 18:25:20 -0800195 SFloat: float32(math.Inf(-1)),
Herbie Ong800c9902018-12-06 15:28:53 -0800196 },
Herbie Ongcddf8192018-11-28 18:25:20 -0800197 want: "s_float: -inf\n",
198 }, {
Herbie Ong8170d692019-02-13 14:13:21 -0800199 desc: "double nan",
Herbie Ong800c9902018-12-06 15:28:53 -0800200 input: &pb3.Scalars{
Herbie Ongcddf8192018-11-28 18:25:20 -0800201 SDouble: math.NaN(),
Herbie Ong800c9902018-12-06 15:28:53 -0800202 },
Herbie Ongcddf8192018-11-28 18:25:20 -0800203 want: "s_double: nan\n",
204 }, {
Herbie Ong8170d692019-02-13 14:13:21 -0800205 desc: "double positive infinity",
Herbie Ong800c9902018-12-06 15:28:53 -0800206 input: &pb3.Scalars{
Herbie Ongcddf8192018-11-28 18:25:20 -0800207 SDouble: math.Inf(1),
Herbie Ong800c9902018-12-06 15:28:53 -0800208 },
Herbie Ongcddf8192018-11-28 18:25:20 -0800209 want: "s_double: inf\n",
210 }, {
Herbie Ong8170d692019-02-13 14:13:21 -0800211 desc: "double negative infinity",
Herbie Ong800c9902018-12-06 15:28:53 -0800212 input: &pb3.Scalars{
Herbie Ongcddf8192018-11-28 18:25:20 -0800213 SDouble: math.Inf(-1),
Herbie Ong800c9902018-12-06 15:28:53 -0800214 },
Herbie Ongcddf8192018-11-28 18:25:20 -0800215 want: "s_double: -inf\n",
216 }, {
Herbie Ong800c9902018-12-06 15:28:53 -0800217 desc: "proto2 enum not set",
218 input: &pb2.Enums{},
Herbie Ongcddf8192018-11-28 18:25:20 -0800219 want: "\n",
220 }, {
Herbie Ong800c9902018-12-06 15:28:53 -0800221 desc: "proto2 enum set to zero value",
222 input: &pb2.Enums{
Herbie Ong8170d692019-02-13 14:13:21 -0800223 OptEnum: pb2Enum(0),
Herbie Ong800c9902018-12-06 15:28:53 -0800224 OptNestedEnum: pb2Enums_NestedEnum(0),
225 },
Herbie Ong8170d692019-02-13 14:13:21 -0800226 want: `opt_enum: 0
Herbie Ong800c9902018-12-06 15:28:53 -0800227opt_nested_enum: 0
228`,
229 }, {
230 desc: "proto2 enum",
231 input: &pb2.Enums{
Herbie Ong8170d692019-02-13 14:13:21 -0800232 OptEnum: pb2.Enum_ONE.Enum(),
Herbie Ong800c9902018-12-06 15:28:53 -0800233 OptNestedEnum: pb2.Enums_UNO.Enum(),
234 },
Herbie Ong8170d692019-02-13 14:13:21 -0800235 want: `opt_enum: ONE
Herbie Ong800c9902018-12-06 15:28:53 -0800236opt_nested_enum: UNO
237`,
238 }, {
239 desc: "proto2 enum set to numeric values",
240 input: &pb2.Enums{
Herbie Ong8170d692019-02-13 14:13:21 -0800241 OptEnum: pb2Enum(2),
Herbie Ong800c9902018-12-06 15:28:53 -0800242 OptNestedEnum: pb2Enums_NestedEnum(2),
243 },
Herbie Ong8170d692019-02-13 14:13:21 -0800244 want: `opt_enum: TWO
Herbie Ong800c9902018-12-06 15:28:53 -0800245opt_nested_enum: DOS
246`,
247 }, {
248 desc: "proto2 enum set to unnamed numeric values",
249 input: &pb2.Enums{
250 OptEnum: pb2Enum(101),
251 OptNestedEnum: pb2Enums_NestedEnum(-101),
252 },
253 want: `opt_enum: 101
254opt_nested_enum: -101
255`,
256 }, {
257 desc: "proto3 enum not set",
258 input: &pb3.Enums{},
259 want: "\n",
260 }, {
261 desc: "proto3 enum set to zero value",
262 input: &pb3.Enums{
263 SEnum: pb3.Enum_ZERO,
264 SNestedEnum: pb3.Enums_CERO,
265 },
266 want: "\n",
267 }, {
268 desc: "proto3 enum",
269 input: &pb3.Enums{
270 SEnum: pb3.Enum_ONE,
Herbie Ong8170d692019-02-13 14:13:21 -0800271 SNestedEnum: pb3.Enums_UNO,
Herbie Ong800c9902018-12-06 15:28:53 -0800272 },
273 want: `s_enum: ONE
Herbie Ong8170d692019-02-13 14:13:21 -0800274s_nested_enum: UNO
Herbie Ong800c9902018-12-06 15:28:53 -0800275`,
276 }, {
277 desc: "proto3 enum set to numeric values",
278 input: &pb3.Enums{
279 SEnum: 2,
Herbie Ong8170d692019-02-13 14:13:21 -0800280 SNestedEnum: 2,
Herbie Ong800c9902018-12-06 15:28:53 -0800281 },
282 want: `s_enum: TWO
Herbie Ong8170d692019-02-13 14:13:21 -0800283s_nested_enum: DOS
Herbie Ong800c9902018-12-06 15:28:53 -0800284`,
285 }, {
286 desc: "proto3 enum set to unnamed numeric values",
287 input: &pb3.Enums{
288 SEnum: -47,
289 SNestedEnum: 47,
290 },
291 want: `s_enum: -47
292s_nested_enum: 47
293`,
294 }, {
295 desc: "proto2 nested message not set",
296 input: &pb2.Nests{},
297 want: "\n",
298 }, {
299 desc: "proto2 nested message set to empty",
300 input: &pb2.Nests{
301 OptNested: &pb2.Nested{},
302 Optgroup: &pb2.Nests_OptGroup{},
303 },
304 want: `opt_nested: {}
Herbie Ong0dcfb9a2019-01-14 15:32:26 -0800305OptGroup: {}
Herbie Ong800c9902018-12-06 15:28:53 -0800306`,
307 }, {
308 desc: "proto2 nested messages",
309 input: &pb2.Nests{
310 OptNested: &pb2.Nested{
311 OptString: scalar.String("nested message"),
312 OptNested: &pb2.Nested{
313 OptString: scalar.String("another nested message"),
314 },
315 },
316 },
317 want: `opt_nested: {
318 opt_string: "nested message"
319 opt_nested: {
320 opt_string: "another nested message"
321 }
322}
323`,
324 }, {
Herbie Ong8170d692019-02-13 14:13:21 -0800325 desc: "proto2 groups",
Herbie Ong800c9902018-12-06 15:28:53 -0800326 input: &pb2.Nests{
327 Optgroup: &pb2.Nests_OptGroup{
Herbie Ong800c9902018-12-06 15:28:53 -0800328 OptString: scalar.String("inside a group"),
329 OptNested: &pb2.Nested{
330 OptString: scalar.String("nested message inside a group"),
331 },
332 Optnestedgroup: &pb2.Nests_OptGroup_OptNestedGroup{
Herbie Ong8170d692019-02-13 14:13:21 -0800333 OptFixed32: scalar.Uint32(47),
Herbie Ong800c9902018-12-06 15:28:53 -0800334 },
335 },
336 },
Herbie Ong0dcfb9a2019-01-14 15:32:26 -0800337 want: `OptGroup: {
Herbie Ong800c9902018-12-06 15:28:53 -0800338 opt_string: "inside a group"
339 opt_nested: {
340 opt_string: "nested message inside a group"
341 }
Herbie Ong0dcfb9a2019-01-14 15:32:26 -0800342 OptNestedGroup: {
Herbie Ong8170d692019-02-13 14:13:21 -0800343 opt_fixed32: 47
Herbie Ong800c9902018-12-06 15:28:53 -0800344 }
345}
346`,
347 }, {
348 desc: "proto3 nested message not set",
349 input: &pb3.Nests{},
350 want: "\n",
351 }, {
Herbie Ong8170d692019-02-13 14:13:21 -0800352 desc: "proto3 nested message set to empty",
353 input: &pb3.Nests{
354 SNested: &pb3.Nested{},
355 },
356 want: "s_nested: {}\n",
357 }, {
Herbie Ong800c9902018-12-06 15:28:53 -0800358 desc: "proto3 nested message",
359 input: &pb3.Nests{
360 SNested: &pb3.Nested{
361 SString: "nested message",
362 SNested: &pb3.Nested{
363 SString: "another nested message",
364 },
365 },
366 },
367 want: `s_nested: {
368 s_string: "nested message"
369 s_nested: {
370 s_string: "another nested message"
371 }
372}
373`,
374 }, {
Herbie Ong8170d692019-02-13 14:13:21 -0800375 desc: "oneof not set",
376 input: &pb3.Oneofs{},
Herbie Ong800c9902018-12-06 15:28:53 -0800377 want: "\n",
378 }, {
Herbie Ong8170d692019-02-13 14:13:21 -0800379 desc: "oneof set to empty string",
380 input: &pb3.Oneofs{
381 Union: &pb3.Oneofs_OneofString{},
Herbie Ong800c9902018-12-06 15:28:53 -0800382 },
Herbie Ong8170d692019-02-13 14:13:21 -0800383 want: `oneof_string: ""
384`,
Herbie Ong800c9902018-12-06 15:28:53 -0800385 }, {
Herbie Ong8170d692019-02-13 14:13:21 -0800386 desc: "oneof set to string",
387 input: &pb3.Oneofs{
388 Union: &pb3.Oneofs_OneofString{
389 OneofString: "hello",
Herbie Ong800c9902018-12-06 15:28:53 -0800390 },
391 },
Herbie Ong8170d692019-02-13 14:13:21 -0800392 want: `oneof_string: "hello"
393`,
Herbie Ong800c9902018-12-06 15:28:53 -0800394 }, {
Herbie Ong8170d692019-02-13 14:13:21 -0800395 desc: "oneof set to enum",
396 input: &pb3.Oneofs{
397 Union: &pb3.Oneofs_OneofEnum{
398 OneofEnum: pb3.Enum_ZERO,
Herbie Ong800c9902018-12-06 15:28:53 -0800399 },
400 },
Herbie Ong8170d692019-02-13 14:13:21 -0800401 want: `oneof_enum: ZERO
402`,
Herbie Ong800c9902018-12-06 15:28:53 -0800403 }, {
Herbie Ong8170d692019-02-13 14:13:21 -0800404 desc: "oneof set to empty message",
405 input: &pb3.Oneofs{
406 Union: &pb3.Oneofs_OneofNested{
407 OneofNested: &pb3.Nested{},
408 },
409 },
410 want: "oneof_nested: {}\n",
411 }, {
412 desc: "oneof set to message",
413 input: &pb3.Oneofs{
414 Union: &pb3.Oneofs_OneofNested{
415 OneofNested: &pb3.Nested{
416 SString: "nested message",
Herbie Ong800c9902018-12-06 15:28:53 -0800417 },
418 },
419 },
Herbie Ong8170d692019-02-13 14:13:21 -0800420 want: `oneof_nested: {
421 s_string: "nested message"
Herbie Ong800c9902018-12-06 15:28:53 -0800422}
423`,
424 }, {
Herbie Ong8170d692019-02-13 14:13:21 -0800425 desc: "repeated fields not set",
Herbie Ong800c9902018-12-06 15:28:53 -0800426 input: &pb2.Repeats{},
427 want: "\n",
428 }, {
Herbie Ong8170d692019-02-13 14:13:21 -0800429 desc: "repeated fields set to empty slices",
Herbie Ong800c9902018-12-06 15:28:53 -0800430 input: &pb2.Repeats{
Herbie Ongcddf8192018-11-28 18:25:20 -0800431 RptBool: []bool{},
432 RptInt32: []int32{},
433 RptInt64: []int64{},
434 RptUint32: []uint32{},
435 RptUint64: []uint64{},
436 RptFloat: []float32{},
437 RptDouble: []float64{},
438 RptBytes: [][]byte{},
Herbie Ong800c9902018-12-06 15:28:53 -0800439 },
Herbie Ongcddf8192018-11-28 18:25:20 -0800440 want: "\n",
441 }, {
Herbie Ong8170d692019-02-13 14:13:21 -0800442 desc: "repeated fields set to some values",
Herbie Ong800c9902018-12-06 15:28:53 -0800443 input: &pb2.Repeats{
Herbie Ongcddf8192018-11-28 18:25:20 -0800444 RptBool: []bool{true, false, true, true},
445 RptInt32: []int32{1, 6, 0, 0},
446 RptInt64: []int64{-64, 47},
447 RptUint32: []uint32{0xff, 0xffff},
448 RptUint64: []uint64{0xdeadbeef},
Herbie Ong84f09602019-01-17 19:31:47 -0800449 RptFloat: []float32{float32(math.NaN()), float32(math.Inf(1)), float32(math.Inf(-1)), 1.034},
Herbie Ongcddf8192018-11-28 18:25:20 -0800450 RptDouble: []float64{math.NaN(), math.Inf(1), math.Inf(-1), 1.23e-308},
451 RptString: []string{"hello", "世界"},
452 RptBytes: [][]byte{
453 []byte("hello"),
454 []byte("\xe4\xb8\x96\xe7\x95\x8c"),
455 },
Herbie Ong800c9902018-12-06 15:28:53 -0800456 },
Herbie Ongcddf8192018-11-28 18:25:20 -0800457 want: `rpt_bool: true
458rpt_bool: false
459rpt_bool: true
460rpt_bool: true
461rpt_int32: 1
462rpt_int32: 6
463rpt_int32: 0
464rpt_int32: 0
465rpt_int64: -64
466rpt_int64: 47
467rpt_uint32: 255
468rpt_uint32: 65535
469rpt_uint64: 3735928559
Herbie Ong84f09602019-01-17 19:31:47 -0800470rpt_float: nan
471rpt_float: inf
472rpt_float: -inf
473rpt_float: 1.034
Herbie Ongcddf8192018-11-28 18:25:20 -0800474rpt_double: nan
475rpt_double: inf
476rpt_double: -inf
477rpt_double: 1.23e-308
478rpt_string: "hello"
479rpt_string: "世界"
480rpt_bytes: "hello"
481rpt_bytes: "世界"
482`,
483 }, {
Herbie Ong8170d692019-02-13 14:13:21 -0800484 desc: "repeated enums",
Herbie Ong800c9902018-12-06 15:28:53 -0800485 input: &pb2.Enums{
Herbie Ong8170d692019-02-13 14:13:21 -0800486 RptEnum: []pb2.Enum{pb2.Enum_ONE, 2, pb2.Enum_TEN, 42},
Herbie Ongcddf8192018-11-28 18:25:20 -0800487 RptNestedEnum: []pb2.Enums_NestedEnum{2, 47, 10},
Herbie Ong800c9902018-12-06 15:28:53 -0800488 },
Herbie Ong8170d692019-02-13 14:13:21 -0800489 want: `rpt_enum: ONE
490rpt_enum: TWO
491rpt_enum: TEN
Herbie Ongcddf8192018-11-28 18:25:20 -0800492rpt_enum: 42
Herbie Ongcddf8192018-11-28 18:25:20 -0800493rpt_nested_enum: DOS
494rpt_nested_enum: 47
495rpt_nested_enum: DIEZ
496`,
497 }, {
Herbie Ong8170d692019-02-13 14:13:21 -0800498 desc: "repeated messages set to empty",
Herbie Ong800c9902018-12-06 15:28:53 -0800499 input: &pb2.Nests{
Herbie Ongcddf8192018-11-28 18:25:20 -0800500 RptNested: []*pb2.Nested{},
501 Rptgroup: []*pb2.Nests_RptGroup{},
Herbie Ong800c9902018-12-06 15:28:53 -0800502 },
503 want: "\n",
Herbie Ongcddf8192018-11-28 18:25:20 -0800504 }, {
Herbie Ong8170d692019-02-13 14:13:21 -0800505 desc: "repeated messages",
Herbie Ong800c9902018-12-06 15:28:53 -0800506 input: &pb2.Nests{
Herbie Ongcddf8192018-11-28 18:25:20 -0800507 RptNested: []*pb2.Nested{
508 {
509 OptString: scalar.String("repeat nested one"),
510 },
511 {
512 OptString: scalar.String("repeat nested two"),
513 OptNested: &pb2.Nested{
514 OptString: scalar.String("inside repeat nested two"),
515 },
516 },
517 {},
518 },
Herbie Ong800c9902018-12-06 15:28:53 -0800519 },
520 want: `rpt_nested: {
Herbie Ongcddf8192018-11-28 18:25:20 -0800521 opt_string: "repeat nested one"
522}
523rpt_nested: {
524 opt_string: "repeat nested two"
525 opt_nested: {
526 opt_string: "inside repeat nested two"
527 }
528}
529rpt_nested: {}
530`,
531 }, {
Herbie Ong8170d692019-02-13 14:13:21 -0800532 desc: "repeated messages contains nil value",
Herbie Ongf5db2df2019-02-07 20:17:45 -0800533 input: &pb2.Nests{
534 RptNested: []*pb2.Nested{nil, {}},
535 },
536 want: `rpt_nested: {}
537rpt_nested: {}
538`,
539 }, {
Herbie Ong8170d692019-02-13 14:13:21 -0800540 desc: "repeated groups",
Herbie Ong800c9902018-12-06 15:28:53 -0800541 input: &pb2.Nests{
Herbie Ongcddf8192018-11-28 18:25:20 -0800542 Rptgroup: []*pb2.Nests_RptGroup{
543 {
Herbie Ong8170d692019-02-13 14:13:21 -0800544 RptString: []string{"hello", "world"},
Herbie Ongcddf8192018-11-28 18:25:20 -0800545 },
546 {},
Herbie Ong8170d692019-02-13 14:13:21 -0800547 nil,
Herbie Ongcddf8192018-11-28 18:25:20 -0800548 },
Herbie Ong800c9902018-12-06 15:28:53 -0800549 },
Herbie Ongde7313b2019-01-14 19:26:50 -0800550 want: `RptGroup: {
Herbie Ong8170d692019-02-13 14:13:21 -0800551 rpt_string: "hello"
552 rpt_string: "world"
Herbie Ongcddf8192018-11-28 18:25:20 -0800553}
Herbie Ongde7313b2019-01-14 19:26:50 -0800554RptGroup: {}
Herbie Ong8170d692019-02-13 14:13:21 -0800555RptGroup: {}
Herbie Ongcddf8192018-11-28 18:25:20 -0800556`,
557 }, {
Herbie Ong8170d692019-02-13 14:13:21 -0800558 desc: "map fields not set",
559 input: &pb3.Maps{},
Herbie Ongcddf8192018-11-28 18:25:20 -0800560 want: "\n",
561 }, {
Herbie Ong8170d692019-02-13 14:13:21 -0800562 desc: "map fields set to empty",
563 input: &pb3.Maps{
564 Int32ToStr: map[int32]string{},
565 BoolToUint32: map[bool]uint32{},
566 Uint64ToEnum: map[uint64]pb3.Enum{},
567 StrToNested: map[string]*pb3.Nested{},
568 StrToOneofs: map[string]*pb3.Oneofs{},
Herbie Ong800c9902018-12-06 15:28:53 -0800569 },
Herbie Ongcddf8192018-11-28 18:25:20 -0800570 want: "\n",
571 }, {
572 desc: "map fields 1",
Herbie Ong8170d692019-02-13 14:13:21 -0800573 input: &pb3.Maps{
Herbie Ongcddf8192018-11-28 18:25:20 -0800574 Int32ToStr: map[int32]string{
575 -101: "-101",
576 0xff: "0xff",
577 0: "zero",
578 },
Herbie Ongcddf8192018-11-28 18:25:20 -0800579 BoolToUint32: map[bool]uint32{
580 true: 42,
581 false: 101,
582 },
Herbie Ong800c9902018-12-06 15:28:53 -0800583 },
Herbie Ongcddf8192018-11-28 18:25:20 -0800584 want: `int32_to_str: {
585 key: -101
586 value: "-101"
587}
588int32_to_str: {
589 key: 0
590 value: "zero"
591}
592int32_to_str: {
593 key: 255
594 value: "0xff"
595}
Herbie Ongcddf8192018-11-28 18:25:20 -0800596bool_to_uint32: {
597 key: false
598 value: 101
599}
600bool_to_uint32: {
601 key: true
602 value: 42
603}
604`,
605 }, {
606 desc: "map fields 2",
Herbie Ong8170d692019-02-13 14:13:21 -0800607 input: &pb3.Maps{
608 Uint64ToEnum: map[uint64]pb3.Enum{
609 1: pb3.Enum_ONE,
610 2: pb3.Enum_TWO,
611 10: pb3.Enum_TEN,
612 47: 47,
Herbie Ongcddf8192018-11-28 18:25:20 -0800613 },
Herbie Ong800c9902018-12-06 15:28:53 -0800614 },
Herbie Ongcddf8192018-11-28 18:25:20 -0800615 want: `uint64_to_enum: {
616 key: 1
Herbie Ong8170d692019-02-13 14:13:21 -0800617 value: ONE
Herbie Ongcddf8192018-11-28 18:25:20 -0800618}
619uint64_to_enum: {
620 key: 2
Herbie Ong8170d692019-02-13 14:13:21 -0800621 value: TWO
Herbie Ongcddf8192018-11-28 18:25:20 -0800622}
623uint64_to_enum: {
624 key: 10
Herbie Ong8170d692019-02-13 14:13:21 -0800625 value: TEN
626}
627uint64_to_enum: {
628 key: 47
629 value: 47
Herbie Ongcddf8192018-11-28 18:25:20 -0800630}
631`,
632 }, {
633 desc: "map fields 3",
Herbie Ong8170d692019-02-13 14:13:21 -0800634 input: &pb3.Maps{
635 StrToNested: map[string]*pb3.Nested{
636 "nested": &pb3.Nested{
637 SString: "nested in a map",
Herbie Ongcddf8192018-11-28 18:25:20 -0800638 },
639 },
Herbie Ong800c9902018-12-06 15:28:53 -0800640 },
Herbie Ongcddf8192018-11-28 18:25:20 -0800641 want: `str_to_nested: {
Herbie Ong8170d692019-02-13 14:13:21 -0800642 key: "nested"
Herbie Ongcddf8192018-11-28 18:25:20 -0800643 value: {
Herbie Ong8170d692019-02-13 14:13:21 -0800644 s_string: "nested in a map"
Herbie Ongcddf8192018-11-28 18:25:20 -0800645 }
646}
647`,
648 }, {
649 desc: "map fields 4",
Herbie Ong8170d692019-02-13 14:13:21 -0800650 input: &pb3.Maps{
651 StrToOneofs: map[string]*pb3.Oneofs{
652 "string": &pb3.Oneofs{
653 Union: &pb3.Oneofs_OneofString{
654 OneofString: "hello",
Herbie Ongcddf8192018-11-28 18:25:20 -0800655 },
656 },
Herbie Ong8170d692019-02-13 14:13:21 -0800657 "nested": &pb3.Oneofs{
658 Union: &pb3.Oneofs_OneofNested{
659 OneofNested: &pb3.Nested{
660 SString: "nested oneof in map field value",
Herbie Ongcddf8192018-11-28 18:25:20 -0800661 },
662 },
663 },
664 },
Herbie Ong800c9902018-12-06 15:28:53 -0800665 },
Herbie Ongcddf8192018-11-28 18:25:20 -0800666 want: `str_to_oneofs: {
667 key: "nested"
668 value: {
Herbie Ong8170d692019-02-13 14:13:21 -0800669 oneof_nested: {
670 s_string: "nested oneof in map field value"
Herbie Ongcddf8192018-11-28 18:25:20 -0800671 }
672 }
673}
674str_to_oneofs: {
675 key: "string"
676 value: {
Herbie Ong8170d692019-02-13 14:13:21 -0800677 oneof_string: "hello"
Herbie Ongcddf8192018-11-28 18:25:20 -0800678 }
679}
680`,
681 }, {
Herbie Ong8170d692019-02-13 14:13:21 -0800682 desc: "map field contains nil value",
683 input: &pb3.Maps{
684 StrToNested: map[string]*pb3.Nested{
Herbie Ongf5db2df2019-02-07 20:17:45 -0800685 "nil": nil,
686 },
687 },
688 want: `str_to_nested: {
689 key: "nil"
690 value: {}
691}
692`,
693 }, {
Herbie Ong800c9902018-12-06 15:28:53 -0800694 desc: "proto2 required fields not set",
695 input: &pb2.Requireds{},
696 want: "\n",
697 wantErr: true,
Herbie Ongcddf8192018-11-28 18:25:20 -0800698 }, {
Herbie Ong800c9902018-12-06 15:28:53 -0800699 desc: "proto2 required fields partially set",
700 input: &pb2.Requireds{
701 ReqBool: scalar.Bool(false),
Herbie Ong800c9902018-12-06 15:28:53 -0800702 ReqSfixed64: scalar.Int64(0xbeefcafe),
703 ReqDouble: scalar.Float64(math.NaN()),
704 ReqString: scalar.String("hello"),
Herbie Ong8170d692019-02-13 14:13:21 -0800705 ReqEnum: pb2.Enum_ONE.Enum(),
Herbie Ong800c9902018-12-06 15:28:53 -0800706 },
707 want: `req_bool: false
Herbie Ong800c9902018-12-06 15:28:53 -0800708req_sfixed64: 3203386110
709req_double: nan
710req_string: "hello"
Herbie Ong8170d692019-02-13 14:13:21 -0800711req_enum: ONE
Herbie Ong800c9902018-12-06 15:28:53 -0800712`,
713 wantErr: true,
714 }, {
715 desc: "proto2 required fields all set",
716 input: &pb2.Requireds{
717 ReqBool: scalar.Bool(false),
Herbie Ong800c9902018-12-06 15:28:53 -0800718 ReqSfixed64: scalar.Int64(0),
Herbie Ong8170d692019-02-13 14:13:21 -0800719 ReqDouble: scalar.Float64(1.23),
Herbie Ong800c9902018-12-06 15:28:53 -0800720 ReqString: scalar.String(""),
Herbie Ong8170d692019-02-13 14:13:21 -0800721 ReqEnum: pb2.Enum_ONE.Enum(),
Herbie Ong800c9902018-12-06 15:28:53 -0800722 ReqNested: &pb2.Nested{},
723 },
724 want: `req_bool: false
Herbie Ong800c9902018-12-06 15:28:53 -0800725req_sfixed64: 0
Herbie Ong8170d692019-02-13 14:13:21 -0800726req_double: 1.23
Herbie Ong800c9902018-12-06 15:28:53 -0800727req_string: ""
Herbie Ong8170d692019-02-13 14:13:21 -0800728req_enum: ONE
Herbie Ong800c9902018-12-06 15:28:53 -0800729req_nested: {}
Herbie Ongcddf8192018-11-28 18:25:20 -0800730`,
731 }, {
Herbie Ong800c9902018-12-06 15:28:53 -0800732 desc: "indirect required field",
733 input: &pb2.IndirectRequired{
734 OptNested: &pb2.NestedWithRequired{},
735 },
736 want: "opt_nested: {}\n",
737 wantErr: true,
Herbie Ongcddf8192018-11-28 18:25:20 -0800738 }, {
Herbie Ong800c9902018-12-06 15:28:53 -0800739 desc: "indirect required field in empty repeated",
740 input: &pb2.IndirectRequired{
741 RptNested: []*pb2.NestedWithRequired{},
742 },
743 want: "\n",
Herbie Ongcddf8192018-11-28 18:25:20 -0800744 }, {
Herbie Ong800c9902018-12-06 15:28:53 -0800745 desc: "indirect required field in repeated",
746 input: &pb2.IndirectRequired{
747 RptNested: []*pb2.NestedWithRequired{
748 &pb2.NestedWithRequired{},
Herbie Ongcddf8192018-11-28 18:25:20 -0800749 },
Herbie Ong800c9902018-12-06 15:28:53 -0800750 },
751 want: "rpt_nested: {}\n",
752 wantErr: true,
753 }, {
754 desc: "indirect required field in empty map",
755 input: &pb2.IndirectRequired{
756 StrToNested: map[string]*pb2.NestedWithRequired{},
757 },
758 want: "\n",
759 }, {
760 desc: "indirect required field in map",
761 input: &pb2.IndirectRequired{
762 StrToNested: map[string]*pb2.NestedWithRequired{
763 "fail": &pb2.NestedWithRequired{},
764 },
765 },
766 want: `str_to_nested: {
767 key: "fail"
768 value: {}
Herbie Ongcddf8192018-11-28 18:25:20 -0800769}
770`,
Herbie Ong800c9902018-12-06 15:28:53 -0800771 wantErr: true,
Herbie Ong20a1d312018-12-11 21:08:58 -0800772 }, {
Herbie Ong8170d692019-02-13 14:13:21 -0800773 desc: "indirect required field in oneof",
774 input: &pb2.IndirectRequired{
775 Union: &pb2.IndirectRequired_OneofNested{
776 OneofNested: &pb2.NestedWithRequired{},
777 },
778 },
779 want: "oneof_nested: {}\n",
780 wantErr: true,
781 }, {
Herbie Ong20a1d312018-12-11 21:08:58 -0800782 desc: "unknown varint and fixed types",
783 input: &pb2.Scalars{
784 OptString: scalar.String("this message contains unknown fields"),
785 XXX_unrecognized: pack.Message{
786 pack.Tag{101, pack.VarintType}, pack.Bool(true),
787 pack.Tag{102, pack.VarintType}, pack.Varint(0xff),
788 pack.Tag{103, pack.Fixed32Type}, pack.Uint32(47),
789 pack.Tag{104, pack.Fixed64Type}, pack.Int64(0xdeadbeef),
790 }.Marshal(),
791 },
792 want: `opt_string: "this message contains unknown fields"
793101: 1
794102: 255
795103: 47
796104: 3735928559
797`,
798 }, {
799 desc: "unknown length-delimited",
800 input: &pb2.Scalars{
801 XXX_unrecognized: pack.Message{
802 pack.Tag{101, pack.BytesType}, pack.LengthPrefix{pack.Bool(true), pack.Bool(false)},
803 pack.Tag{102, pack.BytesType}, pack.String("hello world"),
804 pack.Tag{103, pack.BytesType}, pack.Bytes("\xe4\xb8\x96\xe7\x95\x8c"),
805 }.Marshal(),
806 },
807 want: `101: "\x01\x00"
808102: "hello world"
809103: "世界"
810`,
811 }, {
812 desc: "unknown group type",
813 input: &pb2.Scalars{
814 XXX_unrecognized: pack.Message{
815 pack.Tag{101, pack.StartGroupType}, pack.Tag{101, pack.EndGroupType},
816 pack.Tag{102, pack.StartGroupType},
817 pack.Tag{101, pack.VarintType}, pack.Bool(false),
818 pack.Tag{102, pack.BytesType}, pack.String("inside a group"),
819 pack.Tag{102, pack.EndGroupType},
820 }.Marshal(),
821 },
822 want: `101: {}
823102: {
824 101: 0
825 102: "inside a group"
826}
827`,
828 }, {
829 desc: "unknown unpack repeated field",
830 input: &pb2.Scalars{
831 XXX_unrecognized: pack.Message{
832 pack.Tag{101, pack.BytesType}, pack.LengthPrefix{pack.Bool(true), pack.Bool(false), pack.Bool(true)},
833 pack.Tag{102, pack.BytesType}, pack.String("hello"),
834 pack.Tag{101, pack.VarintType}, pack.Bool(true),
835 pack.Tag{102, pack.BytesType}, pack.String("世界"),
836 }.Marshal(),
837 },
838 want: `101: "\x01\x00\x01"
839101: 1
840102: "hello"
841102: "世界"
842`,
Herbie Ongcf253082018-12-17 17:13:07 -0800843 }, {
844 desc: "extensions of non-repeated fields",
845 input: func() proto.Message {
846 m := &pb2.Extensions{
847 OptString: scalar.String("non-extension field"),
848 OptBool: scalar.Bool(true),
849 OptInt32: scalar.Int32(42),
850 }
851 setExtension(m, pb2.E_OptExtBool, true)
852 setExtension(m, pb2.E_OptExtString, "extension field")
Herbie Ong8170d692019-02-13 14:13:21 -0800853 setExtension(m, pb2.E_OptExtEnum, pb2.Enum_TEN)
Herbie Ongcf253082018-12-17 17:13:07 -0800854 setExtension(m, pb2.E_OptExtNested, &pb2.Nested{
855 OptString: scalar.String("nested in an extension"),
856 OptNested: &pb2.Nested{
857 OptString: scalar.String("another nested in an extension"),
858 },
859 })
860 return m
861 }(),
862 want: `opt_string: "non-extension field"
863opt_bool: true
864opt_int32: 42
865[pb2.opt_ext_bool]: true
Herbie Ong8170d692019-02-13 14:13:21 -0800866[pb2.opt_ext_enum]: TEN
Herbie Ongcf253082018-12-17 17:13:07 -0800867[pb2.opt_ext_nested]: {
868 opt_string: "nested in an extension"
869 opt_nested: {
870 opt_string: "another nested in an extension"
871 }
872}
873[pb2.opt_ext_string]: "extension field"
874`,
875 }, {
Herbie Ong8170d692019-02-13 14:13:21 -0800876 desc: "extension message field set to nil",
Herbie Ongcf253082018-12-17 17:13:07 -0800877 input: func() proto.Message {
878 m := &pb2.Extensions{}
879 setExtension(m, pb2.E_OptExtNested, nil)
880 return m
881 }(),
882 want: "\n",
883 }, {
884 desc: "extensions of repeated fields",
885 input: func() proto.Message {
886 m := &pb2.Extensions{}
Herbie Ong8170d692019-02-13 14:13:21 -0800887 setExtension(m, pb2.E_RptExtEnum, &[]pb2.Enum{pb2.Enum_TEN, 101, pb2.Enum_ONE})
Herbie Ongcf253082018-12-17 17:13:07 -0800888 setExtension(m, pb2.E_RptExtFixed32, &[]uint32{42, 47})
889 setExtension(m, pb2.E_RptExtNested, &[]*pb2.Nested{
890 &pb2.Nested{OptString: scalar.String("one")},
891 &pb2.Nested{OptString: scalar.String("two")},
892 &pb2.Nested{OptString: scalar.String("three")},
893 })
894 return m
895 }(),
Herbie Ong8170d692019-02-13 14:13:21 -0800896 want: `[pb2.rpt_ext_enum]: TEN
Herbie Ongcf253082018-12-17 17:13:07 -0800897[pb2.rpt_ext_enum]: 101
Herbie Ong8170d692019-02-13 14:13:21 -0800898[pb2.rpt_ext_enum]: ONE
Herbie Ongcf253082018-12-17 17:13:07 -0800899[pb2.rpt_ext_fixed32]: 42
900[pb2.rpt_ext_fixed32]: 47
901[pb2.rpt_ext_nested]: {
902 opt_string: "one"
903}
904[pb2.rpt_ext_nested]: {
905 opt_string: "two"
906}
907[pb2.rpt_ext_nested]: {
908 opt_string: "three"
909}
910`,
911 }, {
912 desc: "extensions of non-repeated fields in another message",
913 input: func() proto.Message {
914 m := &pb2.Extensions{}
915 setExtension(m, pb2.E_ExtensionsContainer_OptExtBool, true)
916 setExtension(m, pb2.E_ExtensionsContainer_OptExtString, "extension field")
Herbie Ong8170d692019-02-13 14:13:21 -0800917 setExtension(m, pb2.E_ExtensionsContainer_OptExtEnum, pb2.Enum_TEN)
Herbie Ongcf253082018-12-17 17:13:07 -0800918 setExtension(m, pb2.E_ExtensionsContainer_OptExtNested, &pb2.Nested{
919 OptString: scalar.String("nested in an extension"),
920 OptNested: &pb2.Nested{
921 OptString: scalar.String("another nested in an extension"),
922 },
923 })
924 return m
925 }(),
926 want: `[pb2.ExtensionsContainer.opt_ext_bool]: true
Herbie Ong8170d692019-02-13 14:13:21 -0800927[pb2.ExtensionsContainer.opt_ext_enum]: TEN
Herbie Ongcf253082018-12-17 17:13:07 -0800928[pb2.ExtensionsContainer.opt_ext_nested]: {
929 opt_string: "nested in an extension"
930 opt_nested: {
931 opt_string: "another nested in an extension"
932 }
933}
934[pb2.ExtensionsContainer.opt_ext_string]: "extension field"
935`,
936 }, {
937 desc: "extensions of repeated fields in another message",
938 input: func() proto.Message {
939 m := &pb2.Extensions{
940 OptString: scalar.String("non-extension field"),
941 OptBool: scalar.Bool(true),
942 OptInt32: scalar.Int32(42),
943 }
Herbie Ong8170d692019-02-13 14:13:21 -0800944 setExtension(m, pb2.E_ExtensionsContainer_RptExtEnum, &[]pb2.Enum{pb2.Enum_TEN, 101, pb2.Enum_ONE})
Herbie Ongcf253082018-12-17 17:13:07 -0800945 setExtension(m, pb2.E_ExtensionsContainer_RptExtString, &[]string{"hello", "world"})
946 setExtension(m, pb2.E_ExtensionsContainer_RptExtNested, &[]*pb2.Nested{
947 &pb2.Nested{OptString: scalar.String("one")},
948 &pb2.Nested{OptString: scalar.String("two")},
949 &pb2.Nested{OptString: scalar.String("three")},
950 })
951 return m
952 }(),
953 want: `opt_string: "non-extension field"
954opt_bool: true
955opt_int32: 42
Herbie Ong8170d692019-02-13 14:13:21 -0800956[pb2.ExtensionsContainer.rpt_ext_enum]: TEN
Herbie Ongcf253082018-12-17 17:13:07 -0800957[pb2.ExtensionsContainer.rpt_ext_enum]: 101
Herbie Ong8170d692019-02-13 14:13:21 -0800958[pb2.ExtensionsContainer.rpt_ext_enum]: ONE
Herbie Ongcf253082018-12-17 17:13:07 -0800959[pb2.ExtensionsContainer.rpt_ext_nested]: {
960 opt_string: "one"
961}
962[pb2.ExtensionsContainer.rpt_ext_nested]: {
963 opt_string: "two"
964}
965[pb2.ExtensionsContainer.rpt_ext_nested]: {
966 opt_string: "three"
967}
968[pb2.ExtensionsContainer.rpt_ext_string]: "hello"
969[pb2.ExtensionsContainer.rpt_ext_string]: "world"
970`,
Herbie Ong6470ea62019-01-07 18:56:57 -0800971 }, {
972 desc: "MessageSet",
973 input: func() proto.Message {
974 m := &pb2.MessageSet{}
975 setExtension(m, pb2.E_MessageSetExtension_MessageSetExtension, &pb2.MessageSetExtension{
976 OptString: scalar.String("a messageset extension"),
977 })
978 setExtension(m, pb2.E_MessageSetExtension_NotMessageSetExtension, &pb2.MessageSetExtension{
979 OptString: scalar.String("not a messageset extension"),
980 })
981 setExtension(m, pb2.E_MessageSetExtension_ExtNested, &pb2.Nested{
982 OptString: scalar.String("just a regular extension"),
983 })
984 return m
985 }(),
986 want: `[pb2.MessageSetExtension]: {
987 opt_string: "a messageset extension"
988}
989[pb2.MessageSetExtension.ext_nested]: {
990 opt_string: "just a regular extension"
991}
992[pb2.MessageSetExtension.not_message_set_extension]: {
993 opt_string: "not a messageset extension"
994}
995`,
996 }, {
997 desc: "not real MessageSet 1",
998 input: func() proto.Message {
999 m := &pb2.FakeMessageSet{}
1000 setExtension(m, pb2.E_FakeMessageSetExtension_MessageSetExtension, &pb2.FakeMessageSetExtension{
1001 OptString: scalar.String("not a messageset extension"),
1002 })
1003 return m
1004 }(),
1005 want: `[pb2.FakeMessageSetExtension.message_set_extension]: {
1006 opt_string: "not a messageset extension"
1007}
1008`,
1009 }, {
1010 desc: "not real MessageSet 2",
1011 input: func() proto.Message {
1012 m := &pb2.MessageSet{}
1013 setExtension(m, pb2.E_MessageSetExtension, &pb2.FakeMessageSetExtension{
1014 OptString: scalar.String("another not a messageset extension"),
1015 })
1016 return m
1017 }(),
1018 want: `[pb2.message_set_extension]: {
1019 opt_string: "another not a messageset extension"
1020}
1021`,
Herbie Ongf42b55f2019-01-02 15:46:07 -08001022 }, {
Herbie Ong8170d692019-02-13 14:13:21 -08001023 desc: "Any not expanded",
Herbie Ong66c365c2019-01-04 14:08:41 -08001024 mo: textpb.MarshalOptions{
1025 Resolver: preg.NewTypes(),
1026 },
Herbie Ongf42b55f2019-01-02 15:46:07 -08001027 input: func() proto.Message {
1028 m := &pb2.Nested{
1029 OptString: scalar.String("embedded inside Any"),
1030 OptNested: &pb2.Nested{
1031 OptString: scalar.String("inception"),
1032 },
1033 }
1034 // TODO: Switch to V2 marshal when ready.
1035 b, err := protoV1.Marshal(m)
1036 if err != nil {
1037 t.Fatalf("error in binary marshaling message for Any.value: %v", err)
1038 }
Joe Tsai19058432019-02-27 21:46:29 -08001039 return wrapV1Message(&knownpb.Any{
Herbie Ong66c365c2019-01-04 14:08:41 -08001040 TypeUrl: "pb2.Nested",
Herbie Ongf42b55f2019-01-02 15:46:07 -08001041 Value: b,
Herbie Ong66c365c2019-01-04 14:08:41 -08001042 })
Herbie Ongf42b55f2019-01-02 15:46:07 -08001043 }(),
1044 want: `type_url: "pb2.Nested"
1045value: "\n\x13embedded inside Any\x12\x0b\n\tinception"
1046`,
1047 }, {
Herbie Ong8170d692019-02-13 14:13:21 -08001048 desc: "Any expanded",
Herbie Ong66c365c2019-01-04 14:08:41 -08001049 mo: textpb.MarshalOptions{
1050 Resolver: preg.NewTypes((&pb2.Nested{}).ProtoReflect().Type()),
1051 },
Herbie Ongf42b55f2019-01-02 15:46:07 -08001052 input: func() proto.Message {
1053 m := &pb2.Nested{
1054 OptString: scalar.String("embedded inside Any"),
1055 OptNested: &pb2.Nested{
1056 OptString: scalar.String("inception"),
1057 },
1058 }
1059 // TODO: Switch to V2 marshal when ready.
1060 b, err := protoV1.Marshal(m)
1061 if err != nil {
1062 t.Fatalf("error in binary marshaling message for Any.value: %v", err)
1063 }
Joe Tsai19058432019-02-27 21:46:29 -08001064 return wrapV1Message(&knownpb.Any{
Herbie Ong66c365c2019-01-04 14:08:41 -08001065 TypeUrl: "foo/pb2.Nested",
Herbie Ongf42b55f2019-01-02 15:46:07 -08001066 Value: b,
Herbie Ong66c365c2019-01-04 14:08:41 -08001067 })
Herbie Ongf42b55f2019-01-02 15:46:07 -08001068 }(),
Herbie Ong66c365c2019-01-04 14:08:41 -08001069 want: `[foo/pb2.Nested]: {
Herbie Ongf42b55f2019-01-02 15:46:07 -08001070 opt_string: "embedded inside Any"
1071 opt_nested: {
1072 opt_string: "inception"
1073 }
1074}
1075`,
1076 }, {
Herbie Ong8170d692019-02-13 14:13:21 -08001077 desc: "Any expanded with missing required error",
Herbie Ong66c365c2019-01-04 14:08:41 -08001078 mo: textpb.MarshalOptions{
1079 Resolver: preg.NewTypes((&pb2.PartialRequired{}).ProtoReflect().Type()),
1080 },
Herbie Ongf42b55f2019-01-02 15:46:07 -08001081 input: func() proto.Message {
1082 m := &pb2.PartialRequired{
1083 OptString: scalar.String("embedded inside Any"),
1084 }
1085 // TODO: Switch to V2 marshal when ready.
1086 b, err := protoV1.Marshal(m)
1087 // Ignore required not set error.
1088 if _, ok := err.(*protoV1.RequiredNotSetError); !ok {
1089 t.Fatalf("error in binary marshaling message for Any.value: %v", err)
1090 }
Joe Tsai19058432019-02-27 21:46:29 -08001091 return wrapV1Message(&knownpb.Any{
Herbie Ongf42b55f2019-01-02 15:46:07 -08001092 TypeUrl: string(m.ProtoReflect().Type().FullName()),
1093 Value: b,
Herbie Ong66c365c2019-01-04 14:08:41 -08001094 })
Herbie Ongf42b55f2019-01-02 15:46:07 -08001095 }(),
1096 want: `[pb2.PartialRequired]: {
1097 opt_string: "embedded inside Any"
1098}
1099`,
1100 wantErr: true,
1101 }, {
Herbie Ong8170d692019-02-13 14:13:21 -08001102 desc: "Any with invalid value",
Herbie Ong66c365c2019-01-04 14:08:41 -08001103 mo: textpb.MarshalOptions{
1104 Resolver: preg.NewTypes((&pb2.Nested{}).ProtoReflect().Type()),
1105 },
Joe Tsai19058432019-02-27 21:46:29 -08001106 input: wrapV1Message(&knownpb.Any{
Herbie Ong66c365c2019-01-04 14:08:41 -08001107 TypeUrl: "foo/pb2.Nested",
1108 Value: dhex("80"),
1109 }),
1110 want: `type_url: "foo/pb2.Nested"
Herbie Onga94f78c2019-01-03 15:39:58 -08001111value: "\x80"
1112`,
Herbie Ongcddf8192018-11-28 18:25:20 -08001113 }}
1114
1115 for _, tt := range tests {
1116 tt := tt
1117 t.Run(tt.desc, func(t *testing.T) {
1118 t.Parallel()
Herbie Ongf42b55f2019-01-02 15:46:07 -08001119 b, err := tt.mo.Marshal(tt.input)
Herbie Ongcddf8192018-11-28 18:25:20 -08001120 if err != nil && !tt.wantErr {
Herbie Ongf42b55f2019-01-02 15:46:07 -08001121 t.Errorf("Marshal() returned error: %v\n", err)
Herbie Ongcddf8192018-11-28 18:25:20 -08001122 }
Herbie Ong800c9902018-12-06 15:28:53 -08001123 if err == nil && tt.wantErr {
Herbie Ongf42b55f2019-01-02 15:46:07 -08001124 t.Error("Marshal() got nil error, want error\n")
Herbie Ongcddf8192018-11-28 18:25:20 -08001125 }
Herbie Ong800c9902018-12-06 15:28:53 -08001126 got := string(b)
1127 if tt.want != "" && got != tt.want {
1128 t.Errorf("Marshal()\n<got>\n%v\n<want>\n%v\n", got, tt.want)
1129 if diff := cmp.Diff(tt.want, got, splitLines); diff != "" {
Herbie Ongcddf8192018-11-28 18:25:20 -08001130 t.Errorf("Marshal() diff -want +got\n%v\n", diff)
1131 }
1132 }
1133 })
1134 }
1135}