blob: 3430fc584f18851c7bbd077905930d024b94af09 [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 Ongcddf8192018-11-28 18:25:20 -080020 "github.com/golang/protobuf/v2/internal/scalar"
21 "github.com/golang/protobuf/v2/proto"
Herbie Ongf42b55f2019-01-02 15:46:07 -080022 preg "github.com/golang/protobuf/v2/reflect/protoregistry"
Herbie Ongcddf8192018-11-28 18:25:20 -080023 "github.com/google/go-cmp/cmp"
24 "github.com/google/go-cmp/cmp/cmpopts"
25
Herbie Ong8170d692019-02-13 14:13:21 -080026 "github.com/golang/protobuf/v2/encoding/testprotos/pb2"
27 "github.com/golang/protobuf/v2/encoding/testprotos/pb3"
Joe Tsai19058432019-02-27 21:46:29 -080028 knownpb "github.com/golang/protobuf/v2/types/known"
Herbie Ongcddf8192018-11-28 18:25:20 -080029)
30
31func init() {
32 // Disable detrand to enable direct comparisons on outputs.
33 detrand.Disable()
34}
35
Herbie Ongcddf8192018-11-28 18:25:20 -080036// splitLines is a cmpopts.Option for comparing strings with line breaks.
37var splitLines = cmpopts.AcyclicTransformer("SplitLines", func(s string) []string {
38 return strings.Split(s, "\n")
39})
40
Herbie Ong800c9902018-12-06 15:28:53 -080041func pb2Enum(i int32) *pb2.Enum {
42 p := new(pb2.Enum)
43 *p = pb2.Enum(i)
44 return p
45}
46
47func pb2Enums_NestedEnum(i int32) *pb2.Enums_NestedEnum {
48 p := new(pb2.Enums_NestedEnum)
49 *p = pb2.Enums_NestedEnum(i)
50 return p
51}
52
Herbie Ongcf253082018-12-17 17:13:07 -080053func setExtension(m proto.Message, xd *protoapi.ExtensionDesc, val interface{}) {
Herbie Ongcf253082018-12-17 17:13:07 -080054 knownFields := m.ProtoReflect().KnownFields()
55 extTypes := knownFields.ExtensionTypes()
Joe Tsaiafb455e2019-03-14 16:08:22 -070056 extTypes.Register(xd.Type)
Herbie Ongcf253082018-12-17 17:13:07 -080057 if val == nil {
58 return
59 }
Joe Tsaiafb455e2019-03-14 16:08:22 -070060 pval := xd.Type.ValueOf(val)
Herbie Ongcf253082018-12-17 17:13:07 -080061 knownFields.Set(wire.Number(xd.Field), pval)
62}
63
Joe Tsai19058432019-02-27 21:46:29 -080064func wrapV1Message(any *knownpb.Any) proto.Message {
Herbie Ong66c365c2019-01-04 14:08:41 -080065 return impl.Export{}.MessageOf(any).Interface()
66}
67
Herbie Onga94f78c2019-01-03 15:39:58 -080068// dhex decodes a hex-string and returns the bytes and panics if s is invalid.
69func dhex(s string) []byte {
70 b, err := hex.DecodeString(s)
71 if err != nil {
72 panic(err)
73 }
74 return b
75}
76
Herbie Ongcddf8192018-11-28 18:25:20 -080077func TestMarshal(t *testing.T) {
78 tests := []struct {
79 desc string
Herbie Ongf42b55f2019-01-02 15:46:07 -080080 mo textpb.MarshalOptions
Herbie Ong70651952018-12-13 14:19:50 -080081 input proto.Message
Herbie Ongcddf8192018-11-28 18:25:20 -080082 want string
83 wantErr bool
84 }{{
Herbie Ong8170d692019-02-13 14:13:21 -080085 desc: "proto2 optional scalars not set",
Herbie Ong800c9902018-12-06 15:28:53 -080086 input: &pb2.Scalars{},
Herbie Ongcddf8192018-11-28 18:25:20 -080087 want: "\n",
88 }, {
Herbie Ong8170d692019-02-13 14:13:21 -080089 desc: "proto3 scalars not set",
Herbie Ong800c9902018-12-06 15:28:53 -080090 input: &pb3.Scalars{},
Herbie Ongcddf8192018-11-28 18:25:20 -080091 want: "\n",
92 }, {
Herbie Ong8170d692019-02-13 14:13:21 -080093 desc: "proto2 optional scalars set to zero values",
Herbie Ong800c9902018-12-06 15:28:53 -080094 input: &pb2.Scalars{
Herbie Ongcddf8192018-11-28 18:25:20 -080095 OptBool: scalar.Bool(false),
96 OptInt32: scalar.Int32(0),
97 OptInt64: scalar.Int64(0),
98 OptUint32: scalar.Uint32(0),
99 OptUint64: scalar.Uint64(0),
100 OptSint32: scalar.Int32(0),
101 OptSint64: scalar.Int64(0),
102 OptFixed32: scalar.Uint32(0),
103 OptFixed64: scalar.Uint64(0),
104 OptSfixed32: scalar.Int32(0),
105 OptSfixed64: scalar.Int64(0),
106 OptFloat: scalar.Float32(0),
107 OptDouble: scalar.Float64(0),
108 OptBytes: []byte{},
109 OptString: scalar.String(""),
Herbie Ong800c9902018-12-06 15:28:53 -0800110 },
Herbie Ongcddf8192018-11-28 18:25:20 -0800111 want: `opt_bool: false
112opt_int32: 0
113opt_int64: 0
114opt_uint32: 0
115opt_uint64: 0
116opt_sint32: 0
117opt_sint64: 0
118opt_fixed32: 0
119opt_fixed64: 0
120opt_sfixed32: 0
121opt_sfixed64: 0
122opt_float: 0
123opt_double: 0
124opt_bytes: ""
125opt_string: ""
126`,
127 }, {
Herbie Ong8170d692019-02-13 14:13:21 -0800128 desc: "proto3 scalars set to zero values",
Herbie Ong800c9902018-12-06 15:28:53 -0800129 input: &pb3.Scalars{
Herbie Ongcddf8192018-11-28 18:25:20 -0800130 SBool: false,
131 SInt32: 0,
132 SInt64: 0,
133 SUint32: 0,
134 SUint64: 0,
135 SSint32: 0,
136 SSint64: 0,
137 SFixed32: 0,
138 SFixed64: 0,
139 SSfixed32: 0,
140 SSfixed64: 0,
141 SFloat: 0,
142 SDouble: 0,
143 SBytes: []byte{},
144 SString: "",
Herbie Ong800c9902018-12-06 15:28:53 -0800145 },
Herbie Ongcddf8192018-11-28 18:25:20 -0800146 want: "\n",
147 }, {
Herbie Ong8170d692019-02-13 14:13:21 -0800148 desc: "proto2 optional scalars set to some values",
Herbie Ong800c9902018-12-06 15:28:53 -0800149 input: &pb2.Scalars{
Herbie Ongcddf8192018-11-28 18:25:20 -0800150 OptBool: scalar.Bool(true),
151 OptInt32: scalar.Int32(0xff),
152 OptInt64: scalar.Int64(0xdeadbeef),
153 OptUint32: scalar.Uint32(47),
154 OptUint64: scalar.Uint64(0xdeadbeef),
155 OptSint32: scalar.Int32(-1001),
156 OptSint64: scalar.Int64(-0xffff),
157 OptFixed64: scalar.Uint64(64),
158 OptSfixed32: scalar.Int32(-32),
Herbie Ong84f09602019-01-17 19:31:47 -0800159 OptFloat: scalar.Float32(1.02),
160 OptDouble: scalar.Float64(1.0199999809265137),
Herbie Ong8170d692019-02-13 14:13:21 -0800161 OptBytes: []byte("\xe8\xb0\xb7\xe6\xad\x8c"),
162 OptString: scalar.String("谷歌"),
Herbie Ong800c9902018-12-06 15:28:53 -0800163 },
Herbie Ongcddf8192018-11-28 18:25:20 -0800164 want: `opt_bool: true
165opt_int32: 255
166opt_int64: 3735928559
167opt_uint32: 47
168opt_uint64: 3735928559
169opt_sint32: -1001
170opt_sint64: -65535
171opt_fixed64: 64
172opt_sfixed32: -32
Herbie Ong84f09602019-01-17 19:31:47 -0800173opt_float: 1.02
174opt_double: 1.0199999809265137
Herbie Ongcddf8192018-11-28 18:25:20 -0800175opt_bytes: "谷歌"
176opt_string: "谷歌"
177`,
178 }, {
Herbie Ong8170d692019-02-13 14:13:21 -0800179 desc: "float nan",
Herbie Ong800c9902018-12-06 15:28:53 -0800180 input: &pb3.Scalars{
Herbie Ongcddf8192018-11-28 18:25:20 -0800181 SFloat: float32(math.NaN()),
Herbie Ong800c9902018-12-06 15:28:53 -0800182 },
Herbie Ongcddf8192018-11-28 18:25:20 -0800183 want: "s_float: nan\n",
184 }, {
Herbie Ong8170d692019-02-13 14:13:21 -0800185 desc: "float positive 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: "float negative infinity",
Herbie Ong800c9902018-12-06 15:28:53 -0800192 input: &pb3.Scalars{
Herbie Ongcddf8192018-11-28 18:25:20 -0800193 SFloat: float32(math.Inf(-1)),
Herbie Ong800c9902018-12-06 15:28:53 -0800194 },
Herbie Ongcddf8192018-11-28 18:25:20 -0800195 want: "s_float: -inf\n",
196 }, {
Herbie Ong8170d692019-02-13 14:13:21 -0800197 desc: "double nan",
Herbie Ong800c9902018-12-06 15:28:53 -0800198 input: &pb3.Scalars{
Herbie Ongcddf8192018-11-28 18:25:20 -0800199 SDouble: math.NaN(),
Herbie Ong800c9902018-12-06 15:28:53 -0800200 },
Herbie Ongcddf8192018-11-28 18:25:20 -0800201 want: "s_double: nan\n",
202 }, {
Herbie Ong8170d692019-02-13 14:13:21 -0800203 desc: "double positive 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 Ong8170d692019-02-13 14:13:21 -0800209 desc: "double negative infinity",
Herbie Ong800c9902018-12-06 15:28:53 -0800210 input: &pb3.Scalars{
Herbie Ongcddf8192018-11-28 18:25:20 -0800211 SDouble: math.Inf(-1),
Herbie Ong800c9902018-12-06 15:28:53 -0800212 },
Herbie Ongcddf8192018-11-28 18:25:20 -0800213 want: "s_double: -inf\n",
214 }, {
Herbie Ong800c9902018-12-06 15:28:53 -0800215 desc: "proto2 enum not set",
216 input: &pb2.Enums{},
Herbie Ongcddf8192018-11-28 18:25:20 -0800217 want: "\n",
218 }, {
Herbie Ong800c9902018-12-06 15:28:53 -0800219 desc: "proto2 enum set to zero value",
220 input: &pb2.Enums{
Herbie Ong8170d692019-02-13 14:13:21 -0800221 OptEnum: pb2Enum(0),
Herbie Ong800c9902018-12-06 15:28:53 -0800222 OptNestedEnum: pb2Enums_NestedEnum(0),
223 },
Herbie Ong8170d692019-02-13 14:13:21 -0800224 want: `opt_enum: 0
Herbie Ong800c9902018-12-06 15:28:53 -0800225opt_nested_enum: 0
226`,
227 }, {
228 desc: "proto2 enum",
229 input: &pb2.Enums{
Herbie Ong8170d692019-02-13 14:13:21 -0800230 OptEnum: pb2.Enum_ONE.Enum(),
Herbie Ong800c9902018-12-06 15:28:53 -0800231 OptNestedEnum: pb2.Enums_UNO.Enum(),
232 },
Herbie Ong8170d692019-02-13 14:13:21 -0800233 want: `opt_enum: ONE
Herbie Ong800c9902018-12-06 15:28:53 -0800234opt_nested_enum: UNO
235`,
236 }, {
237 desc: "proto2 enum set to numeric values",
238 input: &pb2.Enums{
Herbie Ong8170d692019-02-13 14:13:21 -0800239 OptEnum: pb2Enum(2),
Herbie Ong800c9902018-12-06 15:28:53 -0800240 OptNestedEnum: pb2Enums_NestedEnum(2),
241 },
Herbie Ong8170d692019-02-13 14:13:21 -0800242 want: `opt_enum: TWO
Herbie Ong800c9902018-12-06 15:28:53 -0800243opt_nested_enum: DOS
244`,
245 }, {
246 desc: "proto2 enum set to unnamed numeric values",
247 input: &pb2.Enums{
248 OptEnum: pb2Enum(101),
249 OptNestedEnum: pb2Enums_NestedEnum(-101),
250 },
251 want: `opt_enum: 101
252opt_nested_enum: -101
253`,
254 }, {
255 desc: "proto3 enum not set",
256 input: &pb3.Enums{},
257 want: "\n",
258 }, {
259 desc: "proto3 enum set to zero value",
260 input: &pb3.Enums{
261 SEnum: pb3.Enum_ZERO,
262 SNestedEnum: pb3.Enums_CERO,
263 },
264 want: "\n",
265 }, {
266 desc: "proto3 enum",
267 input: &pb3.Enums{
268 SEnum: pb3.Enum_ONE,
Herbie Ong8170d692019-02-13 14:13:21 -0800269 SNestedEnum: pb3.Enums_UNO,
Herbie Ong800c9902018-12-06 15:28:53 -0800270 },
271 want: `s_enum: ONE
Herbie Ong8170d692019-02-13 14:13:21 -0800272s_nested_enum: UNO
Herbie Ong800c9902018-12-06 15:28:53 -0800273`,
274 }, {
275 desc: "proto3 enum set to numeric values",
276 input: &pb3.Enums{
277 SEnum: 2,
Herbie Ong8170d692019-02-13 14:13:21 -0800278 SNestedEnum: 2,
Herbie Ong800c9902018-12-06 15:28:53 -0800279 },
280 want: `s_enum: TWO
Herbie Ong8170d692019-02-13 14:13:21 -0800281s_nested_enum: DOS
Herbie Ong800c9902018-12-06 15:28:53 -0800282`,
283 }, {
284 desc: "proto3 enum set to unnamed numeric values",
285 input: &pb3.Enums{
286 SEnum: -47,
287 SNestedEnum: 47,
288 },
289 want: `s_enum: -47
290s_nested_enum: 47
291`,
292 }, {
293 desc: "proto2 nested message not set",
294 input: &pb2.Nests{},
295 want: "\n",
296 }, {
297 desc: "proto2 nested message set to empty",
298 input: &pb2.Nests{
299 OptNested: &pb2.Nested{},
300 Optgroup: &pb2.Nests_OptGroup{},
301 },
302 want: `opt_nested: {}
Herbie Ong0dcfb9a2019-01-14 15:32:26 -0800303OptGroup: {}
Herbie Ong800c9902018-12-06 15:28:53 -0800304`,
305 }, {
306 desc: "proto2 nested messages",
307 input: &pb2.Nests{
308 OptNested: &pb2.Nested{
309 OptString: scalar.String("nested message"),
310 OptNested: &pb2.Nested{
311 OptString: scalar.String("another nested message"),
312 },
313 },
314 },
315 want: `opt_nested: {
316 opt_string: "nested message"
317 opt_nested: {
318 opt_string: "another nested message"
319 }
320}
321`,
322 }, {
Herbie Ong8170d692019-02-13 14:13:21 -0800323 desc: "proto2 groups",
Herbie Ong800c9902018-12-06 15:28:53 -0800324 input: &pb2.Nests{
325 Optgroup: &pb2.Nests_OptGroup{
Herbie Ong800c9902018-12-06 15:28:53 -0800326 OptString: scalar.String("inside a group"),
327 OptNested: &pb2.Nested{
328 OptString: scalar.String("nested message inside a group"),
329 },
330 Optnestedgroup: &pb2.Nests_OptGroup_OptNestedGroup{
Herbie Ong8170d692019-02-13 14:13:21 -0800331 OptFixed32: scalar.Uint32(47),
Herbie Ong800c9902018-12-06 15:28:53 -0800332 },
333 },
334 },
Herbie Ong0dcfb9a2019-01-14 15:32:26 -0800335 want: `OptGroup: {
Herbie Ong800c9902018-12-06 15:28:53 -0800336 opt_string: "inside a group"
337 opt_nested: {
338 opt_string: "nested message inside a group"
339 }
Herbie Ong0dcfb9a2019-01-14 15:32:26 -0800340 OptNestedGroup: {
Herbie Ong8170d692019-02-13 14:13:21 -0800341 opt_fixed32: 47
Herbie Ong800c9902018-12-06 15:28:53 -0800342 }
343}
344`,
345 }, {
346 desc: "proto3 nested message not set",
347 input: &pb3.Nests{},
348 want: "\n",
349 }, {
Herbie Ong8170d692019-02-13 14:13:21 -0800350 desc: "proto3 nested message set to empty",
351 input: &pb3.Nests{
352 SNested: &pb3.Nested{},
353 },
354 want: "s_nested: {}\n",
355 }, {
Herbie Ong800c9902018-12-06 15:28:53 -0800356 desc: "proto3 nested message",
357 input: &pb3.Nests{
358 SNested: &pb3.Nested{
359 SString: "nested message",
360 SNested: &pb3.Nested{
361 SString: "another nested message",
362 },
363 },
364 },
365 want: `s_nested: {
366 s_string: "nested message"
367 s_nested: {
368 s_string: "another nested message"
369 }
370}
371`,
372 }, {
Herbie Ong8170d692019-02-13 14:13:21 -0800373 desc: "oneof not set",
374 input: &pb3.Oneofs{},
Herbie Ong800c9902018-12-06 15:28:53 -0800375 want: "\n",
376 }, {
Herbie Ong8170d692019-02-13 14:13:21 -0800377 desc: "oneof set to empty string",
378 input: &pb3.Oneofs{
379 Union: &pb3.Oneofs_OneofString{},
Herbie Ong800c9902018-12-06 15:28:53 -0800380 },
Herbie Ong8170d692019-02-13 14:13:21 -0800381 want: `oneof_string: ""
382`,
Herbie Ong800c9902018-12-06 15:28:53 -0800383 }, {
Herbie Ong8170d692019-02-13 14:13:21 -0800384 desc: "oneof set to string",
385 input: &pb3.Oneofs{
386 Union: &pb3.Oneofs_OneofString{
387 OneofString: "hello",
Herbie Ong800c9902018-12-06 15:28:53 -0800388 },
389 },
Herbie Ong8170d692019-02-13 14:13:21 -0800390 want: `oneof_string: "hello"
391`,
Herbie Ong800c9902018-12-06 15:28:53 -0800392 }, {
Herbie Ong8170d692019-02-13 14:13:21 -0800393 desc: "oneof set to enum",
394 input: &pb3.Oneofs{
395 Union: &pb3.Oneofs_OneofEnum{
396 OneofEnum: pb3.Enum_ZERO,
Herbie Ong800c9902018-12-06 15:28:53 -0800397 },
398 },
Herbie Ong8170d692019-02-13 14:13:21 -0800399 want: `oneof_enum: ZERO
400`,
Herbie Ong800c9902018-12-06 15:28:53 -0800401 }, {
Herbie Ong8170d692019-02-13 14:13:21 -0800402 desc: "oneof set to empty message",
403 input: &pb3.Oneofs{
404 Union: &pb3.Oneofs_OneofNested{
405 OneofNested: &pb3.Nested{},
406 },
407 },
408 want: "oneof_nested: {}\n",
409 }, {
410 desc: "oneof set to message",
411 input: &pb3.Oneofs{
412 Union: &pb3.Oneofs_OneofNested{
413 OneofNested: &pb3.Nested{
414 SString: "nested message",
Herbie Ong800c9902018-12-06 15:28:53 -0800415 },
416 },
417 },
Herbie Ong8170d692019-02-13 14:13:21 -0800418 want: `oneof_nested: {
419 s_string: "nested message"
Herbie Ong800c9902018-12-06 15:28:53 -0800420}
421`,
422 }, {
Herbie Ong8170d692019-02-13 14:13:21 -0800423 desc: "repeated fields not set",
Herbie Ong800c9902018-12-06 15:28:53 -0800424 input: &pb2.Repeats{},
425 want: "\n",
426 }, {
Herbie Ong8170d692019-02-13 14:13:21 -0800427 desc: "repeated fields set to empty slices",
Herbie Ong800c9902018-12-06 15:28:53 -0800428 input: &pb2.Repeats{
Herbie Ongcddf8192018-11-28 18:25:20 -0800429 RptBool: []bool{},
430 RptInt32: []int32{},
431 RptInt64: []int64{},
432 RptUint32: []uint32{},
433 RptUint64: []uint64{},
434 RptFloat: []float32{},
435 RptDouble: []float64{},
436 RptBytes: [][]byte{},
Herbie Ong800c9902018-12-06 15:28:53 -0800437 },
Herbie Ongcddf8192018-11-28 18:25:20 -0800438 want: "\n",
439 }, {
Herbie Ong8170d692019-02-13 14:13:21 -0800440 desc: "repeated fields set to some values",
Herbie Ong800c9902018-12-06 15:28:53 -0800441 input: &pb2.Repeats{
Herbie Ongcddf8192018-11-28 18:25:20 -0800442 RptBool: []bool{true, false, true, true},
443 RptInt32: []int32{1, 6, 0, 0},
444 RptInt64: []int64{-64, 47},
445 RptUint32: []uint32{0xff, 0xffff},
446 RptUint64: []uint64{0xdeadbeef},
Herbie Ong84f09602019-01-17 19:31:47 -0800447 RptFloat: []float32{float32(math.NaN()), float32(math.Inf(1)), float32(math.Inf(-1)), 1.034},
Herbie Ongcddf8192018-11-28 18:25:20 -0800448 RptDouble: []float64{math.NaN(), math.Inf(1), math.Inf(-1), 1.23e-308},
449 RptString: []string{"hello", "世界"},
450 RptBytes: [][]byte{
451 []byte("hello"),
452 []byte("\xe4\xb8\x96\xe7\x95\x8c"),
453 },
Herbie Ong800c9902018-12-06 15:28:53 -0800454 },
Herbie Ongcddf8192018-11-28 18:25:20 -0800455 want: `rpt_bool: true
456rpt_bool: false
457rpt_bool: true
458rpt_bool: true
459rpt_int32: 1
460rpt_int32: 6
461rpt_int32: 0
462rpt_int32: 0
463rpt_int64: -64
464rpt_int64: 47
465rpt_uint32: 255
466rpt_uint32: 65535
467rpt_uint64: 3735928559
Herbie Ong84f09602019-01-17 19:31:47 -0800468rpt_float: nan
469rpt_float: inf
470rpt_float: -inf
471rpt_float: 1.034
Herbie Ongcddf8192018-11-28 18:25:20 -0800472rpt_double: nan
473rpt_double: inf
474rpt_double: -inf
475rpt_double: 1.23e-308
476rpt_string: "hello"
477rpt_string: "世界"
478rpt_bytes: "hello"
479rpt_bytes: "世界"
480`,
481 }, {
Herbie Ong8170d692019-02-13 14:13:21 -0800482 desc: "repeated enums",
Herbie Ong800c9902018-12-06 15:28:53 -0800483 input: &pb2.Enums{
Herbie Ong8170d692019-02-13 14:13:21 -0800484 RptEnum: []pb2.Enum{pb2.Enum_ONE, 2, pb2.Enum_TEN, 42},
Herbie Ongcddf8192018-11-28 18:25:20 -0800485 RptNestedEnum: []pb2.Enums_NestedEnum{2, 47, 10},
Herbie Ong800c9902018-12-06 15:28:53 -0800486 },
Herbie Ong8170d692019-02-13 14:13:21 -0800487 want: `rpt_enum: ONE
488rpt_enum: TWO
489rpt_enum: TEN
Herbie Ongcddf8192018-11-28 18:25:20 -0800490rpt_enum: 42
Herbie Ongcddf8192018-11-28 18:25:20 -0800491rpt_nested_enum: DOS
492rpt_nested_enum: 47
493rpt_nested_enum: DIEZ
494`,
495 }, {
Herbie Ong8170d692019-02-13 14:13:21 -0800496 desc: "repeated messages set to empty",
Herbie Ong800c9902018-12-06 15:28:53 -0800497 input: &pb2.Nests{
Herbie Ongcddf8192018-11-28 18:25:20 -0800498 RptNested: []*pb2.Nested{},
499 Rptgroup: []*pb2.Nests_RptGroup{},
Herbie Ong800c9902018-12-06 15:28:53 -0800500 },
501 want: "\n",
Herbie Ongcddf8192018-11-28 18:25:20 -0800502 }, {
Herbie Ong8170d692019-02-13 14:13:21 -0800503 desc: "repeated messages",
Herbie Ong800c9902018-12-06 15:28:53 -0800504 input: &pb2.Nests{
Herbie Ongcddf8192018-11-28 18:25:20 -0800505 RptNested: []*pb2.Nested{
506 {
507 OptString: scalar.String("repeat nested one"),
508 },
509 {
510 OptString: scalar.String("repeat nested two"),
511 OptNested: &pb2.Nested{
512 OptString: scalar.String("inside repeat nested two"),
513 },
514 },
515 {},
516 },
Herbie Ong800c9902018-12-06 15:28:53 -0800517 },
518 want: `rpt_nested: {
Herbie Ongcddf8192018-11-28 18:25:20 -0800519 opt_string: "repeat nested one"
520}
521rpt_nested: {
522 opt_string: "repeat nested two"
523 opt_nested: {
524 opt_string: "inside repeat nested two"
525 }
526}
527rpt_nested: {}
528`,
529 }, {
Herbie Ong8170d692019-02-13 14:13:21 -0800530 desc: "repeated messages contains nil value",
Herbie Ongf5db2df2019-02-07 20:17:45 -0800531 input: &pb2.Nests{
532 RptNested: []*pb2.Nested{nil, {}},
533 },
534 want: `rpt_nested: {}
535rpt_nested: {}
536`,
537 }, {
Herbie Ong8170d692019-02-13 14:13:21 -0800538 desc: "repeated groups",
Herbie Ong800c9902018-12-06 15:28:53 -0800539 input: &pb2.Nests{
Herbie Ongcddf8192018-11-28 18:25:20 -0800540 Rptgroup: []*pb2.Nests_RptGroup{
541 {
Herbie Ong8170d692019-02-13 14:13:21 -0800542 RptString: []string{"hello", "world"},
Herbie Ongcddf8192018-11-28 18:25:20 -0800543 },
544 {},
Herbie Ong8170d692019-02-13 14:13:21 -0800545 nil,
Herbie Ongcddf8192018-11-28 18:25:20 -0800546 },
Herbie Ong800c9902018-12-06 15:28:53 -0800547 },
Herbie Ongde7313b2019-01-14 19:26:50 -0800548 want: `RptGroup: {
Herbie Ong8170d692019-02-13 14:13:21 -0800549 rpt_string: "hello"
550 rpt_string: "world"
Herbie Ongcddf8192018-11-28 18:25:20 -0800551}
Herbie Ongde7313b2019-01-14 19:26:50 -0800552RptGroup: {}
Herbie Ong8170d692019-02-13 14:13:21 -0800553RptGroup: {}
Herbie Ongcddf8192018-11-28 18:25:20 -0800554`,
555 }, {
Herbie Ong8170d692019-02-13 14:13:21 -0800556 desc: "map fields not set",
557 input: &pb3.Maps{},
Herbie Ongcddf8192018-11-28 18:25:20 -0800558 want: "\n",
559 }, {
Herbie Ong8170d692019-02-13 14:13:21 -0800560 desc: "map fields set to empty",
561 input: &pb3.Maps{
562 Int32ToStr: map[int32]string{},
563 BoolToUint32: map[bool]uint32{},
564 Uint64ToEnum: map[uint64]pb3.Enum{},
565 StrToNested: map[string]*pb3.Nested{},
566 StrToOneofs: map[string]*pb3.Oneofs{},
Herbie Ong800c9902018-12-06 15:28:53 -0800567 },
Herbie Ongcddf8192018-11-28 18:25:20 -0800568 want: "\n",
569 }, {
570 desc: "map fields 1",
Herbie Ong8170d692019-02-13 14:13:21 -0800571 input: &pb3.Maps{
Herbie Ongcddf8192018-11-28 18:25:20 -0800572 Int32ToStr: map[int32]string{
573 -101: "-101",
574 0xff: "0xff",
575 0: "zero",
576 },
Herbie Ongcddf8192018-11-28 18:25:20 -0800577 BoolToUint32: map[bool]uint32{
578 true: 42,
579 false: 101,
580 },
Herbie Ong800c9902018-12-06 15:28:53 -0800581 },
Herbie Ongcddf8192018-11-28 18:25:20 -0800582 want: `int32_to_str: {
583 key: -101
584 value: "-101"
585}
586int32_to_str: {
587 key: 0
588 value: "zero"
589}
590int32_to_str: {
591 key: 255
592 value: "0xff"
593}
Herbie Ongcddf8192018-11-28 18:25:20 -0800594bool_to_uint32: {
595 key: false
596 value: 101
597}
598bool_to_uint32: {
599 key: true
600 value: 42
601}
602`,
603 }, {
604 desc: "map fields 2",
Herbie Ong8170d692019-02-13 14:13:21 -0800605 input: &pb3.Maps{
606 Uint64ToEnum: map[uint64]pb3.Enum{
607 1: pb3.Enum_ONE,
608 2: pb3.Enum_TWO,
609 10: pb3.Enum_TEN,
610 47: 47,
Herbie Ongcddf8192018-11-28 18:25:20 -0800611 },
Herbie Ong800c9902018-12-06 15:28:53 -0800612 },
Herbie Ongcddf8192018-11-28 18:25:20 -0800613 want: `uint64_to_enum: {
614 key: 1
Herbie Ong8170d692019-02-13 14:13:21 -0800615 value: ONE
Herbie Ongcddf8192018-11-28 18:25:20 -0800616}
617uint64_to_enum: {
618 key: 2
Herbie Ong8170d692019-02-13 14:13:21 -0800619 value: TWO
Herbie Ongcddf8192018-11-28 18:25:20 -0800620}
621uint64_to_enum: {
622 key: 10
Herbie Ong8170d692019-02-13 14:13:21 -0800623 value: TEN
624}
625uint64_to_enum: {
626 key: 47
627 value: 47
Herbie Ongcddf8192018-11-28 18:25:20 -0800628}
629`,
630 }, {
631 desc: "map fields 3",
Herbie Ong8170d692019-02-13 14:13:21 -0800632 input: &pb3.Maps{
633 StrToNested: map[string]*pb3.Nested{
634 "nested": &pb3.Nested{
635 SString: "nested in a map",
Herbie Ongcddf8192018-11-28 18:25:20 -0800636 },
637 },
Herbie Ong800c9902018-12-06 15:28:53 -0800638 },
Herbie Ongcddf8192018-11-28 18:25:20 -0800639 want: `str_to_nested: {
Herbie Ong8170d692019-02-13 14:13:21 -0800640 key: "nested"
Herbie Ongcddf8192018-11-28 18:25:20 -0800641 value: {
Herbie Ong8170d692019-02-13 14:13:21 -0800642 s_string: "nested in a map"
Herbie Ongcddf8192018-11-28 18:25:20 -0800643 }
644}
645`,
646 }, {
647 desc: "map fields 4",
Herbie Ong8170d692019-02-13 14:13:21 -0800648 input: &pb3.Maps{
649 StrToOneofs: map[string]*pb3.Oneofs{
650 "string": &pb3.Oneofs{
651 Union: &pb3.Oneofs_OneofString{
652 OneofString: "hello",
Herbie Ongcddf8192018-11-28 18:25:20 -0800653 },
654 },
Herbie Ong8170d692019-02-13 14:13:21 -0800655 "nested": &pb3.Oneofs{
656 Union: &pb3.Oneofs_OneofNested{
657 OneofNested: &pb3.Nested{
658 SString: "nested oneof in map field value",
Herbie Ongcddf8192018-11-28 18:25:20 -0800659 },
660 },
661 },
662 },
Herbie Ong800c9902018-12-06 15:28:53 -0800663 },
Herbie Ongcddf8192018-11-28 18:25:20 -0800664 want: `str_to_oneofs: {
665 key: "nested"
666 value: {
Herbie Ong8170d692019-02-13 14:13:21 -0800667 oneof_nested: {
668 s_string: "nested oneof in map field value"
Herbie Ongcddf8192018-11-28 18:25:20 -0800669 }
670 }
671}
672str_to_oneofs: {
673 key: "string"
674 value: {
Herbie Ong8170d692019-02-13 14:13:21 -0800675 oneof_string: "hello"
Herbie Ongcddf8192018-11-28 18:25:20 -0800676 }
677}
678`,
679 }, {
Herbie Ong8170d692019-02-13 14:13:21 -0800680 desc: "map field contains nil value",
681 input: &pb3.Maps{
682 StrToNested: map[string]*pb3.Nested{
Herbie Ongf5db2df2019-02-07 20:17:45 -0800683 "nil": nil,
684 },
685 },
686 want: `str_to_nested: {
687 key: "nil"
688 value: {}
689}
690`,
691 }, {
Herbie Ong800c9902018-12-06 15:28:53 -0800692 desc: "proto2 required fields not set",
693 input: &pb2.Requireds{},
694 want: "\n",
695 wantErr: true,
Herbie Ongcddf8192018-11-28 18:25:20 -0800696 }, {
Herbie Ong800c9902018-12-06 15:28:53 -0800697 desc: "proto2 required fields partially set",
698 input: &pb2.Requireds{
699 ReqBool: scalar.Bool(false),
Herbie Ong800c9902018-12-06 15:28:53 -0800700 ReqSfixed64: scalar.Int64(0xbeefcafe),
701 ReqDouble: scalar.Float64(math.NaN()),
702 ReqString: scalar.String("hello"),
Herbie Ong8170d692019-02-13 14:13:21 -0800703 ReqEnum: pb2.Enum_ONE.Enum(),
Herbie Ong800c9902018-12-06 15:28:53 -0800704 },
705 want: `req_bool: false
Herbie Ong800c9902018-12-06 15:28:53 -0800706req_sfixed64: 3203386110
707req_double: nan
708req_string: "hello"
Herbie Ong8170d692019-02-13 14:13:21 -0800709req_enum: ONE
Herbie Ong800c9902018-12-06 15:28:53 -0800710`,
711 wantErr: true,
712 }, {
713 desc: "proto2 required fields all set",
714 input: &pb2.Requireds{
715 ReqBool: scalar.Bool(false),
Herbie Ong800c9902018-12-06 15:28:53 -0800716 ReqSfixed64: scalar.Int64(0),
Herbie Ong8170d692019-02-13 14:13:21 -0800717 ReqDouble: scalar.Float64(1.23),
Herbie Ong800c9902018-12-06 15:28:53 -0800718 ReqString: scalar.String(""),
Herbie Ong8170d692019-02-13 14:13:21 -0800719 ReqEnum: pb2.Enum_ONE.Enum(),
Herbie Ong800c9902018-12-06 15:28:53 -0800720 ReqNested: &pb2.Nested{},
721 },
722 want: `req_bool: false
Herbie Ong800c9902018-12-06 15:28:53 -0800723req_sfixed64: 0
Herbie Ong8170d692019-02-13 14:13:21 -0800724req_double: 1.23
Herbie Ong800c9902018-12-06 15:28:53 -0800725req_string: ""
Herbie Ong8170d692019-02-13 14:13:21 -0800726req_enum: ONE
Herbie Ong800c9902018-12-06 15:28:53 -0800727req_nested: {}
Herbie Ongcddf8192018-11-28 18:25:20 -0800728`,
729 }, {
Herbie Ong800c9902018-12-06 15:28:53 -0800730 desc: "indirect required field",
731 input: &pb2.IndirectRequired{
732 OptNested: &pb2.NestedWithRequired{},
733 },
734 want: "opt_nested: {}\n",
735 wantErr: true,
Herbie Ongcddf8192018-11-28 18:25:20 -0800736 }, {
Herbie Ong800c9902018-12-06 15:28:53 -0800737 desc: "indirect required field in empty repeated",
738 input: &pb2.IndirectRequired{
739 RptNested: []*pb2.NestedWithRequired{},
740 },
741 want: "\n",
Herbie Ongcddf8192018-11-28 18:25:20 -0800742 }, {
Herbie Ong800c9902018-12-06 15:28:53 -0800743 desc: "indirect required field in repeated",
744 input: &pb2.IndirectRequired{
745 RptNested: []*pb2.NestedWithRequired{
746 &pb2.NestedWithRequired{},
Herbie Ongcddf8192018-11-28 18:25:20 -0800747 },
Herbie Ong800c9902018-12-06 15:28:53 -0800748 },
749 want: "rpt_nested: {}\n",
750 wantErr: true,
751 }, {
752 desc: "indirect required field in empty map",
753 input: &pb2.IndirectRequired{
754 StrToNested: map[string]*pb2.NestedWithRequired{},
755 },
756 want: "\n",
757 }, {
758 desc: "indirect required field in map",
759 input: &pb2.IndirectRequired{
760 StrToNested: map[string]*pb2.NestedWithRequired{
761 "fail": &pb2.NestedWithRequired{},
762 },
763 },
764 want: `str_to_nested: {
765 key: "fail"
766 value: {}
Herbie Ongcddf8192018-11-28 18:25:20 -0800767}
768`,
Herbie Ong800c9902018-12-06 15:28:53 -0800769 wantErr: true,
Herbie Ong20a1d312018-12-11 21:08:58 -0800770 }, {
Herbie Ong8170d692019-02-13 14:13:21 -0800771 desc: "indirect required field in oneof",
772 input: &pb2.IndirectRequired{
773 Union: &pb2.IndirectRequired_OneofNested{
774 OneofNested: &pb2.NestedWithRequired{},
775 },
776 },
777 want: "oneof_nested: {}\n",
778 wantErr: true,
779 }, {
Herbie Ong20a1d312018-12-11 21:08:58 -0800780 desc: "unknown varint and fixed types",
781 input: &pb2.Scalars{
782 OptString: scalar.String("this message contains unknown fields"),
783 XXX_unrecognized: pack.Message{
784 pack.Tag{101, pack.VarintType}, pack.Bool(true),
785 pack.Tag{102, pack.VarintType}, pack.Varint(0xff),
786 pack.Tag{103, pack.Fixed32Type}, pack.Uint32(47),
787 pack.Tag{104, pack.Fixed64Type}, pack.Int64(0xdeadbeef),
788 }.Marshal(),
789 },
790 want: `opt_string: "this message contains unknown fields"
791101: 1
792102: 255
793103: 47
794104: 3735928559
795`,
796 }, {
797 desc: "unknown length-delimited",
798 input: &pb2.Scalars{
799 XXX_unrecognized: pack.Message{
800 pack.Tag{101, pack.BytesType}, pack.LengthPrefix{pack.Bool(true), pack.Bool(false)},
801 pack.Tag{102, pack.BytesType}, pack.String("hello world"),
802 pack.Tag{103, pack.BytesType}, pack.Bytes("\xe4\xb8\x96\xe7\x95\x8c"),
803 }.Marshal(),
804 },
805 want: `101: "\x01\x00"
806102: "hello world"
807103: "世界"
808`,
809 }, {
810 desc: "unknown group type",
811 input: &pb2.Scalars{
812 XXX_unrecognized: pack.Message{
813 pack.Tag{101, pack.StartGroupType}, pack.Tag{101, pack.EndGroupType},
814 pack.Tag{102, pack.StartGroupType},
815 pack.Tag{101, pack.VarintType}, pack.Bool(false),
816 pack.Tag{102, pack.BytesType}, pack.String("inside a group"),
817 pack.Tag{102, pack.EndGroupType},
818 }.Marshal(),
819 },
820 want: `101: {}
821102: {
822 101: 0
823 102: "inside a group"
824}
825`,
826 }, {
827 desc: "unknown unpack repeated field",
828 input: &pb2.Scalars{
829 XXX_unrecognized: pack.Message{
830 pack.Tag{101, pack.BytesType}, pack.LengthPrefix{pack.Bool(true), pack.Bool(false), pack.Bool(true)},
831 pack.Tag{102, pack.BytesType}, pack.String("hello"),
832 pack.Tag{101, pack.VarintType}, pack.Bool(true),
833 pack.Tag{102, pack.BytesType}, pack.String("世界"),
834 }.Marshal(),
835 },
836 want: `101: "\x01\x00\x01"
837101: 1
838102: "hello"
839102: "世界"
840`,
Herbie Ongcf253082018-12-17 17:13:07 -0800841 }, {
842 desc: "extensions of non-repeated fields",
843 input: func() proto.Message {
844 m := &pb2.Extensions{
845 OptString: scalar.String("non-extension field"),
846 OptBool: scalar.Bool(true),
847 OptInt32: scalar.Int32(42),
848 }
849 setExtension(m, pb2.E_OptExtBool, true)
850 setExtension(m, pb2.E_OptExtString, "extension field")
Herbie Ong8170d692019-02-13 14:13:21 -0800851 setExtension(m, pb2.E_OptExtEnum, pb2.Enum_TEN)
Herbie Ongcf253082018-12-17 17:13:07 -0800852 setExtension(m, pb2.E_OptExtNested, &pb2.Nested{
853 OptString: scalar.String("nested in an extension"),
854 OptNested: &pb2.Nested{
855 OptString: scalar.String("another nested in an extension"),
856 },
857 })
858 return m
859 }(),
860 want: `opt_string: "non-extension field"
861opt_bool: true
862opt_int32: 42
863[pb2.opt_ext_bool]: true
Herbie Ong8170d692019-02-13 14:13:21 -0800864[pb2.opt_ext_enum]: TEN
Herbie Ongcf253082018-12-17 17:13:07 -0800865[pb2.opt_ext_nested]: {
866 opt_string: "nested in an extension"
867 opt_nested: {
868 opt_string: "another nested in an extension"
869 }
870}
871[pb2.opt_ext_string]: "extension field"
872`,
873 }, {
Herbie Ong8170d692019-02-13 14:13:21 -0800874 desc: "extension message field set to nil",
Herbie Ongcf253082018-12-17 17:13:07 -0800875 input: func() proto.Message {
876 m := &pb2.Extensions{}
877 setExtension(m, pb2.E_OptExtNested, nil)
878 return m
879 }(),
880 want: "\n",
881 }, {
882 desc: "extensions of repeated fields",
883 input: func() proto.Message {
884 m := &pb2.Extensions{}
Herbie Ong8170d692019-02-13 14:13:21 -0800885 setExtension(m, pb2.E_RptExtEnum, &[]pb2.Enum{pb2.Enum_TEN, 101, pb2.Enum_ONE})
Herbie Ongcf253082018-12-17 17:13:07 -0800886 setExtension(m, pb2.E_RptExtFixed32, &[]uint32{42, 47})
887 setExtension(m, pb2.E_RptExtNested, &[]*pb2.Nested{
888 &pb2.Nested{OptString: scalar.String("one")},
889 &pb2.Nested{OptString: scalar.String("two")},
890 &pb2.Nested{OptString: scalar.String("three")},
891 })
892 return m
893 }(),
Herbie Ong8170d692019-02-13 14:13:21 -0800894 want: `[pb2.rpt_ext_enum]: TEN
Herbie Ongcf253082018-12-17 17:13:07 -0800895[pb2.rpt_ext_enum]: 101
Herbie Ong8170d692019-02-13 14:13:21 -0800896[pb2.rpt_ext_enum]: ONE
Herbie Ongcf253082018-12-17 17:13:07 -0800897[pb2.rpt_ext_fixed32]: 42
898[pb2.rpt_ext_fixed32]: 47
899[pb2.rpt_ext_nested]: {
900 opt_string: "one"
901}
902[pb2.rpt_ext_nested]: {
903 opt_string: "two"
904}
905[pb2.rpt_ext_nested]: {
906 opt_string: "three"
907}
908`,
909 }, {
910 desc: "extensions of non-repeated fields in another message",
911 input: func() proto.Message {
912 m := &pb2.Extensions{}
913 setExtension(m, pb2.E_ExtensionsContainer_OptExtBool, true)
914 setExtension(m, pb2.E_ExtensionsContainer_OptExtString, "extension field")
Herbie Ong8170d692019-02-13 14:13:21 -0800915 setExtension(m, pb2.E_ExtensionsContainer_OptExtEnum, pb2.Enum_TEN)
Herbie Ongcf253082018-12-17 17:13:07 -0800916 setExtension(m, pb2.E_ExtensionsContainer_OptExtNested, &pb2.Nested{
917 OptString: scalar.String("nested in an extension"),
918 OptNested: &pb2.Nested{
919 OptString: scalar.String("another nested in an extension"),
920 },
921 })
922 return m
923 }(),
924 want: `[pb2.ExtensionsContainer.opt_ext_bool]: true
Herbie Ong8170d692019-02-13 14:13:21 -0800925[pb2.ExtensionsContainer.opt_ext_enum]: TEN
Herbie Ongcf253082018-12-17 17:13:07 -0800926[pb2.ExtensionsContainer.opt_ext_nested]: {
927 opt_string: "nested in an extension"
928 opt_nested: {
929 opt_string: "another nested in an extension"
930 }
931}
932[pb2.ExtensionsContainer.opt_ext_string]: "extension field"
933`,
934 }, {
935 desc: "extensions of repeated fields in another message",
936 input: func() proto.Message {
937 m := &pb2.Extensions{
938 OptString: scalar.String("non-extension field"),
939 OptBool: scalar.Bool(true),
940 OptInt32: scalar.Int32(42),
941 }
Herbie Ong8170d692019-02-13 14:13:21 -0800942 setExtension(m, pb2.E_ExtensionsContainer_RptExtEnum, &[]pb2.Enum{pb2.Enum_TEN, 101, pb2.Enum_ONE})
Herbie Ongcf253082018-12-17 17:13:07 -0800943 setExtension(m, pb2.E_ExtensionsContainer_RptExtString, &[]string{"hello", "world"})
944 setExtension(m, pb2.E_ExtensionsContainer_RptExtNested, &[]*pb2.Nested{
945 &pb2.Nested{OptString: scalar.String("one")},
946 &pb2.Nested{OptString: scalar.String("two")},
947 &pb2.Nested{OptString: scalar.String("three")},
948 })
949 return m
950 }(),
951 want: `opt_string: "non-extension field"
952opt_bool: true
953opt_int32: 42
Herbie Ong8170d692019-02-13 14:13:21 -0800954[pb2.ExtensionsContainer.rpt_ext_enum]: TEN
Herbie Ongcf253082018-12-17 17:13:07 -0800955[pb2.ExtensionsContainer.rpt_ext_enum]: 101
Herbie Ong8170d692019-02-13 14:13:21 -0800956[pb2.ExtensionsContainer.rpt_ext_enum]: ONE
Herbie Ongcf253082018-12-17 17:13:07 -0800957[pb2.ExtensionsContainer.rpt_ext_nested]: {
958 opt_string: "one"
959}
960[pb2.ExtensionsContainer.rpt_ext_nested]: {
961 opt_string: "two"
962}
963[pb2.ExtensionsContainer.rpt_ext_nested]: {
964 opt_string: "three"
965}
966[pb2.ExtensionsContainer.rpt_ext_string]: "hello"
967[pb2.ExtensionsContainer.rpt_ext_string]: "world"
968`,
Herbie Ong6470ea62019-01-07 18:56:57 -0800969 }, {
970 desc: "MessageSet",
971 input: func() proto.Message {
972 m := &pb2.MessageSet{}
973 setExtension(m, pb2.E_MessageSetExtension_MessageSetExtension, &pb2.MessageSetExtension{
974 OptString: scalar.String("a messageset extension"),
975 })
976 setExtension(m, pb2.E_MessageSetExtension_NotMessageSetExtension, &pb2.MessageSetExtension{
977 OptString: scalar.String("not a messageset extension"),
978 })
979 setExtension(m, pb2.E_MessageSetExtension_ExtNested, &pb2.Nested{
980 OptString: scalar.String("just a regular extension"),
981 })
982 return m
983 }(),
984 want: `[pb2.MessageSetExtension]: {
985 opt_string: "a messageset extension"
986}
987[pb2.MessageSetExtension.ext_nested]: {
988 opt_string: "just a regular extension"
989}
990[pb2.MessageSetExtension.not_message_set_extension]: {
991 opt_string: "not a messageset extension"
992}
993`,
994 }, {
995 desc: "not real MessageSet 1",
996 input: func() proto.Message {
997 m := &pb2.FakeMessageSet{}
998 setExtension(m, pb2.E_FakeMessageSetExtension_MessageSetExtension, &pb2.FakeMessageSetExtension{
999 OptString: scalar.String("not a messageset extension"),
1000 })
1001 return m
1002 }(),
1003 want: `[pb2.FakeMessageSetExtension.message_set_extension]: {
1004 opt_string: "not a messageset extension"
1005}
1006`,
1007 }, {
1008 desc: "not real MessageSet 2",
1009 input: func() proto.Message {
1010 m := &pb2.MessageSet{}
1011 setExtension(m, pb2.E_MessageSetExtension, &pb2.FakeMessageSetExtension{
1012 OptString: scalar.String("another not a messageset extension"),
1013 })
1014 return m
1015 }(),
1016 want: `[pb2.message_set_extension]: {
1017 opt_string: "another not a messageset extension"
1018}
1019`,
Herbie Ongf42b55f2019-01-02 15:46:07 -08001020 }, {
Herbie Ong8170d692019-02-13 14:13:21 -08001021 desc: "Any not expanded",
Herbie Ong66c365c2019-01-04 14:08:41 -08001022 mo: textpb.MarshalOptions{
1023 Resolver: preg.NewTypes(),
1024 },
Herbie Ongf42b55f2019-01-02 15:46:07 -08001025 input: func() proto.Message {
1026 m := &pb2.Nested{
1027 OptString: scalar.String("embedded inside Any"),
1028 OptNested: &pb2.Nested{
1029 OptString: scalar.String("inception"),
1030 },
1031 }
1032 // TODO: Switch to V2 marshal when ready.
1033 b, err := protoV1.Marshal(m)
1034 if err != nil {
1035 t.Fatalf("error in binary marshaling message for Any.value: %v", err)
1036 }
Joe Tsai19058432019-02-27 21:46:29 -08001037 return wrapV1Message(&knownpb.Any{
Herbie Ong66c365c2019-01-04 14:08:41 -08001038 TypeUrl: "pb2.Nested",
Herbie Ongf42b55f2019-01-02 15:46:07 -08001039 Value: b,
Herbie Ong66c365c2019-01-04 14:08:41 -08001040 })
Herbie Ongf42b55f2019-01-02 15:46:07 -08001041 }(),
1042 want: `type_url: "pb2.Nested"
1043value: "\n\x13embedded inside Any\x12\x0b\n\tinception"
1044`,
1045 }, {
Herbie Ong8170d692019-02-13 14:13:21 -08001046 desc: "Any expanded",
Herbie Ong66c365c2019-01-04 14:08:41 -08001047 mo: textpb.MarshalOptions{
1048 Resolver: preg.NewTypes((&pb2.Nested{}).ProtoReflect().Type()),
1049 },
Herbie Ongf42b55f2019-01-02 15:46:07 -08001050 input: func() proto.Message {
1051 m := &pb2.Nested{
1052 OptString: scalar.String("embedded inside Any"),
1053 OptNested: &pb2.Nested{
1054 OptString: scalar.String("inception"),
1055 },
1056 }
1057 // TODO: Switch to V2 marshal when ready.
1058 b, err := protoV1.Marshal(m)
1059 if err != nil {
1060 t.Fatalf("error in binary marshaling message for Any.value: %v", err)
1061 }
Joe Tsai19058432019-02-27 21:46:29 -08001062 return wrapV1Message(&knownpb.Any{
Herbie Ong66c365c2019-01-04 14:08:41 -08001063 TypeUrl: "foo/pb2.Nested",
Herbie Ongf42b55f2019-01-02 15:46:07 -08001064 Value: b,
Herbie Ong66c365c2019-01-04 14:08:41 -08001065 })
Herbie Ongf42b55f2019-01-02 15:46:07 -08001066 }(),
Herbie Ong66c365c2019-01-04 14:08:41 -08001067 want: `[foo/pb2.Nested]: {
Herbie Ongf42b55f2019-01-02 15:46:07 -08001068 opt_string: "embedded inside Any"
1069 opt_nested: {
1070 opt_string: "inception"
1071 }
1072}
1073`,
1074 }, {
Herbie Ong8170d692019-02-13 14:13:21 -08001075 desc: "Any expanded with missing required error",
Herbie Ong66c365c2019-01-04 14:08:41 -08001076 mo: textpb.MarshalOptions{
1077 Resolver: preg.NewTypes((&pb2.PartialRequired{}).ProtoReflect().Type()),
1078 },
Herbie Ongf42b55f2019-01-02 15:46:07 -08001079 input: func() proto.Message {
1080 m := &pb2.PartialRequired{
1081 OptString: scalar.String("embedded inside Any"),
1082 }
1083 // TODO: Switch to V2 marshal when ready.
1084 b, err := protoV1.Marshal(m)
1085 // Ignore required not set error.
1086 if _, ok := err.(*protoV1.RequiredNotSetError); !ok {
1087 t.Fatalf("error in binary marshaling message for Any.value: %v", err)
1088 }
Joe Tsai19058432019-02-27 21:46:29 -08001089 return wrapV1Message(&knownpb.Any{
Herbie Ongf42b55f2019-01-02 15:46:07 -08001090 TypeUrl: string(m.ProtoReflect().Type().FullName()),
1091 Value: b,
Herbie Ong66c365c2019-01-04 14:08:41 -08001092 })
Herbie Ongf42b55f2019-01-02 15:46:07 -08001093 }(),
1094 want: `[pb2.PartialRequired]: {
1095 opt_string: "embedded inside Any"
1096}
1097`,
1098 wantErr: true,
1099 }, {
Herbie Ong8170d692019-02-13 14:13:21 -08001100 desc: "Any with invalid value",
Herbie Ong66c365c2019-01-04 14:08:41 -08001101 mo: textpb.MarshalOptions{
1102 Resolver: preg.NewTypes((&pb2.Nested{}).ProtoReflect().Type()),
1103 },
Joe Tsai19058432019-02-27 21:46:29 -08001104 input: wrapV1Message(&knownpb.Any{
Herbie Ong66c365c2019-01-04 14:08:41 -08001105 TypeUrl: "foo/pb2.Nested",
1106 Value: dhex("80"),
1107 }),
1108 want: `type_url: "foo/pb2.Nested"
Herbie Onga94f78c2019-01-03 15:39:58 -08001109value: "\x80"
1110`,
Herbie Ongcddf8192018-11-28 18:25:20 -08001111 }}
1112
1113 for _, tt := range tests {
1114 tt := tt
1115 t.Run(tt.desc, func(t *testing.T) {
1116 t.Parallel()
Herbie Ongf42b55f2019-01-02 15:46:07 -08001117 b, err := tt.mo.Marshal(tt.input)
Herbie Ongcddf8192018-11-28 18:25:20 -08001118 if err != nil && !tt.wantErr {
Herbie Ongf42b55f2019-01-02 15:46:07 -08001119 t.Errorf("Marshal() returned error: %v\n", err)
Herbie Ongcddf8192018-11-28 18:25:20 -08001120 }
Herbie Ong800c9902018-12-06 15:28:53 -08001121 if err == nil && tt.wantErr {
Herbie Ongf42b55f2019-01-02 15:46:07 -08001122 t.Error("Marshal() got nil error, want error\n")
Herbie Ongcddf8192018-11-28 18:25:20 -08001123 }
Herbie Ong800c9902018-12-06 15:28:53 -08001124 got := string(b)
1125 if tt.want != "" && got != tt.want {
1126 t.Errorf("Marshal()\n<got>\n%v\n<want>\n%v\n", got, tt.want)
1127 if diff := cmp.Diff(tt.want, got, splitLines); diff != "" {
Herbie Ongcddf8192018-11-28 18:25:20 -08001128 t.Errorf("Marshal() diff -want +got\n%v\n", diff)
1129 }
1130 }
1131 })
1132 }
1133}