blob: e35d1465bc516e7b2aa5e6f7997e7d67f75b61bb [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
Joe Tsaid47ea192019-07-09 22:38:15 -070016 testpb "google.golang.org/protobuf/internal/testprotos/test"
17 weakpb "google.golang.org/protobuf/internal/testprotos/test/weak1"
Joe Tsai94e730b2020-01-10 23:31:25 -080018 pb2 "google.golang.org/protobuf/internal/testprotos/textpb2"
19 pb3 "google.golang.org/protobuf/internal/testprotos/textpb3"
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 }, {
Damien Neil1a08d542019-12-22 09:46:57 -0800954 desc: "map contains invalid message value",
955 inputMessage: &pb3.Maps{},
956 inputText: `
957str_to_nested: {
958 key: "one"
959 value: 1
960}
961`,
962 wantErr: true,
963 }, {
Herbie Ong800c9902018-12-06 15:28:53 -0800964 desc: "map using mix of [] and repeated",
Herbie Ong8170d692019-02-13 14:13:21 -0800965 inputMessage: &pb3.Maps{},
Herbie Ong800c9902018-12-06 15:28:53 -0800966 inputText: `
967int32_to_str: {
968 key: 1
969 value: "one"
970}
971int32_to_str: [
972 {
973 key: 2
974 value: "not this"
975 },
976 {
977 },
978 {
979 key: 3
980 value: "three"
981 }
982]
983int32_to_str: {
984 key: 2
985 value: "two"
986}
987`,
Herbie Ong8170d692019-02-13 14:13:21 -0800988 wantMessage: &pb3.Maps{
Herbie Ong800c9902018-12-06 15:28:53 -0800989 Int32ToStr: map[int32]string{
990 0: "",
991 1: "one",
992 2: "two",
993 3: "three",
994 },
995 },
996 }, {
Herbie Ong42577ea2019-03-26 16:26:22 -0700997 desc: "required fields not set",
Herbie Ong800c9902018-12-06 15:28:53 -0800998 inputMessage: &pb2.Requireds{},
999 wantErr: true,
1000 }, {
Herbie Ong42577ea2019-03-26 16:26:22 -07001001 desc: "required field set",
Herbie Ong800c9902018-12-06 15:28:53 -08001002 inputMessage: &pb2.PartialRequired{},
1003 inputText: "req_string: 'this is required'",
1004 wantMessage: &pb2.PartialRequired{
Damien Neila8a2cea2019-07-10 16:17:16 -07001005 ReqString: proto.String("this is required"),
Herbie Ong800c9902018-12-06 15:28:53 -08001006 },
1007 }, {
Herbie Ong42577ea2019-03-26 16:26:22 -07001008 desc: "required fields partially set",
Herbie Ong800c9902018-12-06 15:28:53 -08001009 inputMessage: &pb2.Requireds{},
1010 inputText: `
1011req_bool: false
Herbie Ong800c9902018-12-06 15:28:53 -08001012req_sfixed64: 3203386110
1013req_string: "hello"
Herbie Ong8170d692019-02-13 14:13:21 -08001014req_enum: ONE
Herbie Ong800c9902018-12-06 15:28:53 -08001015`,
1016 wantMessage: &pb2.Requireds{
Damien Neila8a2cea2019-07-10 16:17:16 -07001017 ReqBool: proto.Bool(false),
1018 ReqSfixed64: proto.Int64(0xbeefcafe),
1019 ReqString: proto.String("hello"),
Herbie Ong8170d692019-02-13 14:13:21 -08001020 ReqEnum: pb2.Enum_ONE.Enum(),
Herbie Ong800c9902018-12-06 15:28:53 -08001021 },
1022 wantErr: true,
1023 }, {
Herbie Ong42577ea2019-03-26 16:26:22 -07001024 desc: "required fields partially set with AllowPartial",
Damien Neil5c5b5312019-05-14 12:44:37 -07001025 umo: prototext.UnmarshalOptions{AllowPartial: true},
Herbie Ong42577ea2019-03-26 16:26:22 -07001026 inputMessage: &pb2.Requireds{},
1027 inputText: `
1028req_bool: false
1029req_sfixed64: 3203386110
1030req_string: "hello"
1031req_enum: ONE
1032`,
1033 wantMessage: &pb2.Requireds{
Damien Neila8a2cea2019-07-10 16:17:16 -07001034 ReqBool: proto.Bool(false),
1035 ReqSfixed64: proto.Int64(0xbeefcafe),
1036 ReqString: proto.String("hello"),
Herbie Ong42577ea2019-03-26 16:26:22 -07001037 ReqEnum: pb2.Enum_ONE.Enum(),
1038 },
1039 }, {
1040 desc: "required fields all set",
Herbie Ong800c9902018-12-06 15:28:53 -08001041 inputMessage: &pb2.Requireds{},
1042 inputText: `
1043req_bool: false
Herbie Ong800c9902018-12-06 15:28:53 -08001044req_sfixed64: 0
Herbie Ong800c9902018-12-06 15:28:53 -08001045req_double: 0
1046req_string: ""
Herbie Ong8170d692019-02-13 14:13:21 -08001047req_enum: ONE
Herbie Ong800c9902018-12-06 15:28:53 -08001048req_nested: {}
1049`,
1050 wantMessage: &pb2.Requireds{
Damien Neila8a2cea2019-07-10 16:17:16 -07001051 ReqBool: proto.Bool(false),
1052 ReqSfixed64: proto.Int64(0),
1053 ReqDouble: proto.Float64(0),
1054 ReqString: proto.String(""),
Herbie Ong8170d692019-02-13 14:13:21 -08001055 ReqEnum: pb2.Enum_ONE.Enum(),
Herbie Ong800c9902018-12-06 15:28:53 -08001056 ReqNested: &pb2.Nested{},
1057 },
1058 }, {
1059 desc: "indirect required field",
1060 inputMessage: &pb2.IndirectRequired{},
1061 inputText: "opt_nested: {}",
1062 wantMessage: &pb2.IndirectRequired{
1063 OptNested: &pb2.NestedWithRequired{},
1064 },
1065 wantErr: true,
1066 }, {
Herbie Ong42577ea2019-03-26 16:26:22 -07001067 desc: "indirect required field with AllowPartial",
Damien Neil5c5b5312019-05-14 12:44:37 -07001068 umo: prototext.UnmarshalOptions{AllowPartial: true},
Herbie Ong42577ea2019-03-26 16:26:22 -07001069 inputMessage: &pb2.IndirectRequired{},
1070 inputText: "opt_nested: {}",
1071 wantMessage: &pb2.IndirectRequired{
1072 OptNested: &pb2.NestedWithRequired{},
1073 },
1074 }, {
Herbie Ong800c9902018-12-06 15:28:53 -08001075 desc: "indirect required field in repeated",
1076 inputMessage: &pb2.IndirectRequired{},
1077 inputText: `
1078rpt_nested: {
1079 req_string: "one"
1080}
1081rpt_nested: {}
Herbie Ong800c9902018-12-06 15:28:53 -08001082`,
1083 wantMessage: &pb2.IndirectRequired{
1084 RptNested: []*pb2.NestedWithRequired{
1085 {
Damien Neila8a2cea2019-07-10 16:17:16 -07001086 ReqString: proto.String("one"),
Herbie Ong800c9902018-12-06 15:28:53 -08001087 },
1088 {},
Herbie Ong800c9902018-12-06 15:28:53 -08001089 },
1090 },
1091 wantErr: true,
1092 }, {
Herbie Ong42577ea2019-03-26 16:26:22 -07001093 desc: "indirect required field in repeated with AllowPartial",
Damien Neil5c5b5312019-05-14 12:44:37 -07001094 umo: prototext.UnmarshalOptions{AllowPartial: true},
Herbie Ong42577ea2019-03-26 16:26:22 -07001095 inputMessage: &pb2.IndirectRequired{},
1096 inputText: `
1097rpt_nested: {
1098 req_string: "one"
1099}
1100rpt_nested: {}
1101`,
1102 wantMessage: &pb2.IndirectRequired{
1103 RptNested: []*pb2.NestedWithRequired{
1104 {
Damien Neila8a2cea2019-07-10 16:17:16 -07001105 ReqString: proto.String("one"),
Herbie Ong42577ea2019-03-26 16:26:22 -07001106 },
1107 {},
1108 },
1109 },
1110 }, {
Herbie Ong800c9902018-12-06 15:28:53 -08001111 desc: "indirect required field in map",
1112 inputMessage: &pb2.IndirectRequired{},
1113 inputText: `
1114str_to_nested: {
1115 key: "missing"
1116}
1117str_to_nested: {
1118 key: "contains"
1119 value: {
1120 req_string: "here"
1121 }
1122}
1123`,
1124 wantMessage: &pb2.IndirectRequired{
1125 StrToNested: map[string]*pb2.NestedWithRequired{
1126 "missing": &pb2.NestedWithRequired{},
1127 "contains": &pb2.NestedWithRequired{
Damien Neila8a2cea2019-07-10 16:17:16 -07001128 ReqString: proto.String("here"),
Herbie Ong800c9902018-12-06 15:28:53 -08001129 },
1130 },
1131 },
1132 wantErr: true,
Herbie Ong7c624e22018-12-13 14:41:22 -08001133 }, {
Herbie Ong42577ea2019-03-26 16:26:22 -07001134 desc: "indirect required field in map with AllowPartial",
Damien Neil5c5b5312019-05-14 12:44:37 -07001135 umo: prototext.UnmarshalOptions{AllowPartial: true},
Herbie Ong42577ea2019-03-26 16:26:22 -07001136 inputMessage: &pb2.IndirectRequired{},
1137 inputText: `
1138str_to_nested: {
1139 key: "missing"
1140}
1141str_to_nested: {
1142 key: "contains"
1143 value: {
1144 req_string: "here"
1145 }
1146}
1147`,
1148 wantMessage: &pb2.IndirectRequired{
1149 StrToNested: map[string]*pb2.NestedWithRequired{
1150 "missing": &pb2.NestedWithRequired{},
1151 "contains": &pb2.NestedWithRequired{
Damien Neila8a2cea2019-07-10 16:17:16 -07001152 ReqString: proto.String("here"),
Herbie Ong42577ea2019-03-26 16:26:22 -07001153 },
1154 },
1155 },
1156 }, {
Herbie Ong8170d692019-02-13 14:13:21 -08001157 desc: "indirect required field in oneof",
1158 inputMessage: &pb2.IndirectRequired{},
1159 inputText: `oneof_nested: {}
1160`,
1161 wantMessage: &pb2.IndirectRequired{
1162 Union: &pb2.IndirectRequired_OneofNested{
1163 OneofNested: &pb2.NestedWithRequired{},
1164 },
1165 },
1166 wantErr: true,
1167 }, {
Herbie Ong42577ea2019-03-26 16:26:22 -07001168 desc: "indirect required field in oneof with AllowPartial",
Damien Neil5c5b5312019-05-14 12:44:37 -07001169 umo: prototext.UnmarshalOptions{AllowPartial: true},
Herbie Ong42577ea2019-03-26 16:26:22 -07001170 inputMessage: &pb2.IndirectRequired{},
1171 inputText: `oneof_nested: {}
1172`,
1173 wantMessage: &pb2.IndirectRequired{
1174 Union: &pb2.IndirectRequired_OneofNested{
1175 OneofNested: &pb2.NestedWithRequired{},
1176 },
1177 },
1178 }, {
Herbie Ong7c624e22018-12-13 14:41:22 -08001179 desc: "ignore reserved field",
1180 inputMessage: &pb2.Nests{},
1181 inputText: "reserved_field: 'ignore this'",
1182 wantMessage: &pb2.Nests{},
Herbie Ongc525c972018-12-18 18:04:31 -08001183 }, {
1184 desc: "extensions of non-repeated fields",
1185 inputMessage: &pb2.Extensions{},
1186 inputText: `opt_string: "non-extension field"
1187[pb2.opt_ext_bool]: true
1188opt_bool: true
1189[pb2.opt_ext_nested]: {
1190 opt_string: "nested in an extension"
1191 opt_nested: {
1192 opt_string: "another nested in an extension"
1193 }
1194}
1195[pb2.opt_ext_string]: "extension field"
1196opt_int32: 42
Herbie Ong8170d692019-02-13 14:13:21 -08001197[pb2.opt_ext_enum]: TEN
Herbie Ongc525c972018-12-18 18:04:31 -08001198`,
1199 wantMessage: func() proto.Message {
1200 m := &pb2.Extensions{
Damien Neila8a2cea2019-07-10 16:17:16 -07001201 OptString: proto.String("non-extension field"),
1202 OptBool: proto.Bool(true),
1203 OptInt32: proto.Int32(42),
Herbie Ongc525c972018-12-18 18:04:31 -08001204 }
Damien Neil92f76182019-08-02 16:58:08 -07001205 proto.SetExtension(m, pb2.E_OptExtBool, true)
1206 proto.SetExtension(m, pb2.E_OptExtString, "extension field")
1207 proto.SetExtension(m, pb2.E_OptExtEnum, pb2.Enum_TEN)
1208 proto.SetExtension(m, pb2.E_OptExtNested, &pb2.Nested{
Damien Neila8a2cea2019-07-10 16:17:16 -07001209 OptString: proto.String("nested in an extension"),
Herbie Ongc525c972018-12-18 18:04:31 -08001210 OptNested: &pb2.Nested{
Damien Neila8a2cea2019-07-10 16:17:16 -07001211 OptString: proto.String("another nested in an extension"),
Herbie Ongc525c972018-12-18 18:04:31 -08001212 },
1213 })
1214 return m
1215 }(),
1216 }, {
Herbie Ong21a39742019-04-08 17:32:44 -07001217 desc: "extension field contains invalid UTF-8",
1218 inputMessage: &pb2.Extensions{},
1219 inputText: `[pb2.opt_ext_string]: "abc\xff"`,
Damien Neil8c86fc52019-06-19 09:28:29 -07001220 wantErr: true,
Herbie Ong21a39742019-04-08 17:32:44 -07001221 }, {
Herbie Ongc525c972018-12-18 18:04:31 -08001222 desc: "extensions of repeated fields",
1223 inputMessage: &pb2.Extensions{},
Herbie Ong8170d692019-02-13 14:13:21 -08001224 inputText: `[pb2.rpt_ext_enum]: TEN
Herbie Ongc525c972018-12-18 18:04:31 -08001225[pb2.rpt_ext_enum]: 101
1226[pb2.rpt_ext_fixed32]: 42
Herbie Ong8170d692019-02-13 14:13:21 -08001227[pb2.rpt_ext_enum]: ONE
Herbie Ongc525c972018-12-18 18:04:31 -08001228[pb2.rpt_ext_nested]: {
1229 opt_string: "one"
1230}
1231[pb2.rpt_ext_nested]: {
1232 opt_string: "two"
1233}
1234[pb2.rpt_ext_fixed32]: 47
1235[pb2.rpt_ext_nested]: {
1236 opt_string: "three"
1237}
1238`,
1239 wantMessage: func() proto.Message {
1240 m := &pb2.Extensions{}
Damien Neil293dc762019-08-29 11:42:57 -07001241 proto.SetExtension(m, pb2.E_RptExtEnum, []pb2.Enum{pb2.Enum_TEN, 101, pb2.Enum_ONE})
1242 proto.SetExtension(m, pb2.E_RptExtFixed32, []uint32{42, 47})
1243 proto.SetExtension(m, pb2.E_RptExtNested, []*pb2.Nested{
Damien Neila8a2cea2019-07-10 16:17:16 -07001244 &pb2.Nested{OptString: proto.String("one")},
1245 &pb2.Nested{OptString: proto.String("two")},
1246 &pb2.Nested{OptString: proto.String("three")},
Herbie Ongc525c972018-12-18 18:04:31 -08001247 })
1248 return m
1249 }(),
1250 }, {
1251 desc: "extensions of non-repeated fields in another message",
1252 inputMessage: &pb2.Extensions{},
1253 inputText: `[pb2.ExtensionsContainer.opt_ext_bool]: true
Herbie Ong8170d692019-02-13 14:13:21 -08001254[pb2.ExtensionsContainer.opt_ext_enum]: TEN
Herbie Ongc525c972018-12-18 18:04:31 -08001255[pb2.ExtensionsContainer.opt_ext_nested]: {
1256 opt_string: "nested in an extension"
1257 opt_nested: {
1258 opt_string: "another nested in an extension"
1259 }
1260}
1261[pb2.ExtensionsContainer.opt_ext_string]: "extension field"
1262`,
1263 wantMessage: func() proto.Message {
1264 m := &pb2.Extensions{}
Damien Neil92f76182019-08-02 16:58:08 -07001265 proto.SetExtension(m, pb2.E_ExtensionsContainer_OptExtBool, true)
1266 proto.SetExtension(m, pb2.E_ExtensionsContainer_OptExtString, "extension field")
1267 proto.SetExtension(m, pb2.E_ExtensionsContainer_OptExtEnum, pb2.Enum_TEN)
1268 proto.SetExtension(m, pb2.E_ExtensionsContainer_OptExtNested, &pb2.Nested{
Damien Neila8a2cea2019-07-10 16:17:16 -07001269 OptString: proto.String("nested in an extension"),
Herbie Ongc525c972018-12-18 18:04:31 -08001270 OptNested: &pb2.Nested{
Damien Neila8a2cea2019-07-10 16:17:16 -07001271 OptString: proto.String("another nested in an extension"),
Herbie Ongc525c972018-12-18 18:04:31 -08001272 },
1273 })
1274 return m
1275 }(),
1276 }, {
1277 desc: "extensions of repeated fields in another message",
1278 inputMessage: &pb2.Extensions{},
1279 inputText: `opt_string: "non-extension field"
1280opt_bool: true
1281opt_int32: 42
1282[pb2.ExtensionsContainer.rpt_ext_nested]: {
1283 opt_string: "one"
1284}
Herbie Ong8170d692019-02-13 14:13:21 -08001285[pb2.ExtensionsContainer.rpt_ext_enum]: TEN
Herbie Ongc525c972018-12-18 18:04:31 -08001286[pb2.ExtensionsContainer.rpt_ext_nested]: {
1287 opt_string: "two"
1288}
1289[pb2.ExtensionsContainer.rpt_ext_enum]: 101
1290[pb2.ExtensionsContainer.rpt_ext_string]: "hello"
Herbie Ong8170d692019-02-13 14:13:21 -08001291[pb2.ExtensionsContainer.rpt_ext_enum]: ONE
Herbie Ongc525c972018-12-18 18:04:31 -08001292[pb2.ExtensionsContainer.rpt_ext_nested]: {
1293 opt_string: "three"
1294}
1295[pb2.ExtensionsContainer.rpt_ext_string]: "world"
1296`,
1297 wantMessage: func() proto.Message {
1298 m := &pb2.Extensions{
Damien Neila8a2cea2019-07-10 16:17:16 -07001299 OptString: proto.String("non-extension field"),
1300 OptBool: proto.Bool(true),
1301 OptInt32: proto.Int32(42),
Herbie Ongc525c972018-12-18 18:04:31 -08001302 }
Damien Neil293dc762019-08-29 11:42:57 -07001303 proto.SetExtension(m, pb2.E_ExtensionsContainer_RptExtEnum, []pb2.Enum{pb2.Enum_TEN, 101, pb2.Enum_ONE})
1304 proto.SetExtension(m, pb2.E_ExtensionsContainer_RptExtString, []string{"hello", "world"})
1305 proto.SetExtension(m, pb2.E_ExtensionsContainer_RptExtNested, []*pb2.Nested{
Damien Neila8a2cea2019-07-10 16:17:16 -07001306 &pb2.Nested{OptString: proto.String("one")},
1307 &pb2.Nested{OptString: proto.String("two")},
1308 &pb2.Nested{OptString: proto.String("three")},
Herbie Ongc525c972018-12-18 18:04:31 -08001309 })
1310 return m
1311 }(),
1312 }, {
1313 desc: "invalid extension field name",
1314 inputMessage: &pb2.Extensions{},
1315 inputText: "[pb2.invalid_message_field]: true",
1316 wantErr: true,
Herbie Ong66c365c2019-01-04 14:08:41 -08001317 }, {
Herbie Ong6470ea62019-01-07 18:56:57 -08001318 desc: "MessageSet",
1319 inputMessage: &pb2.MessageSet{},
1320 inputText: `
1321[pb2.MessageSetExtension]: {
1322 opt_string: "a messageset extension"
1323}
1324[pb2.MessageSetExtension.ext_nested]: {
1325 opt_string: "just a regular extension"
1326}
1327[pb2.MessageSetExtension.not_message_set_extension]: {
1328 opt_string: "not a messageset extension"
1329}
1330`,
1331 wantMessage: func() proto.Message {
1332 m := &pb2.MessageSet{}
Damien Neil92f76182019-08-02 16:58:08 -07001333 proto.SetExtension(m, pb2.E_MessageSetExtension_MessageSetExtension, &pb2.MessageSetExtension{
Damien Neila8a2cea2019-07-10 16:17:16 -07001334 OptString: proto.String("a messageset extension"),
Herbie Ong6470ea62019-01-07 18:56:57 -08001335 })
Damien Neil92f76182019-08-02 16:58:08 -07001336 proto.SetExtension(m, pb2.E_MessageSetExtension_NotMessageSetExtension, &pb2.MessageSetExtension{
Damien Neila8a2cea2019-07-10 16:17:16 -07001337 OptString: proto.String("not a messageset extension"),
Herbie Ong6470ea62019-01-07 18:56:57 -08001338 })
Damien Neil92f76182019-08-02 16:58:08 -07001339 proto.SetExtension(m, pb2.E_MessageSetExtension_ExtNested, &pb2.Nested{
Damien Neila8a2cea2019-07-10 16:17:16 -07001340 OptString: proto.String("just a regular extension"),
Herbie Ong6470ea62019-01-07 18:56:57 -08001341 })
1342 return m
1343 }(),
Joe Tsai1799d112019-08-08 13:31:59 -07001344 skip: !flags.ProtoLegacy,
Herbie Ong6470ea62019-01-07 18:56:57 -08001345 }, {
1346 desc: "not real MessageSet 1",
1347 inputMessage: &pb2.FakeMessageSet{},
1348 inputText: `
1349[pb2.FakeMessageSetExtension.message_set_extension]: {
1350 opt_string: "not a messageset extension"
1351}
1352`,
1353 wantMessage: func() proto.Message {
1354 m := &pb2.FakeMessageSet{}
Damien Neil92f76182019-08-02 16:58:08 -07001355 proto.SetExtension(m, pb2.E_FakeMessageSetExtension_MessageSetExtension, &pb2.FakeMessageSetExtension{
Damien Neila8a2cea2019-07-10 16:17:16 -07001356 OptString: proto.String("not a messageset extension"),
Herbie Ong6470ea62019-01-07 18:56:57 -08001357 })
1358 return m
1359 }(),
Joe Tsai1799d112019-08-08 13:31:59 -07001360 skip: !flags.ProtoLegacy,
Herbie Ong6470ea62019-01-07 18:56:57 -08001361 }, {
1362 desc: "not real MessageSet 2",
1363 inputMessage: &pb2.FakeMessageSet{},
1364 inputText: `
1365[pb2.FakeMessageSetExtension]: {
1366 opt_string: "not a messageset extension"
1367}
1368`,
1369 wantErr: true,
Joe Tsai1799d112019-08-08 13:31:59 -07001370 skip: !flags.ProtoLegacy,
Herbie Ong6470ea62019-01-07 18:56:57 -08001371 }, {
1372 desc: "not real MessageSet 3",
1373 inputMessage: &pb2.MessageSet{},
1374 inputText: `
1375[pb2.message_set_extension]: {
1376 opt_string: "another not a messageset extension"
Herbie Ong300cff02019-03-20 18:05:16 -07001377}`,
Herbie Ong6470ea62019-01-07 18:56:57 -08001378 wantMessage: func() proto.Message {
1379 m := &pb2.MessageSet{}
Damien Neil92f76182019-08-02 16:58:08 -07001380 proto.SetExtension(m, pb2.E_MessageSetExtension, &pb2.FakeMessageSetExtension{
Damien Neila8a2cea2019-07-10 16:17:16 -07001381 OptString: proto.String("another not a messageset extension"),
Herbie Ong6470ea62019-01-07 18:56:57 -08001382 })
1383 return m
1384 }(),
Joe Tsai1799d112019-08-08 13:31:59 -07001385 skip: !flags.ProtoLegacy,
Herbie Ong6470ea62019-01-07 18:56:57 -08001386 }, {
Herbie Ong66c365c2019-01-04 14:08:41 -08001387 desc: "Any not expanded",
Joe Tsaia95b29f2019-05-16 12:47:20 -07001388 inputMessage: &anypb.Any{},
Herbie Ong300cff02019-03-20 18:05:16 -07001389 inputText: `
Herbie Ong66c365c2019-01-04 14:08:41 -08001390type_url: "pb2.Nested"
1391value: "some bytes"
Herbie Ong66c365c2019-01-04 14:08:41 -08001392`,
Joe Tsaia95b29f2019-05-16 12:47:20 -07001393 wantMessage: &anypb.Any{
Herbie Ong300cff02019-03-20 18:05:16 -07001394 TypeUrl: "pb2.Nested",
1395 Value: []byte("some bytes"),
Herbie Ong66c365c2019-01-04 14:08:41 -08001396 },
1397 }, {
1398 desc: "Any not expanded missing value",
Joe Tsaia95b29f2019-05-16 12:47:20 -07001399 inputMessage: &anypb.Any{},
Herbie Ong300cff02019-03-20 18:05:16 -07001400 inputText: `type_url: "pb2.Nested"`,
Joe Tsaia95b29f2019-05-16 12:47:20 -07001401 wantMessage: &anypb.Any{
Herbie Ong300cff02019-03-20 18:05:16 -07001402 TypeUrl: "pb2.Nested",
Herbie Ong66c365c2019-01-04 14:08:41 -08001403 },
1404 }, {
1405 desc: "Any not expanded missing type_url",
Joe Tsaia95b29f2019-05-16 12:47:20 -07001406 inputMessage: &anypb.Any{},
Herbie Ong300cff02019-03-20 18:05:16 -07001407 inputText: `value: "some bytes"`,
Joe Tsaia95b29f2019-05-16 12:47:20 -07001408 wantMessage: &anypb.Any{
Herbie Ong300cff02019-03-20 18:05:16 -07001409 Value: []byte("some bytes"),
Herbie Ong66c365c2019-01-04 14:08:41 -08001410 },
1411 }, {
Damien Neilc1507ac2019-10-08 13:24:16 -07001412 desc: "Any expanded",
Joe Tsaia95b29f2019-05-16 12:47:20 -07001413 inputMessage: &anypb.Any{},
Herbie Ong300cff02019-03-20 18:05:16 -07001414 inputText: `
1415[foobar/pb2.Nested]: {
1416 opt_string: "embedded inside Any"
1417 opt_nested: {
1418 opt_string: "inception"
Herbie Ong66c365c2019-01-04 14:08:41 -08001419 }
1420}
1421`,
1422 wantMessage: func() proto.Message {
1423 m := &pb2.Nested{
Damien Neila8a2cea2019-07-10 16:17:16 -07001424 OptString: proto.String("embedded inside Any"),
Herbie Ong66c365c2019-01-04 14:08:41 -08001425 OptNested: &pb2.Nested{
Damien Neila8a2cea2019-07-10 16:17:16 -07001426 OptString: proto.String("inception"),
Herbie Ong66c365c2019-01-04 14:08:41 -08001427 },
1428 }
Herbie Onge0cf15b2019-03-15 19:32:38 -07001429 b, err := proto.MarshalOptions{Deterministic: true}.Marshal(m)
Herbie Ong66c365c2019-01-04 14:08:41 -08001430 if err != nil {
1431 t.Fatalf("error in binary marshaling message for Any.value: %v", err)
1432 }
Joe Tsaia95b29f2019-05-16 12:47:20 -07001433 return &anypb.Any{
Herbie Ong300cff02019-03-20 18:05:16 -07001434 TypeUrl: "foobar/pb2.Nested",
1435 Value: b,
Herbie Ong66c365c2019-01-04 14:08:41 -08001436 }
1437 }(),
1438 }, {
Damien Neilc1507ac2019-10-08 13:24:16 -07001439 desc: "Any expanded with empty value",
Joe Tsaia95b29f2019-05-16 12:47:20 -07001440 inputMessage: &anypb.Any{},
Herbie Ong300cff02019-03-20 18:05:16 -07001441 inputText: `[foo.com/pb2.Nested]: {}`,
Joe Tsaia95b29f2019-05-16 12:47:20 -07001442 wantMessage: &anypb.Any{
Herbie Ong300cff02019-03-20 18:05:16 -07001443 TypeUrl: "foo.com/pb2.Nested",
Herbie Ong66c365c2019-01-04 14:08:41 -08001444 },
1445 }, {
Damien Neilc1507ac2019-10-08 13:24:16 -07001446 desc: "Any expanded with missing required",
Joe Tsaia95b29f2019-05-16 12:47:20 -07001447 inputMessage: &anypb.Any{},
Herbie Ong300cff02019-03-20 18:05:16 -07001448 inputText: `
1449[pb2.PartialRequired]: {
1450 opt_string: "embedded inside Any"
Herbie Ong66c365c2019-01-04 14:08:41 -08001451}
1452`,
1453 wantMessage: func() proto.Message {
1454 m := &pb2.PartialRequired{
Damien Neila8a2cea2019-07-10 16:17:16 -07001455 OptString: proto.String("embedded inside Any"),
Herbie Ong66c365c2019-01-04 14:08:41 -08001456 }
Damien Neil96c229a2019-04-03 12:17:24 -07001457 b, err := proto.MarshalOptions{
1458 AllowPartial: true,
1459 Deterministic: true,
1460 }.Marshal(m)
Herbie Ong300cff02019-03-20 18:05:16 -07001461 if err != nil {
Herbie Ong66c365c2019-01-04 14:08:41 -08001462 t.Fatalf("error in binary marshaling message for Any.value: %v", err)
1463 }
Joe Tsaia95b29f2019-05-16 12:47:20 -07001464 return &anypb.Any{
Herbie Ong300cff02019-03-20 18:05:16 -07001465 TypeUrl: "pb2.PartialRequired",
1466 Value: b,
Herbie Ong66c365c2019-01-04 14:08:41 -08001467 }
1468 }(),
Herbie Ong66c365c2019-01-04 14:08:41 -08001469 }, {
Damien Neilc1507ac2019-10-08 13:24:16 -07001470 desc: "Any with invalid UTF-8",
Joe Tsaia95b29f2019-05-16 12:47:20 -07001471 inputMessage: &anypb.Any{},
Herbie Ong21a39742019-04-08 17:32:44 -07001472 inputText: `
1473[pb3.Nested]: {
1474 s_string: "abc\xff"
1475}
1476`,
Herbie Ong21a39742019-04-08 17:32:44 -07001477 wantErr: true,
1478 }, {
Herbie Ong66c365c2019-01-04 14:08:41 -08001479 desc: "Any expanded with unregistered type",
Damien Neilc1507ac2019-10-08 13:24:16 -07001480 umo: prototext.UnmarshalOptions{Resolver: new(preg.Types)},
Joe Tsaia95b29f2019-05-16 12:47:20 -07001481 inputMessage: &anypb.Any{},
Herbie Ong300cff02019-03-20 18:05:16 -07001482 inputText: `[SomeMessage]: {}`,
1483 wantErr: true,
Herbie Ong66c365c2019-01-04 14:08:41 -08001484 }, {
Damien Neilc1507ac2019-10-08 13:24:16 -07001485 desc: "Any expanded with invalid value",
Joe Tsaia95b29f2019-05-16 12:47:20 -07001486 inputMessage: &anypb.Any{},
Herbie Ong300cff02019-03-20 18:05:16 -07001487 inputText: `[pb2.Nested]: 123`,
1488 wantErr: true,
Herbie Ong66c365c2019-01-04 14:08:41 -08001489 }, {
Damien Neilc1507ac2019-10-08 13:24:16 -07001490 desc: "Any expanded with unknown fields",
Joe Tsaia95b29f2019-05-16 12:47:20 -07001491 inputMessage: &anypb.Any{},
Herbie Ong300cff02019-03-20 18:05:16 -07001492 inputText: `
Herbie Ong66c365c2019-01-04 14:08:41 -08001493[pb2.Nested]: {}
1494unknown: ""
Herbie Ong66c365c2019-01-04 14:08:41 -08001495`,
1496 wantErr: true,
1497 }, {
Damien Neilc1507ac2019-10-08 13:24:16 -07001498 desc: "Any contains expanded and unexpanded fields",
Joe Tsaia95b29f2019-05-16 12:47:20 -07001499 inputMessage: &anypb.Any{},
Herbie Ong300cff02019-03-20 18:05:16 -07001500 inputText: `
Herbie Ong66c365c2019-01-04 14:08:41 -08001501[pb2.Nested]: {}
1502type_url: "pb2.Nested"
Herbie Ong66c365c2019-01-04 14:08:41 -08001503`,
1504 wantErr: true,
Joe Tsaid47ea192019-07-09 22:38:15 -07001505 }, {
1506 desc: "weak fields",
1507 inputMessage: &testpb.TestWeak{},
1508 inputText: `weak_message1:{a:1}`,
1509 wantMessage: func() *testpb.TestWeak {
1510 m := new(testpb.TestWeak)
1511 m.SetWeakMessage1(&weakpb.WeakImportMessage1{A: proto.Int32(1)})
1512 return m
1513 }(),
Joe Tsai1799d112019-08-08 13:31:59 -07001514 skip: !flags.ProtoLegacy,
Joe Tsaid47ea192019-07-09 22:38:15 -07001515 }, {
1516 desc: "weak fields; unknown field",
1517 inputMessage: &testpb.TestWeak{},
1518 inputText: `weak_message1:{a:1} weak_message2:{a:1}`,
1519 wantErr: true, // weak_message2 is unknown since the package containing it is not imported
Joe Tsai1799d112019-08-08 13:31:59 -07001520 skip: !flags.ProtoLegacy,
Herbie Ong800c9902018-12-06 15:28:53 -08001521 }}
1522
1523 for _, tt := range tests {
1524 tt := tt
Joe Tsaid47ea192019-07-09 22:38:15 -07001525 if tt.skip {
1526 continue
1527 }
Herbie Ong800c9902018-12-06 15:28:53 -08001528 t.Run(tt.desc, func(t *testing.T) {
Joe Tsaicdb77732019-05-14 16:05:06 -07001529 err := tt.umo.Unmarshal([]byte(tt.inputText), tt.inputMessage)
Herbie Ong800c9902018-12-06 15:28:53 -08001530 if err != nil && !tt.wantErr {
1531 t.Errorf("Unmarshal() returned error: %v\n\n", err)
1532 }
1533 if err == nil && tt.wantErr {
1534 t.Error("Unmarshal() got nil error, want error\n\n")
1535 }
Joe Tsai8d30bbe2019-05-16 15:53:25 -07001536 if tt.wantMessage != nil && !proto.Equal(tt.inputMessage, tt.wantMessage) {
Herbie Ong800c9902018-12-06 15:28:53 -08001537 t.Errorf("Unmarshal()\n<got>\n%v\n<want>\n%v\n", tt.inputMessage, tt.wantMessage)
1538 }
1539 })
1540 }
1541}