blob: 31de4d7c949a29660dd98d28dee8ae8ab12ee276 [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 pimpl "google.golang.org/protobuf/internal/impl"
Damien Neile89e6242019-05-13 23:55:40 -070014 "google.golang.org/protobuf/proto"
15 preg "google.golang.org/protobuf/reflect/protoregistry"
Herbie Ong800c9902018-12-06 15:28:53 -080016
Damien Neile89e6242019-05-13 23:55:40 -070017 "google.golang.org/protobuf/encoding/testprotos/pb2"
18 "google.golang.org/protobuf/encoding/testprotos/pb3"
Joe Tsaid47ea192019-07-09 22:38:15 -070019 testpb "google.golang.org/protobuf/internal/testprotos/test"
20 weakpb "google.golang.org/protobuf/internal/testprotos/test/weak1"
Joe Tsaia95b29f2019-05-16 12:47:20 -070021 "google.golang.org/protobuf/types/known/anypb"
Herbie Ong800c9902018-12-06 15:28:53 -080022)
23
24func TestUnmarshal(t *testing.T) {
Herbie Ong800c9902018-12-06 15:28:53 -080025 tests := []struct {
26 desc string
Damien Neil5c5b5312019-05-14 12:44:37 -070027 umo prototext.UnmarshalOptions
Herbie Ong70651952018-12-13 14:19:50 -080028 inputMessage proto.Message
Herbie Ong800c9902018-12-06 15:28:53 -080029 inputText string
Herbie Ong70651952018-12-13 14:19:50 -080030 wantMessage proto.Message
Herbie Ong300cff02019-03-20 18:05:16 -070031 wantErr bool // TODO: Verify error message content.
Joe Tsaid47ea192019-07-09 22:38:15 -070032 skip bool
Herbie Ong800c9902018-12-06 15:28:53 -080033 }{{
34 desc: "proto2 empty message",
35 inputMessage: &pb2.Scalars{},
36 wantMessage: &pb2.Scalars{},
37 }, {
Herbie Ong8170d692019-02-13 14:13:21 -080038 desc: "proto2 optional scalars set to zero values",
Herbie Ong800c9902018-12-06 15:28:53 -080039 inputMessage: &pb2.Scalars{},
40 inputText: `opt_bool: false
41opt_int32: 0
42opt_int64: 0
43opt_uint32: 0
44opt_uint64: 0
45opt_sint32: 0
46opt_sint64: 0
47opt_fixed32: 0
48opt_fixed64: 0
49opt_sfixed32: 0
50opt_sfixed64: 0
51opt_float: 0
52opt_double: 0
53opt_bytes: ""
54opt_string: ""
55`,
56 wantMessage: &pb2.Scalars{
Damien Neila8a2cea2019-07-10 16:17:16 -070057 OptBool: proto.Bool(false),
58 OptInt32: proto.Int32(0),
59 OptInt64: proto.Int64(0),
60 OptUint32: proto.Uint32(0),
61 OptUint64: proto.Uint64(0),
62 OptSint32: proto.Int32(0),
63 OptSint64: proto.Int64(0),
64 OptFixed32: proto.Uint32(0),
65 OptFixed64: proto.Uint64(0),
66 OptSfixed32: proto.Int32(0),
67 OptSfixed64: proto.Int64(0),
68 OptFloat: proto.Float32(0),
69 OptDouble: proto.Float64(0),
Herbie Ong800c9902018-12-06 15:28:53 -080070 OptBytes: []byte{},
Damien Neila8a2cea2019-07-10 16:17:16 -070071 OptString: proto.String(""),
Herbie Ong800c9902018-12-06 15:28:53 -080072 },
73 }, {
Herbie Ong8170d692019-02-13 14:13:21 -080074 desc: "proto3 scalars set to zero values",
Herbie Ong800c9902018-12-06 15:28:53 -080075 inputMessage: &pb3.Scalars{},
76 inputText: `s_bool: false
77s_int32: 0
78s_int64: 0
79s_uint32: 0
80s_uint64: 0
81s_sint32: 0
82s_sint64: 0
83s_fixed32: 0
84s_fixed64: 0
85s_sfixed32: 0
86s_sfixed64: 0
87s_float: 0
88s_double: 0
89s_bytes: ""
90s_string: ""
91`,
92 wantMessage: &pb3.Scalars{},
93 }, {
Herbie Ong8170d692019-02-13 14:13:21 -080094 desc: "proto2 optional scalars",
Herbie Ong800c9902018-12-06 15:28:53 -080095 inputMessage: &pb2.Scalars{},
96 inputText: `opt_bool: true
97opt_int32: 255
98opt_int64: 3735928559
99opt_uint32: 0xff
100opt_uint64: 0xdeadbeef
101opt_sint32: -1001
102opt_sint64: -0xffff
103opt_fixed64: 64
104opt_sfixed32: -32
105opt_float: 1.234
106opt_double: 1.23e+100
107opt_bytes: "\xe8\xb0\xb7\xe6\xad\x8c"
108opt_string: "谷歌"
109`,
110 wantMessage: &pb2.Scalars{
Damien Neila8a2cea2019-07-10 16:17:16 -0700111 OptBool: proto.Bool(true),
112 OptInt32: proto.Int32(0xff),
113 OptInt64: proto.Int64(0xdeadbeef),
114 OptUint32: proto.Uint32(0xff),
115 OptUint64: proto.Uint64(0xdeadbeef),
116 OptSint32: proto.Int32(-1001),
117 OptSint64: proto.Int64(-0xffff),
118 OptFixed64: proto.Uint64(64),
119 OptSfixed32: proto.Int32(-32),
120 OptFloat: proto.Float32(1.234),
121 OptDouble: proto.Float64(1.23e100),
Herbie Ong800c9902018-12-06 15:28:53 -0800122 OptBytes: []byte("\xe8\xb0\xb7\xe6\xad\x8c"),
Damien Neila8a2cea2019-07-10 16:17:16 -0700123 OptString: proto.String("谷歌"),
Herbie Ong800c9902018-12-06 15:28:53 -0800124 },
125 }, {
Herbie Ong20aefe92019-06-24 19:21:46 -0700126 desc: "case sensitive",
127 inputMessage: &pb3.Scalars{},
128 inputText: `S_BOOL: true`,
129 wantErr: true,
130 }, {
Herbie Ong8170d692019-02-13 14:13:21 -0800131 desc: "proto3 scalars",
Herbie Ong800c9902018-12-06 15:28:53 -0800132 inputMessage: &pb3.Scalars{},
133 inputText: `s_bool: true
134s_int32: 255
135s_int64: 3735928559
136s_uint32: 0xff
137s_uint64: 0xdeadbeef
138s_sint32: -1001
139s_sint64: -0xffff
140s_fixed64: 64
141s_sfixed32: -32
142s_float: 1.234
143s_double: 1.23e+100
144s_bytes: "\xe8\xb0\xb7\xe6\xad\x8c"
145s_string: "谷歌"
146`,
147 wantMessage: &pb3.Scalars{
148 SBool: true,
149 SInt32: 0xff,
150 SInt64: 0xdeadbeef,
151 SUint32: 0xff,
152 SUint64: 0xdeadbeef,
153 SSint32: -1001,
154 SSint64: -0xffff,
155 SFixed64: 64,
156 SSfixed32: -32,
157 SFloat: 1.234,
158 SDouble: 1.23e100,
159 SBytes: []byte("\xe8\xb0\xb7\xe6\xad\x8c"),
160 SString: "谷歌",
161 },
162 }, {
Herbie Ong21a39742019-04-08 17:32:44 -0700163 desc: "string with invalid UTF-8",
164 inputMessage: &pb3.Scalars{},
165 inputText: `s_string: "abc\xff"`,
Damien Neil8c86fc52019-06-19 09:28:29 -0700166 wantErr: true,
Herbie Ong21a39742019-04-08 17:32:44 -0700167 }, {
Herbie Ong800c9902018-12-06 15:28:53 -0800168 desc: "proto2 message contains unknown field",
169 inputMessage: &pb2.Scalars{},
170 inputText: "unknown_field: 123",
171 wantErr: true,
172 }, {
173 desc: "proto3 message contains unknown field",
174 inputMessage: &pb3.Scalars{},
175 inputText: "unknown_field: 456",
176 wantErr: true,
177 }, {
178 desc: "proto2 numeric key field",
179 inputMessage: &pb2.Scalars{},
180 inputText: "1: true",
181 wantErr: true,
182 }, {
183 desc: "proto3 numeric key field",
184 inputMessage: &pb3.Scalars{},
185 inputText: "1: true",
186 wantErr: true,
187 }, {
188 desc: "invalid bool value",
189 inputMessage: &pb3.Scalars{},
190 inputText: "s_bool: 123",
191 wantErr: true,
192 }, {
193 desc: "invalid int32 value",
194 inputMessage: &pb3.Scalars{},
195 inputText: "s_int32: not_a_num",
196 wantErr: true,
197 }, {
198 desc: "invalid int64 value",
199 inputMessage: &pb3.Scalars{},
200 inputText: "s_int64: 'not a num either'",
201 wantErr: true,
202 }, {
203 desc: "invalid uint32 value",
204 inputMessage: &pb3.Scalars{},
205 inputText: "s_fixed32: -42",
206 wantErr: true,
207 }, {
208 desc: "invalid uint64 value",
209 inputMessage: &pb3.Scalars{},
210 inputText: "s_uint64: -47",
211 wantErr: true,
212 }, {
213 desc: "invalid sint32 value",
214 inputMessage: &pb3.Scalars{},
215 inputText: "s_sint32: '42'",
216 wantErr: true,
217 }, {
218 desc: "invalid sint64 value",
219 inputMessage: &pb3.Scalars{},
220 inputText: "s_sint64: '-47'",
221 wantErr: true,
222 }, {
223 desc: "invalid fixed32 value",
224 inputMessage: &pb3.Scalars{},
225 inputText: "s_fixed32: -42",
226 wantErr: true,
227 }, {
228 desc: "invalid fixed64 value",
229 inputMessage: &pb3.Scalars{},
230 inputText: "s_fixed64: -42",
231 wantErr: true,
232 }, {
233 desc: "invalid sfixed32 value",
234 inputMessage: &pb3.Scalars{},
235 inputText: "s_sfixed32: 'not valid'",
236 wantErr: true,
237 }, {
238 desc: "invalid sfixed64 value",
239 inputMessage: &pb3.Scalars{},
240 inputText: "s_sfixed64: bad",
241 wantErr: true,
242 }, {
Herbie Ong8170d692019-02-13 14:13:21 -0800243 desc: "float positive infinity",
Herbie Ong800c9902018-12-06 15:28:53 -0800244 inputMessage: &pb3.Scalars{},
245 inputText: "s_float: inf",
246 wantMessage: &pb3.Scalars{
247 SFloat: float32(math.Inf(1)),
248 },
249 }, {
Herbie Ong8170d692019-02-13 14:13:21 -0800250 desc: "float negative infinity",
Herbie Ong800c9902018-12-06 15:28:53 -0800251 inputMessage: &pb3.Scalars{},
252 inputText: "s_float: -inf",
253 wantMessage: &pb3.Scalars{
254 SFloat: float32(math.Inf(-1)),
255 },
256 }, {
Herbie Ong8170d692019-02-13 14:13:21 -0800257 desc: "double positive infinity",
Herbie Ong800c9902018-12-06 15:28:53 -0800258 inputMessage: &pb3.Scalars{},
259 inputText: "s_double: inf",
260 wantMessage: &pb3.Scalars{
261 SDouble: math.Inf(1),
262 },
263 }, {
Herbie Ong8170d692019-02-13 14:13:21 -0800264 desc: "double negative infinity",
Herbie Ong800c9902018-12-06 15:28:53 -0800265 inputMessage: &pb3.Scalars{},
266 inputText: "s_double: -inf",
267 wantMessage: &pb3.Scalars{
268 SDouble: math.Inf(-1),
269 },
270 }, {
271 desc: "invalid string value",
272 inputMessage: &pb3.Scalars{},
273 inputText: "s_string: invalid_string",
274 wantErr: true,
275 }, {
276 desc: "proto2 bytes set to empty string",
277 inputMessage: &pb2.Scalars{},
278 inputText: "opt_bytes: ''",
279 wantMessage: &pb2.Scalars{
280 OptBytes: []byte(""),
281 },
282 }, {
283 desc: "proto3 bytes set to empty string",
284 inputMessage: &pb3.Scalars{},
285 inputText: "s_bytes: ''",
286 wantMessage: &pb3.Scalars{},
287 }, {
288 desc: "proto2 duplicate singular field",
289 inputMessage: &pb2.Scalars{},
290 inputText: `
291opt_bool: true
292opt_bool: false
293`,
294 wantErr: true,
295 }, {
Herbie Ong800c9902018-12-06 15:28:53 -0800296 desc: "proto2 more duplicate singular field",
297 inputMessage: &pb2.Scalars{},
298 inputText: `
299opt_bool: true
300opt_string: "hello"
301opt_bool: false
302`,
303 wantErr: true,
304 }, {
Herbie Ong8170d692019-02-13 14:13:21 -0800305 desc: "proto2 invalid singular field",
306 inputMessage: &pb2.Scalars{},
307 inputText: `
308opt_bool: [true, false]
309`,
310 wantErr: true,
311 }, {
Herbie Ong800c9902018-12-06 15:28:53 -0800312 desc: "proto3 duplicate singular field",
313 inputMessage: &pb3.Scalars{},
314 inputText: `
315s_bool: false
316s_bool: true
317`,
318 wantErr: true,
319 }, {
320 desc: "proto3 more duplicate singular field",
321 inputMessage: &pb3.Scalars{},
322 inputText: `
323s_bool: false
324s_string: ""
325s_bool: true
326`,
327 wantErr: true,
328 }, {
329 desc: "proto2 enum",
330 inputMessage: &pb2.Enums{},
331 inputText: `
Herbie Ong8170d692019-02-13 14:13:21 -0800332opt_enum: ONE
Herbie Ong800c9902018-12-06 15:28:53 -0800333opt_nested_enum: UNO
334`,
335 wantMessage: &pb2.Enums{
Herbie Ong8170d692019-02-13 14:13:21 -0800336 OptEnum: pb2.Enum_ONE.Enum(),
Herbie Ong800c9902018-12-06 15:28:53 -0800337 OptNestedEnum: pb2.Enums_UNO.Enum(),
338 },
339 }, {
340 desc: "proto2 enum set to numeric values",
341 inputMessage: &pb2.Enums{},
342 inputText: `
Herbie Ong8170d692019-02-13 14:13:21 -0800343opt_enum: 2
Herbie Ong800c9902018-12-06 15:28:53 -0800344opt_nested_enum: 2
345`,
346 wantMessage: &pb2.Enums{
Herbie Ong8170d692019-02-13 14:13:21 -0800347 OptEnum: pb2.Enum_TWO.Enum(),
Herbie Ong800c9902018-12-06 15:28:53 -0800348 OptNestedEnum: pb2.Enums_DOS.Enum(),
349 },
350 }, {
351 desc: "proto2 enum set to unnamed numeric values",
352 inputMessage: &pb2.Enums{},
353 inputText: `
354opt_enum: 101
355opt_nested_enum: -101
356`,
357 wantMessage: &pb2.Enums{
Joe Tsai6dc168e2019-07-09 23:11:13 -0700358 OptEnum: pb2.Enum(101).Enum(),
359 OptNestedEnum: pb2.Enums_NestedEnum(-101).Enum(),
Herbie Ong800c9902018-12-06 15:28:53 -0800360 },
361 }, {
362 desc: "proto2 enum set to invalid named",
363 inputMessage: &pb2.Enums{},
364 inputText: `
Herbie Ong8170d692019-02-13 14:13:21 -0800365opt_enum: UNNAMED
Herbie Ong800c9902018-12-06 15:28:53 -0800366opt_nested_enum: UNNAMED_TOO
367`,
368 wantErr: true,
369 }, {
370 desc: "proto3 enum name value",
371 inputMessage: &pb3.Enums{},
372 inputText: `
373s_enum: ONE
374s_nested_enum: DIEZ
375`,
376 wantMessage: &pb3.Enums{
377 SEnum: pb3.Enum_ONE,
378 SNestedEnum: pb3.Enums_DIEZ,
379 },
380 }, {
381 desc: "proto3 enum numeric value",
382 inputMessage: &pb3.Enums{},
383 inputText: `
384s_enum: 2
Herbie Ong8170d692019-02-13 14:13:21 -0800385s_nested_enum: 2
Herbie Ong800c9902018-12-06 15:28:53 -0800386`,
387 wantMessage: &pb3.Enums{
388 SEnum: pb3.Enum_TWO,
Herbie Ong8170d692019-02-13 14:13:21 -0800389 SNestedEnum: pb3.Enums_DOS,
Herbie Ong800c9902018-12-06 15:28:53 -0800390 },
391 }, {
392 desc: "proto3 enum unnamed numeric value",
393 inputMessage: &pb3.Enums{},
394 inputText: `
395s_enum: 0x7fffffff
396s_nested_enum: -0x80000000
397`,
398 wantMessage: &pb3.Enums{
399 SEnum: 0x7fffffff,
400 SNestedEnum: -0x80000000,
401 },
402 }, {
403 desc: "proto2 nested empty messages",
404 inputMessage: &pb2.Nests{},
405 inputText: `
406opt_nested: {}
Herbie Ong0dcfb9a2019-01-14 15:32:26 -0800407OptGroup: {}
Herbie Ong800c9902018-12-06 15:28:53 -0800408`,
409 wantMessage: &pb2.Nests{
410 OptNested: &pb2.Nested{},
411 Optgroup: &pb2.Nests_OptGroup{},
412 },
413 }, {
Herbie Ong20aefe92019-06-24 19:21:46 -0700414 desc: "group field name",
415 inputMessage: &pb2.Nests{},
416 inputText: `optgroup: {}`,
417 wantErr: true,
418 }, {
Herbie Ong800c9902018-12-06 15:28:53 -0800419 desc: "proto2 nested messages",
420 inputMessage: &pb2.Nests{},
421 inputText: `
422opt_nested: {
423 opt_string: "nested message"
424 opt_nested: {
425 opt_string: "another nested message"
426 }
427}
428`,
429 wantMessage: &pb2.Nests{
430 OptNested: &pb2.Nested{
Damien Neila8a2cea2019-07-10 16:17:16 -0700431 OptString: proto.String("nested message"),
Herbie Ong800c9902018-12-06 15:28:53 -0800432 OptNested: &pb2.Nested{
Damien Neila8a2cea2019-07-10 16:17:16 -0700433 OptString: proto.String("another nested message"),
Herbie Ong800c9902018-12-06 15:28:53 -0800434 },
435 },
436 },
437 }, {
438 desc: "proto3 nested empty message",
439 inputMessage: &pb3.Nests{},
440 inputText: "s_nested: {}",
441 wantMessage: &pb3.Nests{
442 SNested: &pb3.Nested{},
443 },
444 }, {
445 desc: "proto3 nested message",
446 inputMessage: &pb3.Nests{},
447 inputText: `
448s_nested: {
449 s_string: "nested message"
450 s_nested: {
451 s_string: "another nested message"
452 }
453}
454`,
455 wantMessage: &pb3.Nests{
456 SNested: &pb3.Nested{
457 SString: "nested message",
458 SNested: &pb3.Nested{
459 SString: "another nested message",
460 },
461 },
462 },
463 }, {
Herbie Ong21a39742019-04-08 17:32:44 -0700464 desc: "proto3 nested message contains invalid UTF-8",
465 inputMessage: &pb3.Nests{},
466 inputText: `s_nested: {
467 s_string: "abc\xff"
468}
469`,
Herbie Ong21a39742019-04-08 17:32:44 -0700470 wantErr: true,
471 }, {
Herbie Ong8170d692019-02-13 14:13:21 -0800472 desc: "oneof set to empty string",
473 inputMessage: &pb3.Oneofs{},
474 inputText: "oneof_string: ''",
475 wantMessage: &pb3.Oneofs{
476 Union: &pb3.Oneofs_OneofString{},
Herbie Ong800c9902018-12-06 15:28:53 -0800477 },
478 }, {
Herbie Ong8170d692019-02-13 14:13:21 -0800479 desc: "oneof set to string",
480 inputMessage: &pb3.Oneofs{},
481 inputText: "oneof_string: 'hello'",
482 wantMessage: &pb3.Oneofs{
483 Union: &pb3.Oneofs_OneofString{
484 OneofString: "hello",
Herbie Ong800c9902018-12-06 15:28:53 -0800485 },
486 },
487 }, {
Herbie Ong8170d692019-02-13 14:13:21 -0800488 desc: "oneof set to enum",
489 inputMessage: &pb3.Oneofs{},
490 inputText: "oneof_enum: TEN",
491 wantMessage: &pb3.Oneofs{
492 Union: &pb3.Oneofs_OneofEnum{
493 OneofEnum: pb3.Enum_TEN,
Herbie Ong800c9902018-12-06 15:28:53 -0800494 },
495 },
496 }, {
Herbie Ong8170d692019-02-13 14:13:21 -0800497 desc: "oneof set to empty message",
498 inputMessage: &pb3.Oneofs{},
499 inputText: "oneof_nested: {}",
500 wantMessage: &pb3.Oneofs{
501 Union: &pb3.Oneofs_OneofNested{
502 OneofNested: &pb3.Nested{},
503 },
504 },
505 }, {
506 desc: "oneof set to message",
507 inputMessage: &pb3.Oneofs{},
Herbie Ong800c9902018-12-06 15:28:53 -0800508 inputText: `
Herbie Ong8170d692019-02-13 14:13:21 -0800509oneof_nested: {
510 s_string: "nested message"
Herbie Ong800c9902018-12-06 15:28:53 -0800511}
512`,
Herbie Ong8170d692019-02-13 14:13:21 -0800513 wantMessage: &pb3.Oneofs{
514 Union: &pb3.Oneofs_OneofNested{
515 OneofNested: &pb3.Nested{
516 SString: "nested message",
Herbie Ong800c9902018-12-06 15:28:53 -0800517 },
518 },
519 },
520 }, {
Herbie Ong8a1d4602019-04-02 20:19:36 -0700521 desc: "oneof set to more than one field",
Herbie Ong8170d692019-02-13 14:13:21 -0800522 inputMessage: &pb3.Oneofs{},
Herbie Ong6470ea62019-01-07 18:56:57 -0800523 inputText: `
Herbie Ong8a1d4602019-04-02 20:19:36 -0700524oneof_enum: ZERO
525oneof_string: "hello"
Herbie Ong6470ea62019-01-07 18:56:57 -0800526`,
Herbie Ong8a1d4602019-04-02 20:19:36 -0700527 wantErr: true,
Herbie Ong6470ea62019-01-07 18:56:57 -0800528 }, {
Herbie Ong800c9902018-12-06 15:28:53 -0800529 desc: "repeated scalar using same field name",
530 inputMessage: &pb2.Repeats{},
531 inputText: `
532rpt_string: "a"
533rpt_string: "b"
534rpt_int32: 0xff
535rpt_float: 1.23
536rpt_bytes: "bytes"
537`,
538 wantMessage: &pb2.Repeats{
539 RptString: []string{"a", "b"},
540 RptInt32: []int32{0xff},
541 RptFloat: []float32{1.23},
542 RptBytes: [][]byte{[]byte("bytes")},
543 },
544 }, {
545 desc: "repeated using mix of [] and repeated field name",
546 inputMessage: &pb2.Repeats{},
547 inputText: `
548rpt_string: "a"
549rpt_bool: true
550rpt_string: ["x", "y"]
551rpt_bool: [ false, true ]
552rpt_string: "b"
553`,
554 wantMessage: &pb2.Repeats{
555 RptString: []string{"a", "x", "y", "b"},
556 RptBool: []bool{true, false, true},
557 },
558 }, {
Herbie Ong21a39742019-04-08 17:32:44 -0700559 desc: "repeated contains invalid UTF-8",
560 inputMessage: &pb2.Repeats{},
561 inputText: `rpt_string: "abc\xff"`,
Damien Neil8c86fc52019-06-19 09:28:29 -0700562 wantErr: true,
Herbie Ong21a39742019-04-08 17:32:44 -0700563 }, {
Herbie Ong800c9902018-12-06 15:28:53 -0800564 desc: "repeated enums",
565 inputMessage: &pb2.Enums{},
566 inputText: `
Herbie Ong8170d692019-02-13 14:13:21 -0800567rpt_enum: TEN
Herbie Ong800c9902018-12-06 15:28:53 -0800568rpt_enum: 1
569rpt_nested_enum: [DOS, 2]
570rpt_enum: 42
571rpt_nested_enum: -47
572`,
573 wantMessage: &pb2.Enums{
Herbie Ong8170d692019-02-13 14:13:21 -0800574 RptEnum: []pb2.Enum{pb2.Enum_TEN, pb2.Enum_ONE, 42},
Herbie Ong800c9902018-12-06 15:28:53 -0800575 RptNestedEnum: []pb2.Enums_NestedEnum{pb2.Enums_DOS, pb2.Enums_DOS, -47},
576 },
577 }, {
578 desc: "repeated nested messages",
579 inputMessage: &pb2.Nests{},
580 inputText: `
581rpt_nested: {
582 opt_string: "repeat nested one"
583}
584rpt_nested: {
585 opt_string: "repeat nested two"
586 opt_nested: {
587 opt_string: "inside repeat nested two"
588 }
589}
590rpt_nested: {}
591`,
592 wantMessage: &pb2.Nests{
593 RptNested: []*pb2.Nested{
594 {
Damien Neila8a2cea2019-07-10 16:17:16 -0700595 OptString: proto.String("repeat nested one"),
Herbie Ong800c9902018-12-06 15:28:53 -0800596 },
597 {
Damien Neila8a2cea2019-07-10 16:17:16 -0700598 OptString: proto.String("repeat nested two"),
Herbie Ong800c9902018-12-06 15:28:53 -0800599 OptNested: &pb2.Nested{
Damien Neila8a2cea2019-07-10 16:17:16 -0700600 OptString: proto.String("inside repeat nested two"),
Herbie Ong800c9902018-12-06 15:28:53 -0800601 },
602 },
603 {},
604 },
605 },
606 }, {
607 desc: "repeated group fields",
608 inputMessage: &pb2.Nests{},
609 inputText: `
Herbie Ong0dcfb9a2019-01-14 15:32:26 -0800610RptGroup: {
Herbie Ong8170d692019-02-13 14:13:21 -0800611 rpt_string: "hello"
612 rpt_string: "world"
Herbie Ong800c9902018-12-06 15:28:53 -0800613}
Herbie Ong0dcfb9a2019-01-14 15:32:26 -0800614RptGroup: {}
Herbie Ong800c9902018-12-06 15:28:53 -0800615`,
616 wantMessage: &pb2.Nests{
617 Rptgroup: []*pb2.Nests_RptGroup{
618 {
Herbie Ong8170d692019-02-13 14:13:21 -0800619 RptString: []string{"hello", "world"},
Herbie Ong800c9902018-12-06 15:28:53 -0800620 },
621 {},
622 },
623 },
624 }, {
625 desc: "map fields 1",
Herbie Ong8170d692019-02-13 14:13:21 -0800626 inputMessage: &pb3.Maps{},
Herbie Ong800c9902018-12-06 15:28:53 -0800627 inputText: `
628int32_to_str: {
629 key: -101
630 value: "-101"
631}
632int32_to_str: {
633 key: 0
634 value: "zero"
635}
Herbie Ong8170d692019-02-13 14:13:21 -0800636bool_to_uint32: {
637 key: false
638 value: 101
Herbie Ong800c9902018-12-06 15:28:53 -0800639}
640int32_to_str: {
641 key: 255
642 value: "0xff"
643}
644bool_to_uint32: {
Herbie Ong800c9902018-12-06 15:28:53 -0800645 key: true
646 value: 42
647}
648`,
Herbie Ong8170d692019-02-13 14:13:21 -0800649 wantMessage: &pb3.Maps{
Herbie Ong800c9902018-12-06 15:28:53 -0800650 Int32ToStr: map[int32]string{
651 -101: "-101",
652 0xff: "0xff",
653 0: "zero",
654 },
Herbie Ong800c9902018-12-06 15:28:53 -0800655 BoolToUint32: map[bool]uint32{
656 true: 42,
657 false: 101,
658 },
659 },
660 }, {
661 desc: "map fields 2",
Herbie Ong8170d692019-02-13 14:13:21 -0800662 inputMessage: &pb3.Maps{},
Herbie Ong800c9902018-12-06 15:28:53 -0800663 inputText: `
664uint64_to_enum: {
665 key: 1
Herbie Ong8170d692019-02-13 14:13:21 -0800666 value: ONE
Herbie Ong800c9902018-12-06 15:28:53 -0800667}
668uint64_to_enum: {
669 key: 2
Herbie Ong8170d692019-02-13 14:13:21 -0800670 value: 2
Herbie Ong800c9902018-12-06 15:28:53 -0800671}
672uint64_to_enum: {
673 key: 10
Herbie Ong8170d692019-02-13 14:13:21 -0800674 value: 101
Herbie Ong800c9902018-12-06 15:28:53 -0800675}
676`,
Herbie Ong8170d692019-02-13 14:13:21 -0800677 wantMessage: &pb3.Maps{
678 Uint64ToEnum: map[uint64]pb3.Enum{
679 1: pb3.Enum_ONE,
680 2: pb3.Enum_TWO,
681 10: 101,
Herbie Ong800c9902018-12-06 15:28:53 -0800682 },
683 },
684 }, {
685 desc: "map fields 3",
Herbie Ong8170d692019-02-13 14:13:21 -0800686 inputMessage: &pb3.Maps{},
Herbie Ong800c9902018-12-06 15:28:53 -0800687 inputText: `
688str_to_nested: {
689 key: "nested_one"
690 value: {
Herbie Ong8170d692019-02-13 14:13:21 -0800691 s_string: "nested in a map"
Herbie Ong800c9902018-12-06 15:28:53 -0800692 }
693}
694`,
Herbie Ong8170d692019-02-13 14:13:21 -0800695 wantMessage: &pb3.Maps{
696 StrToNested: map[string]*pb3.Nested{
697 "nested_one": &pb3.Nested{
698 SString: "nested in a map",
Herbie Ong800c9902018-12-06 15:28:53 -0800699 },
700 },
701 },
702 }, {
703 desc: "map fields 4",
Herbie Ong8170d692019-02-13 14:13:21 -0800704 inputMessage: &pb3.Maps{},
Herbie Ong800c9902018-12-06 15:28:53 -0800705 inputText: `
706str_to_oneofs: {
707 key: "nested"
708 value: {
Herbie Ong8170d692019-02-13 14:13:21 -0800709 oneof_nested: {
710 s_string: "nested oneof in map field value"
Herbie Ong800c9902018-12-06 15:28:53 -0800711 }
712 }
713}
714str_to_oneofs: {
715 key: "string"
716 value: {
Herbie Ong8170d692019-02-13 14:13:21 -0800717 oneof_string: "hello"
Herbie Ong800c9902018-12-06 15:28:53 -0800718 }
719}
720`,
Herbie Ong8170d692019-02-13 14:13:21 -0800721 wantMessage: &pb3.Maps{
722 StrToOneofs: map[string]*pb3.Oneofs{
723 "string": &pb3.Oneofs{
724 Union: &pb3.Oneofs_OneofString{
725 OneofString: "hello",
Herbie Ong800c9902018-12-06 15:28:53 -0800726 },
727 },
Herbie Ong8170d692019-02-13 14:13:21 -0800728 "nested": &pb3.Oneofs{
729 Union: &pb3.Oneofs_OneofNested{
730 OneofNested: &pb3.Nested{
731 SString: "nested oneof in map field value",
Herbie Ong800c9902018-12-06 15:28:53 -0800732 },
733 },
734 },
735 },
736 },
737 }, {
738 desc: "map contains duplicate keys",
Herbie Ong8170d692019-02-13 14:13:21 -0800739 inputMessage: &pb3.Maps{},
Herbie Ong800c9902018-12-06 15:28:53 -0800740 inputText: `
741int32_to_str: {
742 key: 0
743 value: "cero"
744}
745int32_to_str: {
746 key: 0
747 value: "zero"
748}
749`,
Herbie Ong8170d692019-02-13 14:13:21 -0800750 wantMessage: &pb3.Maps{
Herbie Ong800c9902018-12-06 15:28:53 -0800751 Int32ToStr: map[int32]string{
752 0: "zero",
753 },
754 },
755 }, {
756 desc: "map contains duplicate key fields",
Herbie Ong8170d692019-02-13 14:13:21 -0800757 inputMessage: &pb3.Maps{},
Herbie Ong800c9902018-12-06 15:28:53 -0800758 inputText: `
759int32_to_str: {
760 key: 0
761 key: 1
762 value: "cero"
763}
764`,
765 wantErr: true,
766 }, {
767 desc: "map contains duplicate value fields",
Herbie Ong8170d692019-02-13 14:13:21 -0800768 inputMessage: &pb3.Maps{},
Herbie Ong800c9902018-12-06 15:28:53 -0800769 inputText: `
770int32_to_str: {
771 key: 1
772 value: "cero"
773 value: "uno"
774}
775`,
776 wantErr: true,
777 }, {
778 desc: "map contains missing key",
Herbie Ong8170d692019-02-13 14:13:21 -0800779 inputMessage: &pb3.Maps{},
Herbie Ong800c9902018-12-06 15:28:53 -0800780 inputText: `
781int32_to_str: {
782 value: "zero"
783}
Herbie Ong8170d692019-02-13 14:13:21 -0800784bool_to_uint32: {
785 value: 47
786}
787str_to_nested: {
788 value: {}
789}
Herbie Ong800c9902018-12-06 15:28:53 -0800790`,
Herbie Ong8170d692019-02-13 14:13:21 -0800791 wantMessage: &pb3.Maps{
Herbie Ong800c9902018-12-06 15:28:53 -0800792 Int32ToStr: map[int32]string{
793 0: "zero",
794 },
Herbie Ong8170d692019-02-13 14:13:21 -0800795 BoolToUint32: map[bool]uint32{
796 false: 47,
797 },
798 StrToNested: map[string]*pb3.Nested{
799 "": {},
800 },
Herbie Ong800c9902018-12-06 15:28:53 -0800801 },
802 }, {
803 desc: "map contains missing value",
Herbie Ong8170d692019-02-13 14:13:21 -0800804 inputMessage: &pb3.Maps{},
Herbie Ong800c9902018-12-06 15:28:53 -0800805 inputText: `
806int32_to_str: {
807 key: 100
808}
Herbie Ong8170d692019-02-13 14:13:21 -0800809bool_to_uint32: {
810 key: true
811}
812uint64_to_enum: {
813 key: 101
814}
815str_to_nested: {
816 key: "hello"
817}
Herbie Ong800c9902018-12-06 15:28:53 -0800818`,
Herbie Ong8170d692019-02-13 14:13:21 -0800819 wantMessage: &pb3.Maps{
Herbie Ong800c9902018-12-06 15:28:53 -0800820 Int32ToStr: map[int32]string{
821 100: "",
822 },
Herbie Ong8170d692019-02-13 14:13:21 -0800823 BoolToUint32: map[bool]uint32{
824 true: 0,
825 },
826 Uint64ToEnum: map[uint64]pb3.Enum{
827 101: pb3.Enum_ZERO,
828 },
829 StrToNested: map[string]*pb3.Nested{
830 "hello": {},
831 },
Herbie Ong800c9902018-12-06 15:28:53 -0800832 },
833 }, {
834 desc: "map contains missing key and value",
Herbie Ong8170d692019-02-13 14:13:21 -0800835 inputMessage: &pb3.Maps{},
Herbie Ong800c9902018-12-06 15:28:53 -0800836 inputText: `
837int32_to_str: {}
Herbie Ong8170d692019-02-13 14:13:21 -0800838bool_to_uint32: {}
839uint64_to_enum: {}
840str_to_nested: {}
Herbie Ong800c9902018-12-06 15:28:53 -0800841`,
Herbie Ong8170d692019-02-13 14:13:21 -0800842 wantMessage: &pb3.Maps{
843 Int32ToStr: map[int32]string{
844 0: "",
845 },
846 BoolToUint32: map[bool]uint32{
847 false: 0,
848 },
849 Uint64ToEnum: map[uint64]pb3.Enum{
850 0: pb3.Enum_ZERO,
851 },
852 StrToNested: map[string]*pb3.Nested{
853 "": {},
854 },
855 },
856 }, {
857 desc: "map contains overriding entries",
858 inputMessage: &pb3.Maps{},
859 inputText: `
860int32_to_str: {
861 key: 0
862}
863int32_to_str: {
864 value: "empty"
865}
866int32_to_str: {}
867`,
868 wantMessage: &pb3.Maps{
Herbie Ong800c9902018-12-06 15:28:53 -0800869 Int32ToStr: map[int32]string{
870 0: "",
871 },
872 },
873 }, {
Herbie Ong21a39742019-04-08 17:32:44 -0700874 desc: "map field value contains invalid UTF-8",
875 inputMessage: &pb3.Maps{},
876 inputText: `int32_to_str: {
877 key: 101
878 value: "abc\xff"
879}
880`,
Herbie Ong21a39742019-04-08 17:32:44 -0700881 wantErr: true,
882 }, {
883 desc: "map field key contains invalid UTF-8",
884 inputMessage: &pb3.Maps{},
885 inputText: `str_to_nested: {
886 key: "abc\xff"
887 value: {}
888}
889`,
Herbie Ong21a39742019-04-08 17:32:44 -0700890 wantErr: true,
891 }, {
Herbie Ong800c9902018-12-06 15:28:53 -0800892 desc: "map contains unknown field",
Herbie Ong8170d692019-02-13 14:13:21 -0800893 inputMessage: &pb3.Maps{},
Herbie Ong800c9902018-12-06 15:28:53 -0800894 inputText: `
895int32_to_str: {
896 key: 0
897 value: "cero"
898 unknown: "bad"
899}
900`,
901 wantErr: true,
902 }, {
903 desc: "map contains extension-like key field",
Herbie Ong8170d692019-02-13 14:13:21 -0800904 inputMessage: &pb3.Maps{},
Herbie Ong800c9902018-12-06 15:28:53 -0800905 inputText: `
906int32_to_str: {
907 [key]: 10
908 value: "ten"
909}
910`,
911 wantErr: true,
912 }, {
913 desc: "map contains invalid key",
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: "invalid"
918 value: "cero"
919}
920`,
921 wantErr: true,
922 }, {
923 desc: "map contains invalid value",
Herbie Ong8170d692019-02-13 14:13:21 -0800924 inputMessage: &pb3.Maps{},
Herbie Ong800c9902018-12-06 15:28:53 -0800925 inputText: `
926int32_to_str: {
927 key: 100
928 value: 101
929}
930`,
931 wantErr: true,
932 }, {
933 desc: "map using mix of [] and repeated",
Herbie Ong8170d692019-02-13 14:13:21 -0800934 inputMessage: &pb3.Maps{},
Herbie Ong800c9902018-12-06 15:28:53 -0800935 inputText: `
936int32_to_str: {
937 key: 1
938 value: "one"
939}
940int32_to_str: [
941 {
942 key: 2
943 value: "not this"
944 },
945 {
946 },
947 {
948 key: 3
949 value: "three"
950 }
951]
952int32_to_str: {
953 key: 2
954 value: "two"
955}
956`,
Herbie Ong8170d692019-02-13 14:13:21 -0800957 wantMessage: &pb3.Maps{
Herbie Ong800c9902018-12-06 15:28:53 -0800958 Int32ToStr: map[int32]string{
959 0: "",
960 1: "one",
961 2: "two",
962 3: "three",
963 },
964 },
965 }, {
Herbie Ong42577ea2019-03-26 16:26:22 -0700966 desc: "required fields not set",
Herbie Ong800c9902018-12-06 15:28:53 -0800967 inputMessage: &pb2.Requireds{},
968 wantErr: true,
969 }, {
Herbie Ong42577ea2019-03-26 16:26:22 -0700970 desc: "required field set",
Herbie Ong800c9902018-12-06 15:28:53 -0800971 inputMessage: &pb2.PartialRequired{},
972 inputText: "req_string: 'this is required'",
973 wantMessage: &pb2.PartialRequired{
Damien Neila8a2cea2019-07-10 16:17:16 -0700974 ReqString: proto.String("this is required"),
Herbie Ong800c9902018-12-06 15:28:53 -0800975 },
976 }, {
Herbie Ong42577ea2019-03-26 16:26:22 -0700977 desc: "required fields partially set",
Herbie Ong800c9902018-12-06 15:28:53 -0800978 inputMessage: &pb2.Requireds{},
979 inputText: `
980req_bool: false
Herbie Ong800c9902018-12-06 15:28:53 -0800981req_sfixed64: 3203386110
982req_string: "hello"
Herbie Ong8170d692019-02-13 14:13:21 -0800983req_enum: ONE
Herbie Ong800c9902018-12-06 15:28:53 -0800984`,
985 wantMessage: &pb2.Requireds{
Damien Neila8a2cea2019-07-10 16:17:16 -0700986 ReqBool: proto.Bool(false),
987 ReqSfixed64: proto.Int64(0xbeefcafe),
988 ReqString: proto.String("hello"),
Herbie Ong8170d692019-02-13 14:13:21 -0800989 ReqEnum: pb2.Enum_ONE.Enum(),
Herbie Ong800c9902018-12-06 15:28:53 -0800990 },
991 wantErr: true,
992 }, {
Herbie Ong42577ea2019-03-26 16:26:22 -0700993 desc: "required fields partially set with AllowPartial",
Damien Neil5c5b5312019-05-14 12:44:37 -0700994 umo: prototext.UnmarshalOptions{AllowPartial: true},
Herbie Ong42577ea2019-03-26 16:26:22 -0700995 inputMessage: &pb2.Requireds{},
996 inputText: `
997req_bool: false
998req_sfixed64: 3203386110
999req_string: "hello"
1000req_enum: ONE
1001`,
1002 wantMessage: &pb2.Requireds{
Damien Neila8a2cea2019-07-10 16:17:16 -07001003 ReqBool: proto.Bool(false),
1004 ReqSfixed64: proto.Int64(0xbeefcafe),
1005 ReqString: proto.String("hello"),
Herbie Ong42577ea2019-03-26 16:26:22 -07001006 ReqEnum: pb2.Enum_ONE.Enum(),
1007 },
1008 }, {
1009 desc: "required fields all set",
Herbie Ong800c9902018-12-06 15:28:53 -08001010 inputMessage: &pb2.Requireds{},
1011 inputText: `
1012req_bool: false
Herbie Ong800c9902018-12-06 15:28:53 -08001013req_sfixed64: 0
Herbie Ong800c9902018-12-06 15:28:53 -08001014req_double: 0
1015req_string: ""
Herbie Ong8170d692019-02-13 14:13:21 -08001016req_enum: ONE
Herbie Ong800c9902018-12-06 15:28:53 -08001017req_nested: {}
1018`,
1019 wantMessage: &pb2.Requireds{
Damien Neila8a2cea2019-07-10 16:17:16 -07001020 ReqBool: proto.Bool(false),
1021 ReqSfixed64: proto.Int64(0),
1022 ReqDouble: proto.Float64(0),
1023 ReqString: proto.String(""),
Herbie Ong8170d692019-02-13 14:13:21 -08001024 ReqEnum: pb2.Enum_ONE.Enum(),
Herbie Ong800c9902018-12-06 15:28:53 -08001025 ReqNested: &pb2.Nested{},
1026 },
1027 }, {
1028 desc: "indirect required field",
1029 inputMessage: &pb2.IndirectRequired{},
1030 inputText: "opt_nested: {}",
1031 wantMessage: &pb2.IndirectRequired{
1032 OptNested: &pb2.NestedWithRequired{},
1033 },
1034 wantErr: true,
1035 }, {
Herbie Ong42577ea2019-03-26 16:26:22 -07001036 desc: "indirect required field with AllowPartial",
Damien Neil5c5b5312019-05-14 12:44:37 -07001037 umo: prototext.UnmarshalOptions{AllowPartial: true},
Herbie Ong42577ea2019-03-26 16:26:22 -07001038 inputMessage: &pb2.IndirectRequired{},
1039 inputText: "opt_nested: {}",
1040 wantMessage: &pb2.IndirectRequired{
1041 OptNested: &pb2.NestedWithRequired{},
1042 },
1043 }, {
Herbie Ong800c9902018-12-06 15:28:53 -08001044 desc: "indirect required field in repeated",
1045 inputMessage: &pb2.IndirectRequired{},
1046 inputText: `
1047rpt_nested: {
1048 req_string: "one"
1049}
1050rpt_nested: {}
Herbie Ong800c9902018-12-06 15:28:53 -08001051`,
1052 wantMessage: &pb2.IndirectRequired{
1053 RptNested: []*pb2.NestedWithRequired{
1054 {
Damien Neila8a2cea2019-07-10 16:17:16 -07001055 ReqString: proto.String("one"),
Herbie Ong800c9902018-12-06 15:28:53 -08001056 },
1057 {},
Herbie Ong800c9902018-12-06 15:28:53 -08001058 },
1059 },
1060 wantErr: true,
1061 }, {
Herbie Ong42577ea2019-03-26 16:26:22 -07001062 desc: "indirect required field in repeated with AllowPartial",
Damien Neil5c5b5312019-05-14 12:44:37 -07001063 umo: prototext.UnmarshalOptions{AllowPartial: true},
Herbie Ong42577ea2019-03-26 16:26:22 -07001064 inputMessage: &pb2.IndirectRequired{},
1065 inputText: `
1066rpt_nested: {
1067 req_string: "one"
1068}
1069rpt_nested: {}
1070`,
1071 wantMessage: &pb2.IndirectRequired{
1072 RptNested: []*pb2.NestedWithRequired{
1073 {
Damien Neila8a2cea2019-07-10 16:17:16 -07001074 ReqString: proto.String("one"),
Herbie Ong42577ea2019-03-26 16:26:22 -07001075 },
1076 {},
1077 },
1078 },
1079 }, {
Herbie Ong800c9902018-12-06 15:28:53 -08001080 desc: "indirect required field in map",
1081 inputMessage: &pb2.IndirectRequired{},
1082 inputText: `
1083str_to_nested: {
1084 key: "missing"
1085}
1086str_to_nested: {
1087 key: "contains"
1088 value: {
1089 req_string: "here"
1090 }
1091}
1092`,
1093 wantMessage: &pb2.IndirectRequired{
1094 StrToNested: map[string]*pb2.NestedWithRequired{
1095 "missing": &pb2.NestedWithRequired{},
1096 "contains": &pb2.NestedWithRequired{
Damien Neila8a2cea2019-07-10 16:17:16 -07001097 ReqString: proto.String("here"),
Herbie Ong800c9902018-12-06 15:28:53 -08001098 },
1099 },
1100 },
1101 wantErr: true,
Herbie Ong7c624e22018-12-13 14:41:22 -08001102 }, {
Herbie Ong42577ea2019-03-26 16:26:22 -07001103 desc: "indirect required field in map with AllowPartial",
Damien Neil5c5b5312019-05-14 12:44:37 -07001104 umo: prototext.UnmarshalOptions{AllowPartial: true},
Herbie Ong42577ea2019-03-26 16:26:22 -07001105 inputMessage: &pb2.IndirectRequired{},
1106 inputText: `
1107str_to_nested: {
1108 key: "missing"
1109}
1110str_to_nested: {
1111 key: "contains"
1112 value: {
1113 req_string: "here"
1114 }
1115}
1116`,
1117 wantMessage: &pb2.IndirectRequired{
1118 StrToNested: map[string]*pb2.NestedWithRequired{
1119 "missing": &pb2.NestedWithRequired{},
1120 "contains": &pb2.NestedWithRequired{
Damien Neila8a2cea2019-07-10 16:17:16 -07001121 ReqString: proto.String("here"),
Herbie Ong42577ea2019-03-26 16:26:22 -07001122 },
1123 },
1124 },
1125 }, {
Herbie Ong8170d692019-02-13 14:13:21 -08001126 desc: "indirect required field in oneof",
1127 inputMessage: &pb2.IndirectRequired{},
1128 inputText: `oneof_nested: {}
1129`,
1130 wantMessage: &pb2.IndirectRequired{
1131 Union: &pb2.IndirectRequired_OneofNested{
1132 OneofNested: &pb2.NestedWithRequired{},
1133 },
1134 },
1135 wantErr: true,
1136 }, {
Herbie Ong42577ea2019-03-26 16:26:22 -07001137 desc: "indirect required field in oneof with AllowPartial",
Damien Neil5c5b5312019-05-14 12:44:37 -07001138 umo: prototext.UnmarshalOptions{AllowPartial: true},
Herbie Ong42577ea2019-03-26 16:26:22 -07001139 inputMessage: &pb2.IndirectRequired{},
1140 inputText: `oneof_nested: {}
1141`,
1142 wantMessage: &pb2.IndirectRequired{
1143 Union: &pb2.IndirectRequired_OneofNested{
1144 OneofNested: &pb2.NestedWithRequired{},
1145 },
1146 },
1147 }, {
Herbie Ong7c624e22018-12-13 14:41:22 -08001148 desc: "ignore reserved field",
1149 inputMessage: &pb2.Nests{},
1150 inputText: "reserved_field: 'ignore this'",
1151 wantMessage: &pb2.Nests{},
Herbie Ongc525c972018-12-18 18:04:31 -08001152 }, {
1153 desc: "extensions of non-repeated fields",
1154 inputMessage: &pb2.Extensions{},
1155 inputText: `opt_string: "non-extension field"
1156[pb2.opt_ext_bool]: true
1157opt_bool: true
1158[pb2.opt_ext_nested]: {
1159 opt_string: "nested in an extension"
1160 opt_nested: {
1161 opt_string: "another nested in an extension"
1162 }
1163}
1164[pb2.opt_ext_string]: "extension field"
1165opt_int32: 42
Herbie Ong8170d692019-02-13 14:13:21 -08001166[pb2.opt_ext_enum]: TEN
Herbie Ongc525c972018-12-18 18:04:31 -08001167`,
1168 wantMessage: func() proto.Message {
1169 m := &pb2.Extensions{
Damien Neila8a2cea2019-07-10 16:17:16 -07001170 OptString: proto.String("non-extension field"),
1171 OptBool: proto.Bool(true),
1172 OptInt32: proto.Int32(42),
Herbie Ongc525c972018-12-18 18:04:31 -08001173 }
1174 setExtension(m, pb2.E_OptExtBool, true)
1175 setExtension(m, pb2.E_OptExtString, "extension field")
Herbie Ong8170d692019-02-13 14:13:21 -08001176 setExtension(m, pb2.E_OptExtEnum, pb2.Enum_TEN)
Herbie Ongc525c972018-12-18 18:04:31 -08001177 setExtension(m, pb2.E_OptExtNested, &pb2.Nested{
Damien Neila8a2cea2019-07-10 16:17:16 -07001178 OptString: proto.String("nested in an extension"),
Herbie Ongc525c972018-12-18 18:04:31 -08001179 OptNested: &pb2.Nested{
Damien Neila8a2cea2019-07-10 16:17:16 -07001180 OptString: proto.String("another nested in an extension"),
Herbie Ongc525c972018-12-18 18:04:31 -08001181 },
1182 })
1183 return m
1184 }(),
1185 }, {
Herbie Ong21a39742019-04-08 17:32:44 -07001186 desc: "extension field contains invalid UTF-8",
1187 inputMessage: &pb2.Extensions{},
1188 inputText: `[pb2.opt_ext_string]: "abc\xff"`,
Damien Neil8c86fc52019-06-19 09:28:29 -07001189 wantErr: true,
Herbie Ong21a39742019-04-08 17:32:44 -07001190 }, {
Herbie Ongc525c972018-12-18 18:04:31 -08001191 desc: "extensions of repeated fields",
1192 inputMessage: &pb2.Extensions{},
Herbie Ong8170d692019-02-13 14:13:21 -08001193 inputText: `[pb2.rpt_ext_enum]: TEN
Herbie Ongc525c972018-12-18 18:04:31 -08001194[pb2.rpt_ext_enum]: 101
1195[pb2.rpt_ext_fixed32]: 42
Herbie Ong8170d692019-02-13 14:13:21 -08001196[pb2.rpt_ext_enum]: ONE
Herbie Ongc525c972018-12-18 18:04:31 -08001197[pb2.rpt_ext_nested]: {
1198 opt_string: "one"
1199}
1200[pb2.rpt_ext_nested]: {
1201 opt_string: "two"
1202}
1203[pb2.rpt_ext_fixed32]: 47
1204[pb2.rpt_ext_nested]: {
1205 opt_string: "three"
1206}
1207`,
1208 wantMessage: func() proto.Message {
1209 m := &pb2.Extensions{}
Herbie Ong8170d692019-02-13 14:13:21 -08001210 setExtension(m, pb2.E_RptExtEnum, &[]pb2.Enum{pb2.Enum_TEN, 101, pb2.Enum_ONE})
Herbie Ongc525c972018-12-18 18:04:31 -08001211 setExtension(m, pb2.E_RptExtFixed32, &[]uint32{42, 47})
1212 setExtension(m, pb2.E_RptExtNested, &[]*pb2.Nested{
Damien Neila8a2cea2019-07-10 16:17:16 -07001213 &pb2.Nested{OptString: proto.String("one")},
1214 &pb2.Nested{OptString: proto.String("two")},
1215 &pb2.Nested{OptString: proto.String("three")},
Herbie Ongc525c972018-12-18 18:04:31 -08001216 })
1217 return m
1218 }(),
1219 }, {
1220 desc: "extensions of non-repeated fields in another message",
1221 inputMessage: &pb2.Extensions{},
1222 inputText: `[pb2.ExtensionsContainer.opt_ext_bool]: true
Herbie Ong8170d692019-02-13 14:13:21 -08001223[pb2.ExtensionsContainer.opt_ext_enum]: TEN
Herbie Ongc525c972018-12-18 18:04:31 -08001224[pb2.ExtensionsContainer.opt_ext_nested]: {
1225 opt_string: "nested in an extension"
1226 opt_nested: {
1227 opt_string: "another nested in an extension"
1228 }
1229}
1230[pb2.ExtensionsContainer.opt_ext_string]: "extension field"
1231`,
1232 wantMessage: func() proto.Message {
1233 m := &pb2.Extensions{}
1234 setExtension(m, pb2.E_ExtensionsContainer_OptExtBool, true)
1235 setExtension(m, pb2.E_ExtensionsContainer_OptExtString, "extension field")
Herbie Ong8170d692019-02-13 14:13:21 -08001236 setExtension(m, pb2.E_ExtensionsContainer_OptExtEnum, pb2.Enum_TEN)
Herbie Ongc525c972018-12-18 18:04:31 -08001237 setExtension(m, pb2.E_ExtensionsContainer_OptExtNested, &pb2.Nested{
Damien Neila8a2cea2019-07-10 16:17:16 -07001238 OptString: proto.String("nested in an extension"),
Herbie Ongc525c972018-12-18 18:04:31 -08001239 OptNested: &pb2.Nested{
Damien Neila8a2cea2019-07-10 16:17:16 -07001240 OptString: proto.String("another nested in an extension"),
Herbie Ongc525c972018-12-18 18:04:31 -08001241 },
1242 })
1243 return m
1244 }(),
1245 }, {
1246 desc: "extensions of repeated fields in another message",
1247 inputMessage: &pb2.Extensions{},
1248 inputText: `opt_string: "non-extension field"
1249opt_bool: true
1250opt_int32: 42
1251[pb2.ExtensionsContainer.rpt_ext_nested]: {
1252 opt_string: "one"
1253}
Herbie Ong8170d692019-02-13 14:13:21 -08001254[pb2.ExtensionsContainer.rpt_ext_enum]: TEN
Herbie Ongc525c972018-12-18 18:04:31 -08001255[pb2.ExtensionsContainer.rpt_ext_nested]: {
1256 opt_string: "two"
1257}
1258[pb2.ExtensionsContainer.rpt_ext_enum]: 101
1259[pb2.ExtensionsContainer.rpt_ext_string]: "hello"
Herbie Ong8170d692019-02-13 14:13:21 -08001260[pb2.ExtensionsContainer.rpt_ext_enum]: ONE
Herbie Ongc525c972018-12-18 18:04:31 -08001261[pb2.ExtensionsContainer.rpt_ext_nested]: {
1262 opt_string: "three"
1263}
1264[pb2.ExtensionsContainer.rpt_ext_string]: "world"
1265`,
1266 wantMessage: func() proto.Message {
1267 m := &pb2.Extensions{
Damien Neila8a2cea2019-07-10 16:17:16 -07001268 OptString: proto.String("non-extension field"),
1269 OptBool: proto.Bool(true),
1270 OptInt32: proto.Int32(42),
Herbie Ongc525c972018-12-18 18:04:31 -08001271 }
Herbie Ong8170d692019-02-13 14:13:21 -08001272 setExtension(m, pb2.E_ExtensionsContainer_RptExtEnum, &[]pb2.Enum{pb2.Enum_TEN, 101, pb2.Enum_ONE})
Herbie Ongc525c972018-12-18 18:04:31 -08001273 setExtension(m, pb2.E_ExtensionsContainer_RptExtString, &[]string{"hello", "world"})
1274 setExtension(m, pb2.E_ExtensionsContainer_RptExtNested, &[]*pb2.Nested{
Damien Neila8a2cea2019-07-10 16:17:16 -07001275 &pb2.Nested{OptString: proto.String("one")},
1276 &pb2.Nested{OptString: proto.String("two")},
1277 &pb2.Nested{OptString: proto.String("three")},
Herbie Ongc525c972018-12-18 18:04:31 -08001278 })
1279 return m
1280 }(),
1281 }, {
1282 desc: "invalid extension field name",
1283 inputMessage: &pb2.Extensions{},
1284 inputText: "[pb2.invalid_message_field]: true",
1285 wantErr: true,
Herbie Ong66c365c2019-01-04 14:08:41 -08001286 }, {
Herbie Ong6470ea62019-01-07 18:56:57 -08001287 desc: "MessageSet",
1288 inputMessage: &pb2.MessageSet{},
1289 inputText: `
1290[pb2.MessageSetExtension]: {
1291 opt_string: "a messageset extension"
1292}
1293[pb2.MessageSetExtension.ext_nested]: {
1294 opt_string: "just a regular extension"
1295}
1296[pb2.MessageSetExtension.not_message_set_extension]: {
1297 opt_string: "not a messageset extension"
1298}
1299`,
1300 wantMessage: func() proto.Message {
1301 m := &pb2.MessageSet{}
1302 setExtension(m, pb2.E_MessageSetExtension_MessageSetExtension, &pb2.MessageSetExtension{
Damien Neila8a2cea2019-07-10 16:17:16 -07001303 OptString: proto.String("a messageset extension"),
Herbie Ong6470ea62019-01-07 18:56:57 -08001304 })
1305 setExtension(m, pb2.E_MessageSetExtension_NotMessageSetExtension, &pb2.MessageSetExtension{
Damien Neila8a2cea2019-07-10 16:17:16 -07001306 OptString: proto.String("not a messageset extension"),
Herbie Ong6470ea62019-01-07 18:56:57 -08001307 })
1308 setExtension(m, pb2.E_MessageSetExtension_ExtNested, &pb2.Nested{
Damien Neila8a2cea2019-07-10 16:17:16 -07001309 OptString: proto.String("just a regular extension"),
Herbie Ong6470ea62019-01-07 18:56:57 -08001310 })
1311 return m
1312 }(),
1313 }, {
1314 desc: "not real MessageSet 1",
1315 inputMessage: &pb2.FakeMessageSet{},
1316 inputText: `
1317[pb2.FakeMessageSetExtension.message_set_extension]: {
1318 opt_string: "not a messageset extension"
1319}
1320`,
1321 wantMessage: func() proto.Message {
1322 m := &pb2.FakeMessageSet{}
1323 setExtension(m, pb2.E_FakeMessageSetExtension_MessageSetExtension, &pb2.FakeMessageSetExtension{
Damien Neila8a2cea2019-07-10 16:17:16 -07001324 OptString: proto.String("not a messageset extension"),
Herbie Ong6470ea62019-01-07 18:56:57 -08001325 })
1326 return m
1327 }(),
1328 }, {
1329 desc: "not real MessageSet 2",
1330 inputMessage: &pb2.FakeMessageSet{},
1331 inputText: `
1332[pb2.FakeMessageSetExtension]: {
1333 opt_string: "not a messageset extension"
1334}
1335`,
1336 wantErr: true,
1337 }, {
1338 desc: "not real MessageSet 3",
1339 inputMessage: &pb2.MessageSet{},
1340 inputText: `
1341[pb2.message_set_extension]: {
1342 opt_string: "another not a messageset extension"
Herbie Ong300cff02019-03-20 18:05:16 -07001343}`,
Herbie Ong6470ea62019-01-07 18:56:57 -08001344 wantMessage: func() proto.Message {
1345 m := &pb2.MessageSet{}
1346 setExtension(m, pb2.E_MessageSetExtension, &pb2.FakeMessageSetExtension{
Damien Neila8a2cea2019-07-10 16:17:16 -07001347 OptString: proto.String("another not a messageset extension"),
Herbie Ong6470ea62019-01-07 18:56:57 -08001348 })
1349 return m
1350 }(),
1351 }, {
Herbie Ong66c365c2019-01-04 14:08:41 -08001352 desc: "Any not expanded",
Joe Tsaia95b29f2019-05-16 12:47:20 -07001353 inputMessage: &anypb.Any{},
Herbie Ong300cff02019-03-20 18:05:16 -07001354 inputText: `
Herbie Ong66c365c2019-01-04 14:08:41 -08001355type_url: "pb2.Nested"
1356value: "some bytes"
Herbie Ong66c365c2019-01-04 14:08:41 -08001357`,
Joe Tsaia95b29f2019-05-16 12:47:20 -07001358 wantMessage: &anypb.Any{
Herbie Ong300cff02019-03-20 18:05:16 -07001359 TypeUrl: "pb2.Nested",
1360 Value: []byte("some bytes"),
Herbie Ong66c365c2019-01-04 14:08:41 -08001361 },
1362 }, {
1363 desc: "Any not expanded missing value",
Joe Tsaia95b29f2019-05-16 12:47:20 -07001364 inputMessage: &anypb.Any{},
Herbie Ong300cff02019-03-20 18:05:16 -07001365 inputText: `type_url: "pb2.Nested"`,
Joe Tsaia95b29f2019-05-16 12:47:20 -07001366 wantMessage: &anypb.Any{
Herbie Ong300cff02019-03-20 18:05:16 -07001367 TypeUrl: "pb2.Nested",
Herbie Ong66c365c2019-01-04 14:08:41 -08001368 },
1369 }, {
1370 desc: "Any not expanded missing type_url",
Joe Tsaia95b29f2019-05-16 12:47:20 -07001371 inputMessage: &anypb.Any{},
Herbie Ong300cff02019-03-20 18:05:16 -07001372 inputText: `value: "some bytes"`,
Joe Tsaia95b29f2019-05-16 12:47:20 -07001373 wantMessage: &anypb.Any{
Herbie Ong300cff02019-03-20 18:05:16 -07001374 Value: []byte("some bytes"),
Herbie Ong66c365c2019-01-04 14:08:41 -08001375 },
1376 }, {
1377 desc: "Any expanded",
Damien Neil5c5b5312019-05-14 12:44:37 -07001378 umo: prototext.UnmarshalOptions{
Joe Tsai0fc49f82019-05-01 12:29:25 -07001379 Resolver: preg.NewTypes(pimpl.Export{}.MessageTypeOf(&pb2.Nested{})),
Herbie Ong300cff02019-03-20 18:05:16 -07001380 },
Joe Tsaia95b29f2019-05-16 12:47:20 -07001381 inputMessage: &anypb.Any{},
Herbie Ong300cff02019-03-20 18:05:16 -07001382 inputText: `
1383[foobar/pb2.Nested]: {
1384 opt_string: "embedded inside Any"
1385 opt_nested: {
1386 opt_string: "inception"
Herbie Ong66c365c2019-01-04 14:08:41 -08001387 }
1388}
1389`,
1390 wantMessage: func() proto.Message {
1391 m := &pb2.Nested{
Damien Neila8a2cea2019-07-10 16:17:16 -07001392 OptString: proto.String("embedded inside Any"),
Herbie Ong66c365c2019-01-04 14:08:41 -08001393 OptNested: &pb2.Nested{
Damien Neila8a2cea2019-07-10 16:17:16 -07001394 OptString: proto.String("inception"),
Herbie Ong66c365c2019-01-04 14:08:41 -08001395 },
1396 }
Herbie Onge0cf15b2019-03-15 19:32:38 -07001397 b, err := proto.MarshalOptions{Deterministic: true}.Marshal(m)
Herbie Ong66c365c2019-01-04 14:08:41 -08001398 if err != nil {
1399 t.Fatalf("error in binary marshaling message for Any.value: %v", err)
1400 }
Joe Tsaia95b29f2019-05-16 12:47:20 -07001401 return &anypb.Any{
Herbie Ong300cff02019-03-20 18:05:16 -07001402 TypeUrl: "foobar/pb2.Nested",
1403 Value: b,
Herbie Ong66c365c2019-01-04 14:08:41 -08001404 }
1405 }(),
1406 }, {
1407 desc: "Any expanded with empty value",
Damien Neil5c5b5312019-05-14 12:44:37 -07001408 umo: prototext.UnmarshalOptions{
Joe Tsai0fc49f82019-05-01 12:29:25 -07001409 Resolver: preg.NewTypes(pimpl.Export{}.MessageTypeOf(&pb2.Nested{})),
Herbie Ong300cff02019-03-20 18:05:16 -07001410 },
Joe Tsaia95b29f2019-05-16 12:47:20 -07001411 inputMessage: &anypb.Any{},
Herbie Ong300cff02019-03-20 18:05:16 -07001412 inputText: `[foo.com/pb2.Nested]: {}`,
Joe Tsaia95b29f2019-05-16 12:47:20 -07001413 wantMessage: &anypb.Any{
Herbie Ong300cff02019-03-20 18:05:16 -07001414 TypeUrl: "foo.com/pb2.Nested",
Herbie Ong66c365c2019-01-04 14:08:41 -08001415 },
1416 }, {
Damien Neil0c9f0a92019-06-19 10:41:09 -07001417 desc: "Any expanded with missing required",
Damien Neil5c5b5312019-05-14 12:44:37 -07001418 umo: prototext.UnmarshalOptions{
Joe Tsai0fc49f82019-05-01 12:29:25 -07001419 Resolver: preg.NewTypes(pimpl.Export{}.MessageTypeOf(&pb2.PartialRequired{})),
Herbie Ong300cff02019-03-20 18:05:16 -07001420 },
Joe Tsaia95b29f2019-05-16 12:47:20 -07001421 inputMessage: &anypb.Any{},
Herbie Ong300cff02019-03-20 18:05:16 -07001422 inputText: `
1423[pb2.PartialRequired]: {
1424 opt_string: "embedded inside Any"
Herbie Ong66c365c2019-01-04 14:08:41 -08001425}
1426`,
1427 wantMessage: func() proto.Message {
1428 m := &pb2.PartialRequired{
Damien Neila8a2cea2019-07-10 16:17:16 -07001429 OptString: proto.String("embedded inside Any"),
Herbie Ong66c365c2019-01-04 14:08:41 -08001430 }
Damien Neil96c229a2019-04-03 12:17:24 -07001431 b, err := proto.MarshalOptions{
1432 AllowPartial: true,
1433 Deterministic: true,
1434 }.Marshal(m)
Herbie Ong300cff02019-03-20 18:05:16 -07001435 if err != nil {
Herbie Ong66c365c2019-01-04 14:08:41 -08001436 t.Fatalf("error in binary marshaling message for Any.value: %v", err)
1437 }
Joe Tsaia95b29f2019-05-16 12:47:20 -07001438 return &anypb.Any{
Herbie Ong300cff02019-03-20 18:05:16 -07001439 TypeUrl: "pb2.PartialRequired",
1440 Value: b,
Herbie Ong66c365c2019-01-04 14:08:41 -08001441 }
1442 }(),
Herbie Ong66c365c2019-01-04 14:08:41 -08001443 }, {
Herbie Ong21a39742019-04-08 17:32:44 -07001444 desc: "Any with invalid UTF-8",
Damien Neil5c5b5312019-05-14 12:44:37 -07001445 umo: prototext.UnmarshalOptions{
Joe Tsai0fc49f82019-05-01 12:29:25 -07001446 Resolver: preg.NewTypes(pimpl.Export{}.MessageTypeOf(&pb3.Nested{})),
Herbie Ong21a39742019-04-08 17:32:44 -07001447 },
Joe Tsaia95b29f2019-05-16 12:47:20 -07001448 inputMessage: &anypb.Any{},
Herbie Ong21a39742019-04-08 17:32:44 -07001449 inputText: `
1450[pb3.Nested]: {
1451 s_string: "abc\xff"
1452}
1453`,
Herbie Ong21a39742019-04-08 17:32:44 -07001454 wantErr: true,
1455 }, {
Herbie Ong66c365c2019-01-04 14:08:41 -08001456 desc: "Any expanded with unregistered type",
Damien Neil5c5b5312019-05-14 12:44:37 -07001457 umo: prototext.UnmarshalOptions{Resolver: preg.NewTypes()},
Joe Tsaia95b29f2019-05-16 12:47:20 -07001458 inputMessage: &anypb.Any{},
Herbie Ong300cff02019-03-20 18:05:16 -07001459 inputText: `[SomeMessage]: {}`,
1460 wantErr: true,
Herbie Ong66c365c2019-01-04 14:08:41 -08001461 }, {
1462 desc: "Any expanded with invalid value",
Damien Neil5c5b5312019-05-14 12:44:37 -07001463 umo: prototext.UnmarshalOptions{
Joe Tsai0fc49f82019-05-01 12:29:25 -07001464 Resolver: preg.NewTypes(pimpl.Export{}.MessageTypeOf(&pb2.Nested{})),
Herbie Ong300cff02019-03-20 18:05:16 -07001465 },
Joe Tsaia95b29f2019-05-16 12:47:20 -07001466 inputMessage: &anypb.Any{},
Herbie Ong300cff02019-03-20 18:05:16 -07001467 inputText: `[pb2.Nested]: 123`,
1468 wantErr: true,
Herbie Ong66c365c2019-01-04 14:08:41 -08001469 }, {
1470 desc: "Any expanded with unknown fields",
Damien Neil5c5b5312019-05-14 12:44:37 -07001471 umo: prototext.UnmarshalOptions{
Joe Tsai0fc49f82019-05-01 12:29:25 -07001472 Resolver: preg.NewTypes(pimpl.Export{}.MessageTypeOf(&pb2.Nested{})),
Herbie Ong300cff02019-03-20 18:05:16 -07001473 },
Joe Tsaia95b29f2019-05-16 12:47:20 -07001474 inputMessage: &anypb.Any{},
Herbie Ong300cff02019-03-20 18:05:16 -07001475 inputText: `
Herbie Ong66c365c2019-01-04 14:08:41 -08001476[pb2.Nested]: {}
1477unknown: ""
Herbie Ong66c365c2019-01-04 14:08:41 -08001478`,
1479 wantErr: true,
1480 }, {
1481 desc: "Any contains expanded and unexpanded fields",
Damien Neil5c5b5312019-05-14 12:44:37 -07001482 umo: prototext.UnmarshalOptions{
Joe Tsai0fc49f82019-05-01 12:29:25 -07001483 Resolver: preg.NewTypes(pimpl.Export{}.MessageTypeOf(&pb2.Nested{})),
Herbie Ong300cff02019-03-20 18:05:16 -07001484 },
Joe Tsaia95b29f2019-05-16 12:47:20 -07001485 inputMessage: &anypb.Any{},
Herbie Ong300cff02019-03-20 18:05:16 -07001486 inputText: `
Herbie Ong66c365c2019-01-04 14:08:41 -08001487[pb2.Nested]: {}
1488type_url: "pb2.Nested"
Herbie Ong66c365c2019-01-04 14:08:41 -08001489`,
1490 wantErr: true,
Joe Tsaid47ea192019-07-09 22:38:15 -07001491 }, {
1492 desc: "weak fields",
1493 inputMessage: &testpb.TestWeak{},
1494 inputText: `weak_message1:{a:1}`,
1495 wantMessage: func() *testpb.TestWeak {
1496 m := new(testpb.TestWeak)
1497 m.SetWeakMessage1(&weakpb.WeakImportMessage1{A: proto.Int32(1)})
1498 return m
1499 }(),
1500 skip: !flags.Proto1Legacy,
1501 }, {
1502 desc: "weak fields; unknown field",
1503 inputMessage: &testpb.TestWeak{},
1504 inputText: `weak_message1:{a:1} weak_message2:{a:1}`,
1505 wantErr: true, // weak_message2 is unknown since the package containing it is not imported
1506 skip: !flags.Proto1Legacy,
Herbie Ong800c9902018-12-06 15:28:53 -08001507 }}
1508
1509 for _, tt := range tests {
1510 tt := tt
Joe Tsaid47ea192019-07-09 22:38:15 -07001511 if tt.skip {
1512 continue
1513 }
Herbie Ong800c9902018-12-06 15:28:53 -08001514 t.Run(tt.desc, func(t *testing.T) {
Joe Tsaicdb77732019-05-14 16:05:06 -07001515 err := tt.umo.Unmarshal([]byte(tt.inputText), tt.inputMessage)
Herbie Ong800c9902018-12-06 15:28:53 -08001516 if err != nil && !tt.wantErr {
1517 t.Errorf("Unmarshal() returned error: %v\n\n", err)
1518 }
1519 if err == nil && tt.wantErr {
1520 t.Error("Unmarshal() got nil error, want error\n\n")
1521 }
Joe Tsai8d30bbe2019-05-16 15:53:25 -07001522 if tt.wantMessage != nil && !proto.Equal(tt.inputMessage, tt.wantMessage) {
Herbie Ong800c9902018-12-06 15:28:53 -08001523 t.Errorf("Unmarshal()\n<got>\n%v\n<want>\n%v\n", tt.inputMessage, tt.wantMessage)
1524 }
1525 })
1526 }
1527}