blob: 03ba55274392692d841ece3473e26ca89bda174e [file] [log] [blame]
Herbie Ong800c9902018-12-06 15:28:53 -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
Damien Neil5c5b5312019-05-14 12:44:37 -07005package prototext_test
Herbie Ong800c9902018-12-06 15:28:53 -08006
7import (
8 "math"
9 "testing"
10
Damien Neil5c5b5312019-05-14 12:44:37 -070011 "google.golang.org/protobuf/encoding/prototext"
Joe Tsaid47ea192019-07-09 22:38:15 -070012 "google.golang.org/protobuf/internal/flags"
Damien Neile89e6242019-05-13 23:55:40 -070013 "google.golang.org/protobuf/proto"
14 preg "google.golang.org/protobuf/reflect/protoregistry"
Herbie Ong800c9902018-12-06 15:28:53 -080015
Damien Neile89e6242019-05-13 23:55:40 -070016 "google.golang.org/protobuf/encoding/testprotos/pb2"
17 "google.golang.org/protobuf/encoding/testprotos/pb3"
Joe Tsaid47ea192019-07-09 22:38:15 -070018 testpb "google.golang.org/protobuf/internal/testprotos/test"
19 weakpb "google.golang.org/protobuf/internal/testprotos/test/weak1"
Joe Tsaia95b29f2019-05-16 12:47:20 -070020 "google.golang.org/protobuf/types/known/anypb"
Herbie Ong800c9902018-12-06 15:28:53 -080021)
22
23func TestUnmarshal(t *testing.T) {
Herbie Ong800c9902018-12-06 15:28:53 -080024 tests := []struct {
25 desc string
Damien Neil5c5b5312019-05-14 12:44:37 -070026 umo prototext.UnmarshalOptions
Herbie Ong70651952018-12-13 14:19:50 -080027 inputMessage proto.Message
Herbie Ong800c9902018-12-06 15:28:53 -080028 inputText string
Herbie Ong70651952018-12-13 14:19:50 -080029 wantMessage proto.Message
Herbie Ong300cff02019-03-20 18:05:16 -070030 wantErr bool // TODO: Verify error message content.
Joe Tsaid47ea192019-07-09 22:38:15 -070031 skip bool
Herbie Ong800c9902018-12-06 15:28:53 -080032 }{{
33 desc: "proto2 empty message",
34 inputMessage: &pb2.Scalars{},
35 wantMessage: &pb2.Scalars{},
36 }, {
Herbie Ong8170d692019-02-13 14:13:21 -080037 desc: "proto2 optional scalars set to zero values",
Herbie Ong800c9902018-12-06 15:28:53 -080038 inputMessage: &pb2.Scalars{},
39 inputText: `opt_bool: false
40opt_int32: 0
41opt_int64: 0
42opt_uint32: 0
43opt_uint64: 0
44opt_sint32: 0
45opt_sint64: 0
46opt_fixed32: 0
47opt_fixed64: 0
48opt_sfixed32: 0
49opt_sfixed64: 0
50opt_float: 0
51opt_double: 0
52opt_bytes: ""
53opt_string: ""
54`,
55 wantMessage: &pb2.Scalars{
Damien Neila8a2cea2019-07-10 16:17:16 -070056 OptBool: proto.Bool(false),
57 OptInt32: proto.Int32(0),
58 OptInt64: proto.Int64(0),
59 OptUint32: proto.Uint32(0),
60 OptUint64: proto.Uint64(0),
61 OptSint32: proto.Int32(0),
62 OptSint64: proto.Int64(0),
63 OptFixed32: proto.Uint32(0),
64 OptFixed64: proto.Uint64(0),
65 OptSfixed32: proto.Int32(0),
66 OptSfixed64: proto.Int64(0),
67 OptFloat: proto.Float32(0),
68 OptDouble: proto.Float64(0),
Herbie Ong800c9902018-12-06 15:28:53 -080069 OptBytes: []byte{},
Damien Neila8a2cea2019-07-10 16:17:16 -070070 OptString: proto.String(""),
Herbie Ong800c9902018-12-06 15:28:53 -080071 },
72 }, {
Herbie Ong8170d692019-02-13 14:13:21 -080073 desc: "proto3 scalars set to zero values",
Herbie Ong800c9902018-12-06 15:28:53 -080074 inputMessage: &pb3.Scalars{},
75 inputText: `s_bool: false
76s_int32: 0
77s_int64: 0
78s_uint32: 0
79s_uint64: 0
80s_sint32: 0
81s_sint64: 0
82s_fixed32: 0
83s_fixed64: 0
84s_sfixed32: 0
85s_sfixed64: 0
86s_float: 0
87s_double: 0
88s_bytes: ""
89s_string: ""
90`,
91 wantMessage: &pb3.Scalars{},
92 }, {
Herbie Ong8170d692019-02-13 14:13:21 -080093 desc: "proto2 optional scalars",
Herbie Ong800c9902018-12-06 15:28:53 -080094 inputMessage: &pb2.Scalars{},
95 inputText: `opt_bool: true
96opt_int32: 255
97opt_int64: 3735928559
98opt_uint32: 0xff
99opt_uint64: 0xdeadbeef
100opt_sint32: -1001
101opt_sint64: -0xffff
102opt_fixed64: 64
103opt_sfixed32: -32
104opt_float: 1.234
105opt_double: 1.23e+100
106opt_bytes: "\xe8\xb0\xb7\xe6\xad\x8c"
107opt_string: "谷歌"
108`,
109 wantMessage: &pb2.Scalars{
Damien Neila8a2cea2019-07-10 16:17:16 -0700110 OptBool: proto.Bool(true),
111 OptInt32: proto.Int32(0xff),
112 OptInt64: proto.Int64(0xdeadbeef),
113 OptUint32: proto.Uint32(0xff),
114 OptUint64: proto.Uint64(0xdeadbeef),
115 OptSint32: proto.Int32(-1001),
116 OptSint64: proto.Int64(-0xffff),
117 OptFixed64: proto.Uint64(64),
118 OptSfixed32: proto.Int32(-32),
119 OptFloat: proto.Float32(1.234),
120 OptDouble: proto.Float64(1.23e100),
Herbie Ong800c9902018-12-06 15:28:53 -0800121 OptBytes: []byte("\xe8\xb0\xb7\xe6\xad\x8c"),
Damien Neila8a2cea2019-07-10 16:17:16 -0700122 OptString: proto.String("谷歌"),
Herbie Ong800c9902018-12-06 15:28:53 -0800123 },
124 }, {
Herbie Ong20aefe92019-06-24 19:21:46 -0700125 desc: "case sensitive",
126 inputMessage: &pb3.Scalars{},
127 inputText: `S_BOOL: true`,
128 wantErr: true,
129 }, {
Herbie Ong8170d692019-02-13 14:13:21 -0800130 desc: "proto3 scalars",
Herbie Ong800c9902018-12-06 15:28:53 -0800131 inputMessage: &pb3.Scalars{},
132 inputText: `s_bool: true
133s_int32: 255
134s_int64: 3735928559
135s_uint32: 0xff
136s_uint64: 0xdeadbeef
137s_sint32: -1001
138s_sint64: -0xffff
139s_fixed64: 64
140s_sfixed32: -32
141s_float: 1.234
142s_double: 1.23e+100
143s_bytes: "\xe8\xb0\xb7\xe6\xad\x8c"
144s_string: "谷歌"
145`,
146 wantMessage: &pb3.Scalars{
147 SBool: true,
148 SInt32: 0xff,
149 SInt64: 0xdeadbeef,
150 SUint32: 0xff,
151 SUint64: 0xdeadbeef,
152 SSint32: -1001,
153 SSint64: -0xffff,
154 SFixed64: 64,
155 SSfixed32: -32,
156 SFloat: 1.234,
157 SDouble: 1.23e100,
158 SBytes: []byte("\xe8\xb0\xb7\xe6\xad\x8c"),
159 SString: "谷歌",
160 },
161 }, {
Herbie Ong21a39742019-04-08 17:32:44 -0700162 desc: "string with invalid UTF-8",
163 inputMessage: &pb3.Scalars{},
164 inputText: `s_string: "abc\xff"`,
Damien Neil8c86fc52019-06-19 09:28:29 -0700165 wantErr: true,
Herbie Ong21a39742019-04-08 17:32:44 -0700166 }, {
Herbie Ong800c9902018-12-06 15:28:53 -0800167 desc: "proto2 message contains unknown field",
168 inputMessage: &pb2.Scalars{},
169 inputText: "unknown_field: 123",
170 wantErr: true,
171 }, {
172 desc: "proto3 message contains unknown field",
173 inputMessage: &pb3.Scalars{},
174 inputText: "unknown_field: 456",
175 wantErr: true,
176 }, {
Joe Tsai8689fa52019-09-15 00:17:39 -0700177 desc: "proto2 message contains discarded unknown field",
178 umo: prototext.UnmarshalOptions{DiscardUnknown: true},
179 inputMessage: &pb2.Scalars{},
180 inputText: `unknown_field:123 1000:"hello"`,
181 }, {
182 desc: "proto3 message contains discarded unknown field",
183 umo: prototext.UnmarshalOptions{DiscardUnknown: true},
184 inputMessage: &pb3.Scalars{},
185 inputText: `unknown_field:456 1000:"goodbye"`,
186 }, {
187 desc: "proto2 message cannot parse field number",
188 umo: prototext.UnmarshalOptions{DiscardUnknown: true},
189 inputMessage: &pb2.Scalars{},
190 inputText: `13:"hello"`,
191 wantErr: true,
192 }, {
193 desc: "proto3 message cannot parse field number",
194 umo: prototext.UnmarshalOptions{DiscardUnknown: true},
195 inputMessage: &pb3.Scalars{},
196 inputText: `13:"goodbye"`,
197 wantErr: true,
198 }, {
Herbie Ong800c9902018-12-06 15:28:53 -0800199 desc: "proto2 numeric key field",
200 inputMessage: &pb2.Scalars{},
201 inputText: "1: true",
202 wantErr: true,
203 }, {
204 desc: "proto3 numeric key field",
205 inputMessage: &pb3.Scalars{},
206 inputText: "1: true",
207 wantErr: true,
208 }, {
209 desc: "invalid bool value",
210 inputMessage: &pb3.Scalars{},
211 inputText: "s_bool: 123",
212 wantErr: true,
213 }, {
214 desc: "invalid int32 value",
215 inputMessage: &pb3.Scalars{},
216 inputText: "s_int32: not_a_num",
217 wantErr: true,
218 }, {
219 desc: "invalid int64 value",
220 inputMessage: &pb3.Scalars{},
221 inputText: "s_int64: 'not a num either'",
222 wantErr: true,
223 }, {
224 desc: "invalid uint32 value",
225 inputMessage: &pb3.Scalars{},
226 inputText: "s_fixed32: -42",
227 wantErr: true,
228 }, {
229 desc: "invalid uint64 value",
230 inputMessage: &pb3.Scalars{},
231 inputText: "s_uint64: -47",
232 wantErr: true,
233 }, {
234 desc: "invalid sint32 value",
235 inputMessage: &pb3.Scalars{},
236 inputText: "s_sint32: '42'",
237 wantErr: true,
238 }, {
239 desc: "invalid sint64 value",
240 inputMessage: &pb3.Scalars{},
241 inputText: "s_sint64: '-47'",
242 wantErr: true,
243 }, {
244 desc: "invalid fixed32 value",
245 inputMessage: &pb3.Scalars{},
246 inputText: "s_fixed32: -42",
247 wantErr: true,
248 }, {
249 desc: "invalid fixed64 value",
250 inputMessage: &pb3.Scalars{},
251 inputText: "s_fixed64: -42",
252 wantErr: true,
253 }, {
254 desc: "invalid sfixed32 value",
255 inputMessage: &pb3.Scalars{},
256 inputText: "s_sfixed32: 'not valid'",
257 wantErr: true,
258 }, {
259 desc: "invalid sfixed64 value",
260 inputMessage: &pb3.Scalars{},
261 inputText: "s_sfixed64: bad",
262 wantErr: true,
263 }, {
Herbie Ong8170d692019-02-13 14:13:21 -0800264 desc: "float positive infinity",
Herbie Ong800c9902018-12-06 15:28:53 -0800265 inputMessage: &pb3.Scalars{},
266 inputText: "s_float: inf",
267 wantMessage: &pb3.Scalars{
268 SFloat: float32(math.Inf(1)),
269 },
270 }, {
Herbie Ong8170d692019-02-13 14:13:21 -0800271 desc: "float negative infinity",
Herbie Ong800c9902018-12-06 15:28:53 -0800272 inputMessage: &pb3.Scalars{},
273 inputText: "s_float: -inf",
274 wantMessage: &pb3.Scalars{
275 SFloat: float32(math.Inf(-1)),
276 },
277 }, {
Herbie Ong8170d692019-02-13 14:13:21 -0800278 desc: "double positive infinity",
Herbie Ong800c9902018-12-06 15:28:53 -0800279 inputMessage: &pb3.Scalars{},
280 inputText: "s_double: inf",
281 wantMessage: &pb3.Scalars{
282 SDouble: math.Inf(1),
283 },
284 }, {
Herbie Ong8170d692019-02-13 14:13:21 -0800285 desc: "double negative infinity",
Herbie Ong800c9902018-12-06 15:28:53 -0800286 inputMessage: &pb3.Scalars{},
287 inputText: "s_double: -inf",
288 wantMessage: &pb3.Scalars{
289 SDouble: math.Inf(-1),
290 },
291 }, {
292 desc: "invalid string value",
293 inputMessage: &pb3.Scalars{},
294 inputText: "s_string: invalid_string",
295 wantErr: true,
296 }, {
297 desc: "proto2 bytes set to empty string",
298 inputMessage: &pb2.Scalars{},
299 inputText: "opt_bytes: ''",
300 wantMessage: &pb2.Scalars{
301 OptBytes: []byte(""),
302 },
303 }, {
304 desc: "proto3 bytes set to empty string",
305 inputMessage: &pb3.Scalars{},
306 inputText: "s_bytes: ''",
307 wantMessage: &pb3.Scalars{},
308 }, {
309 desc: "proto2 duplicate singular field",
310 inputMessage: &pb2.Scalars{},
311 inputText: `
312opt_bool: true
313opt_bool: false
314`,
315 wantErr: true,
316 }, {
Herbie Ong800c9902018-12-06 15:28:53 -0800317 desc: "proto2 more duplicate singular field",
318 inputMessage: &pb2.Scalars{},
319 inputText: `
320opt_bool: true
321opt_string: "hello"
322opt_bool: false
323`,
324 wantErr: true,
325 }, {
Herbie Ong8170d692019-02-13 14:13:21 -0800326 desc: "proto2 invalid singular field",
327 inputMessage: &pb2.Scalars{},
328 inputText: `
329opt_bool: [true, false]
330`,
331 wantErr: true,
332 }, {
Herbie Ong800c9902018-12-06 15:28:53 -0800333 desc: "proto3 duplicate singular field",
334 inputMessage: &pb3.Scalars{},
335 inputText: `
336s_bool: false
337s_bool: true
338`,
339 wantErr: true,
340 }, {
341 desc: "proto3 more duplicate singular field",
342 inputMessage: &pb3.Scalars{},
343 inputText: `
344s_bool: false
345s_string: ""
346s_bool: true
347`,
348 wantErr: true,
349 }, {
350 desc: "proto2 enum",
351 inputMessage: &pb2.Enums{},
352 inputText: `
Herbie Ong8170d692019-02-13 14:13:21 -0800353opt_enum: ONE
Herbie Ong800c9902018-12-06 15:28:53 -0800354opt_nested_enum: UNO
355`,
356 wantMessage: &pb2.Enums{
Herbie Ong8170d692019-02-13 14:13:21 -0800357 OptEnum: pb2.Enum_ONE.Enum(),
Herbie Ong800c9902018-12-06 15:28:53 -0800358 OptNestedEnum: pb2.Enums_UNO.Enum(),
359 },
360 }, {
361 desc: "proto2 enum set to numeric values",
362 inputMessage: &pb2.Enums{},
363 inputText: `
Herbie Ong8170d692019-02-13 14:13:21 -0800364opt_enum: 2
Herbie Ong800c9902018-12-06 15:28:53 -0800365opt_nested_enum: 2
366`,
367 wantMessage: &pb2.Enums{
Herbie Ong8170d692019-02-13 14:13:21 -0800368 OptEnum: pb2.Enum_TWO.Enum(),
Herbie Ong800c9902018-12-06 15:28:53 -0800369 OptNestedEnum: pb2.Enums_DOS.Enum(),
370 },
371 }, {
372 desc: "proto2 enum set to unnamed numeric values",
373 inputMessage: &pb2.Enums{},
374 inputText: `
375opt_enum: 101
376opt_nested_enum: -101
377`,
378 wantMessage: &pb2.Enums{
Joe Tsai6dc168e2019-07-09 23:11:13 -0700379 OptEnum: pb2.Enum(101).Enum(),
380 OptNestedEnum: pb2.Enums_NestedEnum(-101).Enum(),
Herbie Ong800c9902018-12-06 15:28:53 -0800381 },
382 }, {
383 desc: "proto2 enum set to invalid named",
384 inputMessage: &pb2.Enums{},
385 inputText: `
Herbie Ong8170d692019-02-13 14:13:21 -0800386opt_enum: UNNAMED
Herbie Ong800c9902018-12-06 15:28:53 -0800387opt_nested_enum: UNNAMED_TOO
388`,
389 wantErr: true,
390 }, {
391 desc: "proto3 enum name value",
392 inputMessage: &pb3.Enums{},
393 inputText: `
394s_enum: ONE
395s_nested_enum: DIEZ
396`,
397 wantMessage: &pb3.Enums{
398 SEnum: pb3.Enum_ONE,
399 SNestedEnum: pb3.Enums_DIEZ,
400 },
401 }, {
402 desc: "proto3 enum numeric value",
403 inputMessage: &pb3.Enums{},
404 inputText: `
405s_enum: 2
Herbie Ong8170d692019-02-13 14:13:21 -0800406s_nested_enum: 2
Herbie Ong800c9902018-12-06 15:28:53 -0800407`,
408 wantMessage: &pb3.Enums{
409 SEnum: pb3.Enum_TWO,
Herbie Ong8170d692019-02-13 14:13:21 -0800410 SNestedEnum: pb3.Enums_DOS,
Herbie Ong800c9902018-12-06 15:28:53 -0800411 },
412 }, {
413 desc: "proto3 enum unnamed numeric value",
414 inputMessage: &pb3.Enums{},
415 inputText: `
416s_enum: 0x7fffffff
417s_nested_enum: -0x80000000
418`,
419 wantMessage: &pb3.Enums{
420 SEnum: 0x7fffffff,
421 SNestedEnum: -0x80000000,
422 },
423 }, {
424 desc: "proto2 nested empty messages",
425 inputMessage: &pb2.Nests{},
426 inputText: `
427opt_nested: {}
Herbie Ong0dcfb9a2019-01-14 15:32:26 -0800428OptGroup: {}
Herbie Ong800c9902018-12-06 15:28:53 -0800429`,
430 wantMessage: &pb2.Nests{
431 OptNested: &pb2.Nested{},
432 Optgroup: &pb2.Nests_OptGroup{},
433 },
434 }, {
Herbie Ong20aefe92019-06-24 19:21:46 -0700435 desc: "group field name",
436 inputMessage: &pb2.Nests{},
437 inputText: `optgroup: {}`,
438 wantErr: true,
439 }, {
Herbie Ong800c9902018-12-06 15:28:53 -0800440 desc: "proto2 nested messages",
441 inputMessage: &pb2.Nests{},
442 inputText: `
443opt_nested: {
444 opt_string: "nested message"
445 opt_nested: {
446 opt_string: "another nested message"
447 }
448}
449`,
450 wantMessage: &pb2.Nests{
451 OptNested: &pb2.Nested{
Damien Neila8a2cea2019-07-10 16:17:16 -0700452 OptString: proto.String("nested message"),
Herbie Ong800c9902018-12-06 15:28:53 -0800453 OptNested: &pb2.Nested{
Damien Neila8a2cea2019-07-10 16:17:16 -0700454 OptString: proto.String("another nested message"),
Herbie Ong800c9902018-12-06 15:28:53 -0800455 },
456 },
457 },
458 }, {
459 desc: "proto3 nested empty message",
460 inputMessage: &pb3.Nests{},
461 inputText: "s_nested: {}",
462 wantMessage: &pb3.Nests{
463 SNested: &pb3.Nested{},
464 },
465 }, {
466 desc: "proto3 nested message",
467 inputMessage: &pb3.Nests{},
468 inputText: `
469s_nested: {
470 s_string: "nested message"
471 s_nested: {
472 s_string: "another nested message"
473 }
474}
475`,
476 wantMessage: &pb3.Nests{
477 SNested: &pb3.Nested{
478 SString: "nested message",
479 SNested: &pb3.Nested{
480 SString: "another nested message",
481 },
482 },
483 },
484 }, {
Herbie Ong21a39742019-04-08 17:32:44 -0700485 desc: "proto3 nested message contains invalid UTF-8",
486 inputMessage: &pb3.Nests{},
487 inputText: `s_nested: {
488 s_string: "abc\xff"
489}
490`,
Herbie Ong21a39742019-04-08 17:32:44 -0700491 wantErr: true,
492 }, {
Herbie Ong8170d692019-02-13 14:13:21 -0800493 desc: "oneof set to empty string",
494 inputMessage: &pb3.Oneofs{},
495 inputText: "oneof_string: ''",
496 wantMessage: &pb3.Oneofs{
497 Union: &pb3.Oneofs_OneofString{},
Herbie Ong800c9902018-12-06 15:28:53 -0800498 },
499 }, {
Herbie Ong8170d692019-02-13 14:13:21 -0800500 desc: "oneof set to string",
501 inputMessage: &pb3.Oneofs{},
502 inputText: "oneof_string: 'hello'",
503 wantMessage: &pb3.Oneofs{
504 Union: &pb3.Oneofs_OneofString{
505 OneofString: "hello",
Herbie Ong800c9902018-12-06 15:28:53 -0800506 },
507 },
508 }, {
Herbie Ong8170d692019-02-13 14:13:21 -0800509 desc: "oneof set to enum",
510 inputMessage: &pb3.Oneofs{},
511 inputText: "oneof_enum: TEN",
512 wantMessage: &pb3.Oneofs{
513 Union: &pb3.Oneofs_OneofEnum{
514 OneofEnum: pb3.Enum_TEN,
Herbie Ong800c9902018-12-06 15:28:53 -0800515 },
516 },
517 }, {
Herbie Ong8170d692019-02-13 14:13:21 -0800518 desc: "oneof set to empty message",
519 inputMessage: &pb3.Oneofs{},
520 inputText: "oneof_nested: {}",
521 wantMessage: &pb3.Oneofs{
522 Union: &pb3.Oneofs_OneofNested{
523 OneofNested: &pb3.Nested{},
524 },
525 },
526 }, {
527 desc: "oneof set to message",
528 inputMessage: &pb3.Oneofs{},
Herbie Ong800c9902018-12-06 15:28:53 -0800529 inputText: `
Herbie Ong8170d692019-02-13 14:13:21 -0800530oneof_nested: {
531 s_string: "nested message"
Herbie Ong800c9902018-12-06 15:28:53 -0800532}
533`,
Herbie Ong8170d692019-02-13 14:13:21 -0800534 wantMessage: &pb3.Oneofs{
535 Union: &pb3.Oneofs_OneofNested{
536 OneofNested: &pb3.Nested{
537 SString: "nested message",
Herbie Ong800c9902018-12-06 15:28:53 -0800538 },
539 },
540 },
541 }, {
Herbie Ong8a1d4602019-04-02 20:19:36 -0700542 desc: "oneof set to more than one field",
Herbie Ong8170d692019-02-13 14:13:21 -0800543 inputMessage: &pb3.Oneofs{},
Herbie Ong6470ea62019-01-07 18:56:57 -0800544 inputText: `
Herbie Ong8a1d4602019-04-02 20:19:36 -0700545oneof_enum: ZERO
546oneof_string: "hello"
Herbie Ong6470ea62019-01-07 18:56:57 -0800547`,
Herbie Ong8a1d4602019-04-02 20:19:36 -0700548 wantErr: true,
Herbie Ong6470ea62019-01-07 18:56:57 -0800549 }, {
Herbie Ong800c9902018-12-06 15:28:53 -0800550 desc: "repeated scalar using same field name",
551 inputMessage: &pb2.Repeats{},
552 inputText: `
553rpt_string: "a"
554rpt_string: "b"
555rpt_int32: 0xff
556rpt_float: 1.23
557rpt_bytes: "bytes"
558`,
559 wantMessage: &pb2.Repeats{
560 RptString: []string{"a", "b"},
561 RptInt32: []int32{0xff},
562 RptFloat: []float32{1.23},
563 RptBytes: [][]byte{[]byte("bytes")},
564 },
565 }, {
566 desc: "repeated using mix of [] and repeated field name",
567 inputMessage: &pb2.Repeats{},
568 inputText: `
569rpt_string: "a"
570rpt_bool: true
571rpt_string: ["x", "y"]
572rpt_bool: [ false, true ]
573rpt_string: "b"
574`,
575 wantMessage: &pb2.Repeats{
576 RptString: []string{"a", "x", "y", "b"},
577 RptBool: []bool{true, false, true},
578 },
579 }, {
Herbie Ong21a39742019-04-08 17:32:44 -0700580 desc: "repeated contains invalid UTF-8",
581 inputMessage: &pb2.Repeats{},
582 inputText: `rpt_string: "abc\xff"`,
Damien Neil8c86fc52019-06-19 09:28:29 -0700583 wantErr: true,
Herbie Ong21a39742019-04-08 17:32:44 -0700584 }, {
Herbie Ong800c9902018-12-06 15:28:53 -0800585 desc: "repeated enums",
586 inputMessage: &pb2.Enums{},
587 inputText: `
Herbie Ong8170d692019-02-13 14:13:21 -0800588rpt_enum: TEN
Herbie Ong800c9902018-12-06 15:28:53 -0800589rpt_enum: 1
590rpt_nested_enum: [DOS, 2]
591rpt_enum: 42
592rpt_nested_enum: -47
593`,
594 wantMessage: &pb2.Enums{
Herbie Ong8170d692019-02-13 14:13:21 -0800595 RptEnum: []pb2.Enum{pb2.Enum_TEN, pb2.Enum_ONE, 42},
Herbie Ong800c9902018-12-06 15:28:53 -0800596 RptNestedEnum: []pb2.Enums_NestedEnum{pb2.Enums_DOS, pb2.Enums_DOS, -47},
597 },
598 }, {
599 desc: "repeated nested messages",
600 inputMessage: &pb2.Nests{},
601 inputText: `
602rpt_nested: {
603 opt_string: "repeat nested one"
604}
605rpt_nested: {
606 opt_string: "repeat nested two"
607 opt_nested: {
608 opt_string: "inside repeat nested two"
609 }
610}
611rpt_nested: {}
612`,
613 wantMessage: &pb2.Nests{
614 RptNested: []*pb2.Nested{
615 {
Damien Neila8a2cea2019-07-10 16:17:16 -0700616 OptString: proto.String("repeat nested one"),
Herbie Ong800c9902018-12-06 15:28:53 -0800617 },
618 {
Damien Neila8a2cea2019-07-10 16:17:16 -0700619 OptString: proto.String("repeat nested two"),
Herbie Ong800c9902018-12-06 15:28:53 -0800620 OptNested: &pb2.Nested{
Damien Neila8a2cea2019-07-10 16:17:16 -0700621 OptString: proto.String("inside repeat nested two"),
Herbie Ong800c9902018-12-06 15:28:53 -0800622 },
623 },
624 {},
625 },
626 },
627 }, {
628 desc: "repeated group fields",
629 inputMessage: &pb2.Nests{},
630 inputText: `
Herbie Ong0dcfb9a2019-01-14 15:32:26 -0800631RptGroup: {
Herbie Ong8170d692019-02-13 14:13:21 -0800632 rpt_string: "hello"
633 rpt_string: "world"
Herbie Ong800c9902018-12-06 15:28:53 -0800634}
Herbie Ong0dcfb9a2019-01-14 15:32:26 -0800635RptGroup: {}
Herbie Ong800c9902018-12-06 15:28:53 -0800636`,
637 wantMessage: &pb2.Nests{
638 Rptgroup: []*pb2.Nests_RptGroup{
639 {
Herbie Ong8170d692019-02-13 14:13:21 -0800640 RptString: []string{"hello", "world"},
Herbie Ong800c9902018-12-06 15:28:53 -0800641 },
642 {},
643 },
644 },
645 }, {
646 desc: "map fields 1",
Herbie Ong8170d692019-02-13 14:13:21 -0800647 inputMessage: &pb3.Maps{},
Herbie Ong800c9902018-12-06 15:28:53 -0800648 inputText: `
649int32_to_str: {
650 key: -101
651 value: "-101"
652}
653int32_to_str: {
654 key: 0
655 value: "zero"
656}
Herbie Ong8170d692019-02-13 14:13:21 -0800657bool_to_uint32: {
658 key: false
659 value: 101
Herbie Ong800c9902018-12-06 15:28:53 -0800660}
661int32_to_str: {
662 key: 255
663 value: "0xff"
664}
665bool_to_uint32: {
Herbie Ong800c9902018-12-06 15:28:53 -0800666 key: true
667 value: 42
668}
669`,
Herbie Ong8170d692019-02-13 14:13:21 -0800670 wantMessage: &pb3.Maps{
Herbie Ong800c9902018-12-06 15:28:53 -0800671 Int32ToStr: map[int32]string{
672 -101: "-101",
673 0xff: "0xff",
674 0: "zero",
675 },
Herbie Ong800c9902018-12-06 15:28:53 -0800676 BoolToUint32: map[bool]uint32{
677 true: 42,
678 false: 101,
679 },
680 },
681 }, {
682 desc: "map fields 2",
Herbie Ong8170d692019-02-13 14:13:21 -0800683 inputMessage: &pb3.Maps{},
Herbie Ong800c9902018-12-06 15:28:53 -0800684 inputText: `
685uint64_to_enum: {
686 key: 1
Herbie Ong8170d692019-02-13 14:13:21 -0800687 value: ONE
Herbie Ong800c9902018-12-06 15:28:53 -0800688}
689uint64_to_enum: {
690 key: 2
Herbie Ong8170d692019-02-13 14:13:21 -0800691 value: 2
Herbie Ong800c9902018-12-06 15:28:53 -0800692}
693uint64_to_enum: {
694 key: 10
Herbie Ong8170d692019-02-13 14:13:21 -0800695 value: 101
Herbie Ong800c9902018-12-06 15:28:53 -0800696}
697`,
Herbie Ong8170d692019-02-13 14:13:21 -0800698 wantMessage: &pb3.Maps{
699 Uint64ToEnum: map[uint64]pb3.Enum{
700 1: pb3.Enum_ONE,
701 2: pb3.Enum_TWO,
702 10: 101,
Herbie Ong800c9902018-12-06 15:28:53 -0800703 },
704 },
705 }, {
706 desc: "map fields 3",
Herbie Ong8170d692019-02-13 14:13:21 -0800707 inputMessage: &pb3.Maps{},
Herbie Ong800c9902018-12-06 15:28:53 -0800708 inputText: `
709str_to_nested: {
710 key: "nested_one"
711 value: {
Herbie Ong8170d692019-02-13 14:13:21 -0800712 s_string: "nested in a map"
Herbie Ong800c9902018-12-06 15:28:53 -0800713 }
714}
715`,
Herbie Ong8170d692019-02-13 14:13:21 -0800716 wantMessage: &pb3.Maps{
717 StrToNested: map[string]*pb3.Nested{
718 "nested_one": &pb3.Nested{
719 SString: "nested in a map",
Herbie Ong800c9902018-12-06 15:28:53 -0800720 },
721 },
722 },
723 }, {
724 desc: "map fields 4",
Herbie Ong8170d692019-02-13 14:13:21 -0800725 inputMessage: &pb3.Maps{},
Herbie Ong800c9902018-12-06 15:28:53 -0800726 inputText: `
727str_to_oneofs: {
728 key: "nested"
729 value: {
Herbie Ong8170d692019-02-13 14:13:21 -0800730 oneof_nested: {
731 s_string: "nested oneof in map field value"
Herbie Ong800c9902018-12-06 15:28:53 -0800732 }
733 }
734}
735str_to_oneofs: {
736 key: "string"
737 value: {
Herbie Ong8170d692019-02-13 14:13:21 -0800738 oneof_string: "hello"
Herbie Ong800c9902018-12-06 15:28:53 -0800739 }
740}
741`,
Herbie Ong8170d692019-02-13 14:13:21 -0800742 wantMessage: &pb3.Maps{
743 StrToOneofs: map[string]*pb3.Oneofs{
744 "string": &pb3.Oneofs{
745 Union: &pb3.Oneofs_OneofString{
746 OneofString: "hello",
Herbie Ong800c9902018-12-06 15:28:53 -0800747 },
748 },
Herbie Ong8170d692019-02-13 14:13:21 -0800749 "nested": &pb3.Oneofs{
750 Union: &pb3.Oneofs_OneofNested{
751 OneofNested: &pb3.Nested{
752 SString: "nested oneof in map field value",
Herbie Ong800c9902018-12-06 15:28:53 -0800753 },
754 },
755 },
756 },
757 },
758 }, {
759 desc: "map contains duplicate keys",
Herbie Ong8170d692019-02-13 14:13:21 -0800760 inputMessage: &pb3.Maps{},
Herbie Ong800c9902018-12-06 15:28:53 -0800761 inputText: `
762int32_to_str: {
763 key: 0
764 value: "cero"
765}
766int32_to_str: {
767 key: 0
768 value: "zero"
769}
770`,
Herbie Ong8170d692019-02-13 14:13:21 -0800771 wantMessage: &pb3.Maps{
Herbie Ong800c9902018-12-06 15:28:53 -0800772 Int32ToStr: map[int32]string{
773 0: "zero",
774 },
775 },
776 }, {
777 desc: "map contains duplicate key fields",
Herbie Ong8170d692019-02-13 14:13:21 -0800778 inputMessage: &pb3.Maps{},
Herbie Ong800c9902018-12-06 15:28:53 -0800779 inputText: `
780int32_to_str: {
781 key: 0
782 key: 1
783 value: "cero"
784}
785`,
786 wantErr: true,
787 }, {
788 desc: "map contains duplicate value fields",
Herbie Ong8170d692019-02-13 14:13:21 -0800789 inputMessage: &pb3.Maps{},
Herbie Ong800c9902018-12-06 15:28:53 -0800790 inputText: `
791int32_to_str: {
792 key: 1
793 value: "cero"
794 value: "uno"
795}
796`,
797 wantErr: true,
798 }, {
799 desc: "map contains missing key",
Herbie Ong8170d692019-02-13 14:13:21 -0800800 inputMessage: &pb3.Maps{},
Herbie Ong800c9902018-12-06 15:28:53 -0800801 inputText: `
802int32_to_str: {
803 value: "zero"
804}
Herbie Ong8170d692019-02-13 14:13:21 -0800805bool_to_uint32: {
806 value: 47
807}
808str_to_nested: {
809 value: {}
810}
Herbie Ong800c9902018-12-06 15:28:53 -0800811`,
Herbie Ong8170d692019-02-13 14:13:21 -0800812 wantMessage: &pb3.Maps{
Herbie Ong800c9902018-12-06 15:28:53 -0800813 Int32ToStr: map[int32]string{
814 0: "zero",
815 },
Herbie Ong8170d692019-02-13 14:13:21 -0800816 BoolToUint32: map[bool]uint32{
817 false: 47,
818 },
819 StrToNested: map[string]*pb3.Nested{
820 "": {},
821 },
Herbie Ong800c9902018-12-06 15:28:53 -0800822 },
823 }, {
824 desc: "map contains missing value",
Herbie Ong8170d692019-02-13 14:13:21 -0800825 inputMessage: &pb3.Maps{},
Herbie Ong800c9902018-12-06 15:28:53 -0800826 inputText: `
827int32_to_str: {
828 key: 100
829}
Herbie Ong8170d692019-02-13 14:13:21 -0800830bool_to_uint32: {
831 key: true
832}
833uint64_to_enum: {
834 key: 101
835}
836str_to_nested: {
837 key: "hello"
838}
Herbie Ong800c9902018-12-06 15:28:53 -0800839`,
Herbie Ong8170d692019-02-13 14:13:21 -0800840 wantMessage: &pb3.Maps{
Herbie Ong800c9902018-12-06 15:28:53 -0800841 Int32ToStr: map[int32]string{
842 100: "",
843 },
Herbie Ong8170d692019-02-13 14:13:21 -0800844 BoolToUint32: map[bool]uint32{
845 true: 0,
846 },
847 Uint64ToEnum: map[uint64]pb3.Enum{
848 101: pb3.Enum_ZERO,
849 },
850 StrToNested: map[string]*pb3.Nested{
851 "hello": {},
852 },
Herbie Ong800c9902018-12-06 15:28:53 -0800853 },
854 }, {
855 desc: "map contains missing key and value",
Herbie Ong8170d692019-02-13 14:13:21 -0800856 inputMessage: &pb3.Maps{},
Herbie Ong800c9902018-12-06 15:28:53 -0800857 inputText: `
858int32_to_str: {}
Herbie Ong8170d692019-02-13 14:13:21 -0800859bool_to_uint32: {}
860uint64_to_enum: {}
861str_to_nested: {}
Herbie Ong800c9902018-12-06 15:28:53 -0800862`,
Herbie Ong8170d692019-02-13 14:13:21 -0800863 wantMessage: &pb3.Maps{
864 Int32ToStr: map[int32]string{
865 0: "",
866 },
867 BoolToUint32: map[bool]uint32{
868 false: 0,
869 },
870 Uint64ToEnum: map[uint64]pb3.Enum{
871 0: pb3.Enum_ZERO,
872 },
873 StrToNested: map[string]*pb3.Nested{
874 "": {},
875 },
876 },
877 }, {
878 desc: "map contains overriding entries",
879 inputMessage: &pb3.Maps{},
880 inputText: `
881int32_to_str: {
882 key: 0
883}
884int32_to_str: {
885 value: "empty"
886}
887int32_to_str: {}
888`,
889 wantMessage: &pb3.Maps{
Herbie Ong800c9902018-12-06 15:28:53 -0800890 Int32ToStr: map[int32]string{
891 0: "",
892 },
893 },
894 }, {
Herbie Ong21a39742019-04-08 17:32:44 -0700895 desc: "map field value contains invalid UTF-8",
896 inputMessage: &pb3.Maps{},
897 inputText: `int32_to_str: {
898 key: 101
899 value: "abc\xff"
900}
901`,
Herbie Ong21a39742019-04-08 17:32:44 -0700902 wantErr: true,
903 }, {
904 desc: "map field key contains invalid UTF-8",
905 inputMessage: &pb3.Maps{},
906 inputText: `str_to_nested: {
907 key: "abc\xff"
908 value: {}
909}
910`,
Herbie Ong21a39742019-04-08 17:32:44 -0700911 wantErr: true,
912 }, {
Herbie Ong800c9902018-12-06 15:28:53 -0800913 desc: "map contains unknown field",
Herbie Ong8170d692019-02-13 14:13:21 -0800914 inputMessage: &pb3.Maps{},
Herbie Ong800c9902018-12-06 15:28:53 -0800915 inputText: `
916int32_to_str: {
917 key: 0
918 value: "cero"
919 unknown: "bad"
920}
921`,
922 wantErr: true,
923 }, {
924 desc: "map contains extension-like key field",
Herbie Ong8170d692019-02-13 14:13:21 -0800925 inputMessage: &pb3.Maps{},
Herbie Ong800c9902018-12-06 15:28:53 -0800926 inputText: `
927int32_to_str: {
928 [key]: 10
929 value: "ten"
930}
931`,
932 wantErr: true,
933 }, {
934 desc: "map contains invalid key",
Herbie Ong8170d692019-02-13 14:13:21 -0800935 inputMessage: &pb3.Maps{},
Herbie Ong800c9902018-12-06 15:28:53 -0800936 inputText: `
937int32_to_str: {
938 key: "invalid"
939 value: "cero"
940}
941`,
942 wantErr: true,
943 }, {
944 desc: "map contains invalid value",
Herbie Ong8170d692019-02-13 14:13:21 -0800945 inputMessage: &pb3.Maps{},
Herbie Ong800c9902018-12-06 15:28:53 -0800946 inputText: `
947int32_to_str: {
948 key: 100
949 value: 101
950}
951`,
952 wantErr: true,
953 }, {
954 desc: "map using mix of [] and repeated",
Herbie Ong8170d692019-02-13 14:13:21 -0800955 inputMessage: &pb3.Maps{},
Herbie Ong800c9902018-12-06 15:28:53 -0800956 inputText: `
957int32_to_str: {
958 key: 1
959 value: "one"
960}
961int32_to_str: [
962 {
963 key: 2
964 value: "not this"
965 },
966 {
967 },
968 {
969 key: 3
970 value: "three"
971 }
972]
973int32_to_str: {
974 key: 2
975 value: "two"
976}
977`,
Herbie Ong8170d692019-02-13 14:13:21 -0800978 wantMessage: &pb3.Maps{
Herbie Ong800c9902018-12-06 15:28:53 -0800979 Int32ToStr: map[int32]string{
980 0: "",
981 1: "one",
982 2: "two",
983 3: "three",
984 },
985 },
986 }, {
Herbie Ong42577ea2019-03-26 16:26:22 -0700987 desc: "required fields not set",
Herbie Ong800c9902018-12-06 15:28:53 -0800988 inputMessage: &pb2.Requireds{},
989 wantErr: true,
990 }, {
Herbie Ong42577ea2019-03-26 16:26:22 -0700991 desc: "required field set",
Herbie Ong800c9902018-12-06 15:28:53 -0800992 inputMessage: &pb2.PartialRequired{},
993 inputText: "req_string: 'this is required'",
994 wantMessage: &pb2.PartialRequired{
Damien Neila8a2cea2019-07-10 16:17:16 -0700995 ReqString: proto.String("this is required"),
Herbie Ong800c9902018-12-06 15:28:53 -0800996 },
997 }, {
Herbie Ong42577ea2019-03-26 16:26:22 -0700998 desc: "required fields partially set",
Herbie Ong800c9902018-12-06 15:28:53 -0800999 inputMessage: &pb2.Requireds{},
1000 inputText: `
1001req_bool: false
Herbie Ong800c9902018-12-06 15:28:53 -08001002req_sfixed64: 3203386110
1003req_string: "hello"
Herbie Ong8170d692019-02-13 14:13:21 -08001004req_enum: ONE
Herbie Ong800c9902018-12-06 15:28:53 -08001005`,
1006 wantMessage: &pb2.Requireds{
Damien Neila8a2cea2019-07-10 16:17:16 -07001007 ReqBool: proto.Bool(false),
1008 ReqSfixed64: proto.Int64(0xbeefcafe),
1009 ReqString: proto.String("hello"),
Herbie Ong8170d692019-02-13 14:13:21 -08001010 ReqEnum: pb2.Enum_ONE.Enum(),
Herbie Ong800c9902018-12-06 15:28:53 -08001011 },
1012 wantErr: true,
1013 }, {
Herbie Ong42577ea2019-03-26 16:26:22 -07001014 desc: "required fields partially set with AllowPartial",
Damien Neil5c5b5312019-05-14 12:44:37 -07001015 umo: prototext.UnmarshalOptions{AllowPartial: true},
Herbie Ong42577ea2019-03-26 16:26:22 -07001016 inputMessage: &pb2.Requireds{},
1017 inputText: `
1018req_bool: false
1019req_sfixed64: 3203386110
1020req_string: "hello"
1021req_enum: ONE
1022`,
1023 wantMessage: &pb2.Requireds{
Damien Neila8a2cea2019-07-10 16:17:16 -07001024 ReqBool: proto.Bool(false),
1025 ReqSfixed64: proto.Int64(0xbeefcafe),
1026 ReqString: proto.String("hello"),
Herbie Ong42577ea2019-03-26 16:26:22 -07001027 ReqEnum: pb2.Enum_ONE.Enum(),
1028 },
1029 }, {
1030 desc: "required fields all set",
Herbie Ong800c9902018-12-06 15:28:53 -08001031 inputMessage: &pb2.Requireds{},
1032 inputText: `
1033req_bool: false
Herbie Ong800c9902018-12-06 15:28:53 -08001034req_sfixed64: 0
Herbie Ong800c9902018-12-06 15:28:53 -08001035req_double: 0
1036req_string: ""
Herbie Ong8170d692019-02-13 14:13:21 -08001037req_enum: ONE
Herbie Ong800c9902018-12-06 15:28:53 -08001038req_nested: {}
1039`,
1040 wantMessage: &pb2.Requireds{
Damien Neila8a2cea2019-07-10 16:17:16 -07001041 ReqBool: proto.Bool(false),
1042 ReqSfixed64: proto.Int64(0),
1043 ReqDouble: proto.Float64(0),
1044 ReqString: proto.String(""),
Herbie Ong8170d692019-02-13 14:13:21 -08001045 ReqEnum: pb2.Enum_ONE.Enum(),
Herbie Ong800c9902018-12-06 15:28:53 -08001046 ReqNested: &pb2.Nested{},
1047 },
1048 }, {
1049 desc: "indirect required field",
1050 inputMessage: &pb2.IndirectRequired{},
1051 inputText: "opt_nested: {}",
1052 wantMessage: &pb2.IndirectRequired{
1053 OptNested: &pb2.NestedWithRequired{},
1054 },
1055 wantErr: true,
1056 }, {
Herbie Ong42577ea2019-03-26 16:26:22 -07001057 desc: "indirect required field with AllowPartial",
Damien Neil5c5b5312019-05-14 12:44:37 -07001058 umo: prototext.UnmarshalOptions{AllowPartial: true},
Herbie Ong42577ea2019-03-26 16:26:22 -07001059 inputMessage: &pb2.IndirectRequired{},
1060 inputText: "opt_nested: {}",
1061 wantMessage: &pb2.IndirectRequired{
1062 OptNested: &pb2.NestedWithRequired{},
1063 },
1064 }, {
Herbie Ong800c9902018-12-06 15:28:53 -08001065 desc: "indirect required field in repeated",
1066 inputMessage: &pb2.IndirectRequired{},
1067 inputText: `
1068rpt_nested: {
1069 req_string: "one"
1070}
1071rpt_nested: {}
Herbie Ong800c9902018-12-06 15:28:53 -08001072`,
1073 wantMessage: &pb2.IndirectRequired{
1074 RptNested: []*pb2.NestedWithRequired{
1075 {
Damien Neila8a2cea2019-07-10 16:17:16 -07001076 ReqString: proto.String("one"),
Herbie Ong800c9902018-12-06 15:28:53 -08001077 },
1078 {},
Herbie Ong800c9902018-12-06 15:28:53 -08001079 },
1080 },
1081 wantErr: true,
1082 }, {
Herbie Ong42577ea2019-03-26 16:26:22 -07001083 desc: "indirect required field in repeated with AllowPartial",
Damien Neil5c5b5312019-05-14 12:44:37 -07001084 umo: prototext.UnmarshalOptions{AllowPartial: true},
Herbie Ong42577ea2019-03-26 16:26:22 -07001085 inputMessage: &pb2.IndirectRequired{},
1086 inputText: `
1087rpt_nested: {
1088 req_string: "one"
1089}
1090rpt_nested: {}
1091`,
1092 wantMessage: &pb2.IndirectRequired{
1093 RptNested: []*pb2.NestedWithRequired{
1094 {
Damien Neila8a2cea2019-07-10 16:17:16 -07001095 ReqString: proto.String("one"),
Herbie Ong42577ea2019-03-26 16:26:22 -07001096 },
1097 {},
1098 },
1099 },
1100 }, {
Herbie Ong800c9902018-12-06 15:28:53 -08001101 desc: "indirect required field in map",
1102 inputMessage: &pb2.IndirectRequired{},
1103 inputText: `
1104str_to_nested: {
1105 key: "missing"
1106}
1107str_to_nested: {
1108 key: "contains"
1109 value: {
1110 req_string: "here"
1111 }
1112}
1113`,
1114 wantMessage: &pb2.IndirectRequired{
1115 StrToNested: map[string]*pb2.NestedWithRequired{
1116 "missing": &pb2.NestedWithRequired{},
1117 "contains": &pb2.NestedWithRequired{
Damien Neila8a2cea2019-07-10 16:17:16 -07001118 ReqString: proto.String("here"),
Herbie Ong800c9902018-12-06 15:28:53 -08001119 },
1120 },
1121 },
1122 wantErr: true,
Herbie Ong7c624e22018-12-13 14:41:22 -08001123 }, {
Herbie Ong42577ea2019-03-26 16:26:22 -07001124 desc: "indirect required field in map with AllowPartial",
Damien Neil5c5b5312019-05-14 12:44:37 -07001125 umo: prototext.UnmarshalOptions{AllowPartial: true},
Herbie Ong42577ea2019-03-26 16:26:22 -07001126 inputMessage: &pb2.IndirectRequired{},
1127 inputText: `
1128str_to_nested: {
1129 key: "missing"
1130}
1131str_to_nested: {
1132 key: "contains"
1133 value: {
1134 req_string: "here"
1135 }
1136}
1137`,
1138 wantMessage: &pb2.IndirectRequired{
1139 StrToNested: map[string]*pb2.NestedWithRequired{
1140 "missing": &pb2.NestedWithRequired{},
1141 "contains": &pb2.NestedWithRequired{
Damien Neila8a2cea2019-07-10 16:17:16 -07001142 ReqString: proto.String("here"),
Herbie Ong42577ea2019-03-26 16:26:22 -07001143 },
1144 },
1145 },
1146 }, {
Herbie Ong8170d692019-02-13 14:13:21 -08001147 desc: "indirect required field in oneof",
1148 inputMessage: &pb2.IndirectRequired{},
1149 inputText: `oneof_nested: {}
1150`,
1151 wantMessage: &pb2.IndirectRequired{
1152 Union: &pb2.IndirectRequired_OneofNested{
1153 OneofNested: &pb2.NestedWithRequired{},
1154 },
1155 },
1156 wantErr: true,
1157 }, {
Herbie Ong42577ea2019-03-26 16:26:22 -07001158 desc: "indirect required field in oneof with AllowPartial",
Damien Neil5c5b5312019-05-14 12:44:37 -07001159 umo: prototext.UnmarshalOptions{AllowPartial: true},
Herbie Ong42577ea2019-03-26 16:26:22 -07001160 inputMessage: &pb2.IndirectRequired{},
1161 inputText: `oneof_nested: {}
1162`,
1163 wantMessage: &pb2.IndirectRequired{
1164 Union: &pb2.IndirectRequired_OneofNested{
1165 OneofNested: &pb2.NestedWithRequired{},
1166 },
1167 },
1168 }, {
Herbie Ong7c624e22018-12-13 14:41:22 -08001169 desc: "ignore reserved field",
1170 inputMessage: &pb2.Nests{},
1171 inputText: "reserved_field: 'ignore this'",
1172 wantMessage: &pb2.Nests{},
Herbie Ongc525c972018-12-18 18:04:31 -08001173 }, {
1174 desc: "extensions of non-repeated fields",
1175 inputMessage: &pb2.Extensions{},
1176 inputText: `opt_string: "non-extension field"
1177[pb2.opt_ext_bool]: true
1178opt_bool: true
1179[pb2.opt_ext_nested]: {
1180 opt_string: "nested in an extension"
1181 opt_nested: {
1182 opt_string: "another nested in an extension"
1183 }
1184}
1185[pb2.opt_ext_string]: "extension field"
1186opt_int32: 42
Herbie Ong8170d692019-02-13 14:13:21 -08001187[pb2.opt_ext_enum]: TEN
Herbie Ongc525c972018-12-18 18:04:31 -08001188`,
1189 wantMessage: func() proto.Message {
1190 m := &pb2.Extensions{
Damien Neila8a2cea2019-07-10 16:17:16 -07001191 OptString: proto.String("non-extension field"),
1192 OptBool: proto.Bool(true),
1193 OptInt32: proto.Int32(42),
Herbie Ongc525c972018-12-18 18:04:31 -08001194 }
Damien Neil92f76182019-08-02 16:58:08 -07001195 proto.SetExtension(m, pb2.E_OptExtBool, true)
1196 proto.SetExtension(m, pb2.E_OptExtString, "extension field")
1197 proto.SetExtension(m, pb2.E_OptExtEnum, pb2.Enum_TEN)
1198 proto.SetExtension(m, pb2.E_OptExtNested, &pb2.Nested{
Damien Neila8a2cea2019-07-10 16:17:16 -07001199 OptString: proto.String("nested in an extension"),
Herbie Ongc525c972018-12-18 18:04:31 -08001200 OptNested: &pb2.Nested{
Damien Neila8a2cea2019-07-10 16:17:16 -07001201 OptString: proto.String("another nested in an extension"),
Herbie Ongc525c972018-12-18 18:04:31 -08001202 },
1203 })
1204 return m
1205 }(),
1206 }, {
Herbie Ong21a39742019-04-08 17:32:44 -07001207 desc: "extension field contains invalid UTF-8",
1208 inputMessage: &pb2.Extensions{},
1209 inputText: `[pb2.opt_ext_string]: "abc\xff"`,
Damien Neil8c86fc52019-06-19 09:28:29 -07001210 wantErr: true,
Herbie Ong21a39742019-04-08 17:32:44 -07001211 }, {
Herbie Ongc525c972018-12-18 18:04:31 -08001212 desc: "extensions of repeated fields",
1213 inputMessage: &pb2.Extensions{},
Herbie Ong8170d692019-02-13 14:13:21 -08001214 inputText: `[pb2.rpt_ext_enum]: TEN
Herbie Ongc525c972018-12-18 18:04:31 -08001215[pb2.rpt_ext_enum]: 101
1216[pb2.rpt_ext_fixed32]: 42
Herbie Ong8170d692019-02-13 14:13:21 -08001217[pb2.rpt_ext_enum]: ONE
Herbie Ongc525c972018-12-18 18:04:31 -08001218[pb2.rpt_ext_nested]: {
1219 opt_string: "one"
1220}
1221[pb2.rpt_ext_nested]: {
1222 opt_string: "two"
1223}
1224[pb2.rpt_ext_fixed32]: 47
1225[pb2.rpt_ext_nested]: {
1226 opt_string: "three"
1227}
1228`,
1229 wantMessage: func() proto.Message {
1230 m := &pb2.Extensions{}
Damien Neil293dc762019-08-29 11:42:57 -07001231 proto.SetExtension(m, pb2.E_RptExtEnum, []pb2.Enum{pb2.Enum_TEN, 101, pb2.Enum_ONE})
1232 proto.SetExtension(m, pb2.E_RptExtFixed32, []uint32{42, 47})
1233 proto.SetExtension(m, pb2.E_RptExtNested, []*pb2.Nested{
Damien Neila8a2cea2019-07-10 16:17:16 -07001234 &pb2.Nested{OptString: proto.String("one")},
1235 &pb2.Nested{OptString: proto.String("two")},
1236 &pb2.Nested{OptString: proto.String("three")},
Herbie Ongc525c972018-12-18 18:04:31 -08001237 })
1238 return m
1239 }(),
1240 }, {
1241 desc: "extensions of non-repeated fields in another message",
1242 inputMessage: &pb2.Extensions{},
1243 inputText: `[pb2.ExtensionsContainer.opt_ext_bool]: true
Herbie Ong8170d692019-02-13 14:13:21 -08001244[pb2.ExtensionsContainer.opt_ext_enum]: TEN
Herbie Ongc525c972018-12-18 18:04:31 -08001245[pb2.ExtensionsContainer.opt_ext_nested]: {
1246 opt_string: "nested in an extension"
1247 opt_nested: {
1248 opt_string: "another nested in an extension"
1249 }
1250}
1251[pb2.ExtensionsContainer.opt_ext_string]: "extension field"
1252`,
1253 wantMessage: func() proto.Message {
1254 m := &pb2.Extensions{}
Damien Neil92f76182019-08-02 16:58:08 -07001255 proto.SetExtension(m, pb2.E_ExtensionsContainer_OptExtBool, true)
1256 proto.SetExtension(m, pb2.E_ExtensionsContainer_OptExtString, "extension field")
1257 proto.SetExtension(m, pb2.E_ExtensionsContainer_OptExtEnum, pb2.Enum_TEN)
1258 proto.SetExtension(m, pb2.E_ExtensionsContainer_OptExtNested, &pb2.Nested{
Damien Neila8a2cea2019-07-10 16:17:16 -07001259 OptString: proto.String("nested in an extension"),
Herbie Ongc525c972018-12-18 18:04:31 -08001260 OptNested: &pb2.Nested{
Damien Neila8a2cea2019-07-10 16:17:16 -07001261 OptString: proto.String("another nested in an extension"),
Herbie Ongc525c972018-12-18 18:04:31 -08001262 },
1263 })
1264 return m
1265 }(),
1266 }, {
1267 desc: "extensions of repeated fields in another message",
1268 inputMessage: &pb2.Extensions{},
1269 inputText: `opt_string: "non-extension field"
1270opt_bool: true
1271opt_int32: 42
1272[pb2.ExtensionsContainer.rpt_ext_nested]: {
1273 opt_string: "one"
1274}
Herbie Ong8170d692019-02-13 14:13:21 -08001275[pb2.ExtensionsContainer.rpt_ext_enum]: TEN
Herbie Ongc525c972018-12-18 18:04:31 -08001276[pb2.ExtensionsContainer.rpt_ext_nested]: {
1277 opt_string: "two"
1278}
1279[pb2.ExtensionsContainer.rpt_ext_enum]: 101
1280[pb2.ExtensionsContainer.rpt_ext_string]: "hello"
Herbie Ong8170d692019-02-13 14:13:21 -08001281[pb2.ExtensionsContainer.rpt_ext_enum]: ONE
Herbie Ongc525c972018-12-18 18:04:31 -08001282[pb2.ExtensionsContainer.rpt_ext_nested]: {
1283 opt_string: "three"
1284}
1285[pb2.ExtensionsContainer.rpt_ext_string]: "world"
1286`,
1287 wantMessage: func() proto.Message {
1288 m := &pb2.Extensions{
Damien Neila8a2cea2019-07-10 16:17:16 -07001289 OptString: proto.String("non-extension field"),
1290 OptBool: proto.Bool(true),
1291 OptInt32: proto.Int32(42),
Herbie Ongc525c972018-12-18 18:04:31 -08001292 }
Damien Neil293dc762019-08-29 11:42:57 -07001293 proto.SetExtension(m, pb2.E_ExtensionsContainer_RptExtEnum, []pb2.Enum{pb2.Enum_TEN, 101, pb2.Enum_ONE})
1294 proto.SetExtension(m, pb2.E_ExtensionsContainer_RptExtString, []string{"hello", "world"})
1295 proto.SetExtension(m, pb2.E_ExtensionsContainer_RptExtNested, []*pb2.Nested{
Damien Neila8a2cea2019-07-10 16:17:16 -07001296 &pb2.Nested{OptString: proto.String("one")},
1297 &pb2.Nested{OptString: proto.String("two")},
1298 &pb2.Nested{OptString: proto.String("three")},
Herbie Ongc525c972018-12-18 18:04:31 -08001299 })
1300 return m
1301 }(),
1302 }, {
1303 desc: "invalid extension field name",
1304 inputMessage: &pb2.Extensions{},
1305 inputText: "[pb2.invalid_message_field]: true",
1306 wantErr: true,
Herbie Ong66c365c2019-01-04 14:08:41 -08001307 }, {
Herbie Ong6470ea62019-01-07 18:56:57 -08001308 desc: "MessageSet",
1309 inputMessage: &pb2.MessageSet{},
1310 inputText: `
1311[pb2.MessageSetExtension]: {
1312 opt_string: "a messageset extension"
1313}
1314[pb2.MessageSetExtension.ext_nested]: {
1315 opt_string: "just a regular extension"
1316}
1317[pb2.MessageSetExtension.not_message_set_extension]: {
1318 opt_string: "not a messageset extension"
1319}
1320`,
1321 wantMessage: func() proto.Message {
1322 m := &pb2.MessageSet{}
Damien Neil92f76182019-08-02 16:58:08 -07001323 proto.SetExtension(m, pb2.E_MessageSetExtension_MessageSetExtension, &pb2.MessageSetExtension{
Damien Neila8a2cea2019-07-10 16:17:16 -07001324 OptString: proto.String("a messageset extension"),
Herbie Ong6470ea62019-01-07 18:56:57 -08001325 })
Damien Neil92f76182019-08-02 16:58:08 -07001326 proto.SetExtension(m, pb2.E_MessageSetExtension_NotMessageSetExtension, &pb2.MessageSetExtension{
Damien Neila8a2cea2019-07-10 16:17:16 -07001327 OptString: proto.String("not a messageset extension"),
Herbie Ong6470ea62019-01-07 18:56:57 -08001328 })
Damien Neil92f76182019-08-02 16:58:08 -07001329 proto.SetExtension(m, pb2.E_MessageSetExtension_ExtNested, &pb2.Nested{
Damien Neila8a2cea2019-07-10 16:17:16 -07001330 OptString: proto.String("just a regular extension"),
Herbie Ong6470ea62019-01-07 18:56:57 -08001331 })
1332 return m
1333 }(),
Joe Tsai1799d112019-08-08 13:31:59 -07001334 skip: !flags.ProtoLegacy,
Herbie Ong6470ea62019-01-07 18:56:57 -08001335 }, {
1336 desc: "not real MessageSet 1",
1337 inputMessage: &pb2.FakeMessageSet{},
1338 inputText: `
1339[pb2.FakeMessageSetExtension.message_set_extension]: {
1340 opt_string: "not a messageset extension"
1341}
1342`,
1343 wantMessage: func() proto.Message {
1344 m := &pb2.FakeMessageSet{}
Damien Neil92f76182019-08-02 16:58:08 -07001345 proto.SetExtension(m, pb2.E_FakeMessageSetExtension_MessageSetExtension, &pb2.FakeMessageSetExtension{
Damien Neila8a2cea2019-07-10 16:17:16 -07001346 OptString: proto.String("not a messageset extension"),
Herbie Ong6470ea62019-01-07 18:56:57 -08001347 })
1348 return m
1349 }(),
Joe Tsai1799d112019-08-08 13:31:59 -07001350 skip: !flags.ProtoLegacy,
Herbie Ong6470ea62019-01-07 18:56:57 -08001351 }, {
1352 desc: "not real MessageSet 2",
1353 inputMessage: &pb2.FakeMessageSet{},
1354 inputText: `
1355[pb2.FakeMessageSetExtension]: {
1356 opt_string: "not a messageset extension"
1357}
1358`,
1359 wantErr: true,
Joe Tsai1799d112019-08-08 13:31:59 -07001360 skip: !flags.ProtoLegacy,
Herbie Ong6470ea62019-01-07 18:56:57 -08001361 }, {
1362 desc: "not real MessageSet 3",
1363 inputMessage: &pb2.MessageSet{},
1364 inputText: `
1365[pb2.message_set_extension]: {
1366 opt_string: "another not a messageset extension"
Herbie Ong300cff02019-03-20 18:05:16 -07001367}`,
Herbie Ong6470ea62019-01-07 18:56:57 -08001368 wantMessage: func() proto.Message {
1369 m := &pb2.MessageSet{}
Damien Neil92f76182019-08-02 16:58:08 -07001370 proto.SetExtension(m, pb2.E_MessageSetExtension, &pb2.FakeMessageSetExtension{
Damien Neila8a2cea2019-07-10 16:17:16 -07001371 OptString: proto.String("another not a messageset extension"),
Herbie Ong6470ea62019-01-07 18:56:57 -08001372 })
1373 return m
1374 }(),
Joe Tsai1799d112019-08-08 13:31:59 -07001375 skip: !flags.ProtoLegacy,
Herbie Ong6470ea62019-01-07 18:56:57 -08001376 }, {
Herbie Ong66c365c2019-01-04 14:08:41 -08001377 desc: "Any not expanded",
Joe Tsaia95b29f2019-05-16 12:47:20 -07001378 inputMessage: &anypb.Any{},
Herbie Ong300cff02019-03-20 18:05:16 -07001379 inputText: `
Herbie Ong66c365c2019-01-04 14:08:41 -08001380type_url: "pb2.Nested"
1381value: "some bytes"
Herbie Ong66c365c2019-01-04 14:08:41 -08001382`,
Joe Tsaia95b29f2019-05-16 12:47:20 -07001383 wantMessage: &anypb.Any{
Herbie Ong300cff02019-03-20 18:05:16 -07001384 TypeUrl: "pb2.Nested",
1385 Value: []byte("some bytes"),
Herbie Ong66c365c2019-01-04 14:08:41 -08001386 },
1387 }, {
1388 desc: "Any not expanded missing value",
Joe Tsaia95b29f2019-05-16 12:47:20 -07001389 inputMessage: &anypb.Any{},
Herbie Ong300cff02019-03-20 18:05:16 -07001390 inputText: `type_url: "pb2.Nested"`,
Joe Tsaia95b29f2019-05-16 12:47:20 -07001391 wantMessage: &anypb.Any{
Herbie Ong300cff02019-03-20 18:05:16 -07001392 TypeUrl: "pb2.Nested",
Herbie Ong66c365c2019-01-04 14:08:41 -08001393 },
1394 }, {
1395 desc: "Any not expanded missing type_url",
Joe Tsaia95b29f2019-05-16 12:47:20 -07001396 inputMessage: &anypb.Any{},
Herbie Ong300cff02019-03-20 18:05:16 -07001397 inputText: `value: "some bytes"`,
Joe Tsaia95b29f2019-05-16 12:47:20 -07001398 wantMessage: &anypb.Any{
Herbie Ong300cff02019-03-20 18:05:16 -07001399 Value: []byte("some bytes"),
Herbie Ong66c365c2019-01-04 14:08:41 -08001400 },
1401 }, {
Damien Neilc1507ac2019-10-08 13:24:16 -07001402 desc: "Any expanded",
Joe Tsaia95b29f2019-05-16 12:47:20 -07001403 inputMessage: &anypb.Any{},
Herbie Ong300cff02019-03-20 18:05:16 -07001404 inputText: `
1405[foobar/pb2.Nested]: {
1406 opt_string: "embedded inside Any"
1407 opt_nested: {
1408 opt_string: "inception"
Herbie Ong66c365c2019-01-04 14:08:41 -08001409 }
1410}
1411`,
1412 wantMessage: func() proto.Message {
1413 m := &pb2.Nested{
Damien Neila8a2cea2019-07-10 16:17:16 -07001414 OptString: proto.String("embedded inside Any"),
Herbie Ong66c365c2019-01-04 14:08:41 -08001415 OptNested: &pb2.Nested{
Damien Neila8a2cea2019-07-10 16:17:16 -07001416 OptString: proto.String("inception"),
Herbie Ong66c365c2019-01-04 14:08:41 -08001417 },
1418 }
Herbie Onge0cf15b2019-03-15 19:32:38 -07001419 b, err := proto.MarshalOptions{Deterministic: true}.Marshal(m)
Herbie Ong66c365c2019-01-04 14:08:41 -08001420 if err != nil {
1421 t.Fatalf("error in binary marshaling message for Any.value: %v", err)
1422 }
Joe Tsaia95b29f2019-05-16 12:47:20 -07001423 return &anypb.Any{
Herbie Ong300cff02019-03-20 18:05:16 -07001424 TypeUrl: "foobar/pb2.Nested",
1425 Value: b,
Herbie Ong66c365c2019-01-04 14:08:41 -08001426 }
1427 }(),
1428 }, {
Damien Neilc1507ac2019-10-08 13:24:16 -07001429 desc: "Any expanded with empty value",
Joe Tsaia95b29f2019-05-16 12:47:20 -07001430 inputMessage: &anypb.Any{},
Herbie Ong300cff02019-03-20 18:05:16 -07001431 inputText: `[foo.com/pb2.Nested]: {}`,
Joe Tsaia95b29f2019-05-16 12:47:20 -07001432 wantMessage: &anypb.Any{
Herbie Ong300cff02019-03-20 18:05:16 -07001433 TypeUrl: "foo.com/pb2.Nested",
Herbie Ong66c365c2019-01-04 14:08:41 -08001434 },
1435 }, {
Damien Neilc1507ac2019-10-08 13:24:16 -07001436 desc: "Any expanded with missing required",
Joe Tsaia95b29f2019-05-16 12:47:20 -07001437 inputMessage: &anypb.Any{},
Herbie Ong300cff02019-03-20 18:05:16 -07001438 inputText: `
1439[pb2.PartialRequired]: {
1440 opt_string: "embedded inside Any"
Herbie Ong66c365c2019-01-04 14:08:41 -08001441}
1442`,
1443 wantMessage: func() proto.Message {
1444 m := &pb2.PartialRequired{
Damien Neila8a2cea2019-07-10 16:17:16 -07001445 OptString: proto.String("embedded inside Any"),
Herbie Ong66c365c2019-01-04 14:08:41 -08001446 }
Damien Neil96c229a2019-04-03 12:17:24 -07001447 b, err := proto.MarshalOptions{
1448 AllowPartial: true,
1449 Deterministic: true,
1450 }.Marshal(m)
Herbie Ong300cff02019-03-20 18:05:16 -07001451 if err != nil {
Herbie Ong66c365c2019-01-04 14:08:41 -08001452 t.Fatalf("error in binary marshaling message for Any.value: %v", err)
1453 }
Joe Tsaia95b29f2019-05-16 12:47:20 -07001454 return &anypb.Any{
Herbie Ong300cff02019-03-20 18:05:16 -07001455 TypeUrl: "pb2.PartialRequired",
1456 Value: b,
Herbie Ong66c365c2019-01-04 14:08:41 -08001457 }
1458 }(),
Herbie Ong66c365c2019-01-04 14:08:41 -08001459 }, {
Damien Neilc1507ac2019-10-08 13:24:16 -07001460 desc: "Any with invalid UTF-8",
Joe Tsaia95b29f2019-05-16 12:47:20 -07001461 inputMessage: &anypb.Any{},
Herbie Ong21a39742019-04-08 17:32:44 -07001462 inputText: `
1463[pb3.Nested]: {
1464 s_string: "abc\xff"
1465}
1466`,
Herbie Ong21a39742019-04-08 17:32:44 -07001467 wantErr: true,
1468 }, {
Herbie Ong66c365c2019-01-04 14:08:41 -08001469 desc: "Any expanded with unregistered type",
Damien Neilc1507ac2019-10-08 13:24:16 -07001470 umo: prototext.UnmarshalOptions{Resolver: new(preg.Types)},
Joe Tsaia95b29f2019-05-16 12:47:20 -07001471 inputMessage: &anypb.Any{},
Herbie Ong300cff02019-03-20 18:05:16 -07001472 inputText: `[SomeMessage]: {}`,
1473 wantErr: true,
Herbie Ong66c365c2019-01-04 14:08:41 -08001474 }, {
Damien Neilc1507ac2019-10-08 13:24:16 -07001475 desc: "Any expanded with invalid value",
Joe Tsaia95b29f2019-05-16 12:47:20 -07001476 inputMessage: &anypb.Any{},
Herbie Ong300cff02019-03-20 18:05:16 -07001477 inputText: `[pb2.Nested]: 123`,
1478 wantErr: true,
Herbie Ong66c365c2019-01-04 14:08:41 -08001479 }, {
Damien Neilc1507ac2019-10-08 13:24:16 -07001480 desc: "Any expanded with unknown fields",
Joe Tsaia95b29f2019-05-16 12:47:20 -07001481 inputMessage: &anypb.Any{},
Herbie Ong300cff02019-03-20 18:05:16 -07001482 inputText: `
Herbie Ong66c365c2019-01-04 14:08:41 -08001483[pb2.Nested]: {}
1484unknown: ""
Herbie Ong66c365c2019-01-04 14:08:41 -08001485`,
1486 wantErr: true,
1487 }, {
Damien Neilc1507ac2019-10-08 13:24:16 -07001488 desc: "Any contains expanded and unexpanded fields",
Joe Tsaia95b29f2019-05-16 12:47:20 -07001489 inputMessage: &anypb.Any{},
Herbie Ong300cff02019-03-20 18:05:16 -07001490 inputText: `
Herbie Ong66c365c2019-01-04 14:08:41 -08001491[pb2.Nested]: {}
1492type_url: "pb2.Nested"
Herbie Ong66c365c2019-01-04 14:08:41 -08001493`,
1494 wantErr: true,
Joe Tsaid47ea192019-07-09 22:38:15 -07001495 }, {
1496 desc: "weak fields",
1497 inputMessage: &testpb.TestWeak{},
1498 inputText: `weak_message1:{a:1}`,
1499 wantMessage: func() *testpb.TestWeak {
1500 m := new(testpb.TestWeak)
1501 m.SetWeakMessage1(&weakpb.WeakImportMessage1{A: proto.Int32(1)})
1502 return m
1503 }(),
Joe Tsai1799d112019-08-08 13:31:59 -07001504 skip: !flags.ProtoLegacy,
Joe Tsaid47ea192019-07-09 22:38:15 -07001505 }, {
1506 desc: "weak fields; unknown field",
1507 inputMessage: &testpb.TestWeak{},
1508 inputText: `weak_message1:{a:1} weak_message2:{a:1}`,
1509 wantErr: true, // weak_message2 is unknown since the package containing it is not imported
Joe Tsai1799d112019-08-08 13:31:59 -07001510 skip: !flags.ProtoLegacy,
Herbie Ong800c9902018-12-06 15:28:53 -08001511 }}
1512
1513 for _, tt := range tests {
1514 tt := tt
Joe Tsaid47ea192019-07-09 22:38:15 -07001515 if tt.skip {
1516 continue
1517 }
Herbie Ong800c9902018-12-06 15:28:53 -08001518 t.Run(tt.desc, func(t *testing.T) {
Joe Tsaicdb77732019-05-14 16:05:06 -07001519 err := tt.umo.Unmarshal([]byte(tt.inputText), tt.inputMessage)
Herbie Ong800c9902018-12-06 15:28:53 -08001520 if err != nil && !tt.wantErr {
1521 t.Errorf("Unmarshal() returned error: %v\n\n", err)
1522 }
1523 if err == nil && tt.wantErr {
1524 t.Error("Unmarshal() got nil error, want error\n\n")
1525 }
Joe Tsai8d30bbe2019-05-16 15:53:25 -07001526 if tt.wantMessage != nil && !proto.Equal(tt.inputMessage, tt.wantMessage) {
Herbie Ong800c9902018-12-06 15:28:53 -08001527 t.Errorf("Unmarshal()\n<got>\n%v\n<want>\n%v\n", tt.inputMessage, tt.wantMessage)
1528 }
1529 })
1530 }
1531}