blob: c9df3194422d3ced31e74b85ba90de7999ead7df [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 }, {
Joe Tsai8689fa52019-09-15 00:17:39 -0700178 desc: "proto2 message contains discarded unknown field",
179 umo: prototext.UnmarshalOptions{DiscardUnknown: true},
180 inputMessage: &pb2.Scalars{},
181 inputText: `unknown_field:123 1000:"hello"`,
182 }, {
183 desc: "proto3 message contains discarded unknown field",
184 umo: prototext.UnmarshalOptions{DiscardUnknown: true},
185 inputMessage: &pb3.Scalars{},
186 inputText: `unknown_field:456 1000:"goodbye"`,
187 }, {
188 desc: "proto2 message cannot parse field number",
189 umo: prototext.UnmarshalOptions{DiscardUnknown: true},
190 inputMessage: &pb2.Scalars{},
191 inputText: `13:"hello"`,
192 wantErr: true,
193 }, {
194 desc: "proto3 message cannot parse field number",
195 umo: prototext.UnmarshalOptions{DiscardUnknown: true},
196 inputMessage: &pb3.Scalars{},
197 inputText: `13:"goodbye"`,
198 wantErr: true,
199 }, {
Herbie Ong800c9902018-12-06 15:28:53 -0800200 desc: "proto2 numeric key field",
201 inputMessage: &pb2.Scalars{},
202 inputText: "1: true",
203 wantErr: true,
204 }, {
205 desc: "proto3 numeric key field",
206 inputMessage: &pb3.Scalars{},
207 inputText: "1: true",
208 wantErr: true,
209 }, {
210 desc: "invalid bool value",
211 inputMessage: &pb3.Scalars{},
212 inputText: "s_bool: 123",
213 wantErr: true,
214 }, {
215 desc: "invalid int32 value",
216 inputMessage: &pb3.Scalars{},
217 inputText: "s_int32: not_a_num",
218 wantErr: true,
219 }, {
220 desc: "invalid int64 value",
221 inputMessage: &pb3.Scalars{},
222 inputText: "s_int64: 'not a num either'",
223 wantErr: true,
224 }, {
225 desc: "invalid uint32 value",
226 inputMessage: &pb3.Scalars{},
227 inputText: "s_fixed32: -42",
228 wantErr: true,
229 }, {
230 desc: "invalid uint64 value",
231 inputMessage: &pb3.Scalars{},
232 inputText: "s_uint64: -47",
233 wantErr: true,
234 }, {
235 desc: "invalid sint32 value",
236 inputMessage: &pb3.Scalars{},
237 inputText: "s_sint32: '42'",
238 wantErr: true,
239 }, {
240 desc: "invalid sint64 value",
241 inputMessage: &pb3.Scalars{},
242 inputText: "s_sint64: '-47'",
243 wantErr: true,
244 }, {
245 desc: "invalid fixed32 value",
246 inputMessage: &pb3.Scalars{},
247 inputText: "s_fixed32: -42",
248 wantErr: true,
249 }, {
250 desc: "invalid fixed64 value",
251 inputMessage: &pb3.Scalars{},
252 inputText: "s_fixed64: -42",
253 wantErr: true,
254 }, {
255 desc: "invalid sfixed32 value",
256 inputMessage: &pb3.Scalars{},
257 inputText: "s_sfixed32: 'not valid'",
258 wantErr: true,
259 }, {
260 desc: "invalid sfixed64 value",
261 inputMessage: &pb3.Scalars{},
262 inputText: "s_sfixed64: bad",
263 wantErr: true,
264 }, {
Herbie Ong8170d692019-02-13 14:13:21 -0800265 desc: "float positive infinity",
Herbie Ong800c9902018-12-06 15:28:53 -0800266 inputMessage: &pb3.Scalars{},
267 inputText: "s_float: inf",
268 wantMessage: &pb3.Scalars{
269 SFloat: float32(math.Inf(1)),
270 },
271 }, {
Herbie Ong8170d692019-02-13 14:13:21 -0800272 desc: "float negative infinity",
Herbie Ong800c9902018-12-06 15:28:53 -0800273 inputMessage: &pb3.Scalars{},
274 inputText: "s_float: -inf",
275 wantMessage: &pb3.Scalars{
276 SFloat: float32(math.Inf(-1)),
277 },
278 }, {
Herbie Ong8170d692019-02-13 14:13:21 -0800279 desc: "double positive infinity",
Herbie Ong800c9902018-12-06 15:28:53 -0800280 inputMessage: &pb3.Scalars{},
281 inputText: "s_double: inf",
282 wantMessage: &pb3.Scalars{
283 SDouble: math.Inf(1),
284 },
285 }, {
Herbie Ong8170d692019-02-13 14:13:21 -0800286 desc: "double negative infinity",
Herbie Ong800c9902018-12-06 15:28:53 -0800287 inputMessage: &pb3.Scalars{},
288 inputText: "s_double: -inf",
289 wantMessage: &pb3.Scalars{
290 SDouble: math.Inf(-1),
291 },
292 }, {
293 desc: "invalid string value",
294 inputMessage: &pb3.Scalars{},
295 inputText: "s_string: invalid_string",
296 wantErr: true,
297 }, {
298 desc: "proto2 bytes set to empty string",
299 inputMessage: &pb2.Scalars{},
300 inputText: "opt_bytes: ''",
301 wantMessage: &pb2.Scalars{
302 OptBytes: []byte(""),
303 },
304 }, {
305 desc: "proto3 bytes set to empty string",
306 inputMessage: &pb3.Scalars{},
307 inputText: "s_bytes: ''",
308 wantMessage: &pb3.Scalars{},
309 }, {
310 desc: "proto2 duplicate singular field",
311 inputMessage: &pb2.Scalars{},
312 inputText: `
313opt_bool: true
314opt_bool: false
315`,
316 wantErr: true,
317 }, {
Herbie Ong800c9902018-12-06 15:28:53 -0800318 desc: "proto2 more duplicate singular field",
319 inputMessage: &pb2.Scalars{},
320 inputText: `
321opt_bool: true
322opt_string: "hello"
323opt_bool: false
324`,
325 wantErr: true,
326 }, {
Herbie Ong8170d692019-02-13 14:13:21 -0800327 desc: "proto2 invalid singular field",
328 inputMessage: &pb2.Scalars{},
329 inputText: `
330opt_bool: [true, false]
331`,
332 wantErr: true,
333 }, {
Herbie Ong800c9902018-12-06 15:28:53 -0800334 desc: "proto3 duplicate singular field",
335 inputMessage: &pb3.Scalars{},
336 inputText: `
337s_bool: false
338s_bool: true
339`,
340 wantErr: true,
341 }, {
342 desc: "proto3 more duplicate singular field",
343 inputMessage: &pb3.Scalars{},
344 inputText: `
345s_bool: false
346s_string: ""
347s_bool: true
348`,
349 wantErr: true,
350 }, {
351 desc: "proto2 enum",
352 inputMessage: &pb2.Enums{},
353 inputText: `
Herbie Ong8170d692019-02-13 14:13:21 -0800354opt_enum: ONE
Herbie Ong800c9902018-12-06 15:28:53 -0800355opt_nested_enum: UNO
356`,
357 wantMessage: &pb2.Enums{
Herbie Ong8170d692019-02-13 14:13:21 -0800358 OptEnum: pb2.Enum_ONE.Enum(),
Herbie Ong800c9902018-12-06 15:28:53 -0800359 OptNestedEnum: pb2.Enums_UNO.Enum(),
360 },
361 }, {
362 desc: "proto2 enum set to numeric values",
363 inputMessage: &pb2.Enums{},
364 inputText: `
Herbie Ong8170d692019-02-13 14:13:21 -0800365opt_enum: 2
Herbie Ong800c9902018-12-06 15:28:53 -0800366opt_nested_enum: 2
367`,
368 wantMessage: &pb2.Enums{
Herbie Ong8170d692019-02-13 14:13:21 -0800369 OptEnum: pb2.Enum_TWO.Enum(),
Herbie Ong800c9902018-12-06 15:28:53 -0800370 OptNestedEnum: pb2.Enums_DOS.Enum(),
371 },
372 }, {
373 desc: "proto2 enum set to unnamed numeric values",
374 inputMessage: &pb2.Enums{},
375 inputText: `
376opt_enum: 101
377opt_nested_enum: -101
378`,
379 wantMessage: &pb2.Enums{
Joe Tsai6dc168e2019-07-09 23:11:13 -0700380 OptEnum: pb2.Enum(101).Enum(),
381 OptNestedEnum: pb2.Enums_NestedEnum(-101).Enum(),
Herbie Ong800c9902018-12-06 15:28:53 -0800382 },
383 }, {
384 desc: "proto2 enum set to invalid named",
385 inputMessage: &pb2.Enums{},
386 inputText: `
Herbie Ong8170d692019-02-13 14:13:21 -0800387opt_enum: UNNAMED
Herbie Ong800c9902018-12-06 15:28:53 -0800388opt_nested_enum: UNNAMED_TOO
389`,
390 wantErr: true,
391 }, {
392 desc: "proto3 enum name value",
393 inputMessage: &pb3.Enums{},
394 inputText: `
395s_enum: ONE
396s_nested_enum: DIEZ
397`,
398 wantMessage: &pb3.Enums{
399 SEnum: pb3.Enum_ONE,
400 SNestedEnum: pb3.Enums_DIEZ,
401 },
402 }, {
403 desc: "proto3 enum numeric value",
404 inputMessage: &pb3.Enums{},
405 inputText: `
406s_enum: 2
Herbie Ong8170d692019-02-13 14:13:21 -0800407s_nested_enum: 2
Herbie Ong800c9902018-12-06 15:28:53 -0800408`,
409 wantMessage: &pb3.Enums{
410 SEnum: pb3.Enum_TWO,
Herbie Ong8170d692019-02-13 14:13:21 -0800411 SNestedEnum: pb3.Enums_DOS,
Herbie Ong800c9902018-12-06 15:28:53 -0800412 },
413 }, {
414 desc: "proto3 enum unnamed numeric value",
415 inputMessage: &pb3.Enums{},
416 inputText: `
417s_enum: 0x7fffffff
418s_nested_enum: -0x80000000
419`,
420 wantMessage: &pb3.Enums{
421 SEnum: 0x7fffffff,
422 SNestedEnum: -0x80000000,
423 },
424 }, {
425 desc: "proto2 nested empty messages",
426 inputMessage: &pb2.Nests{},
427 inputText: `
428opt_nested: {}
Herbie Ong0dcfb9a2019-01-14 15:32:26 -0800429OptGroup: {}
Herbie Ong800c9902018-12-06 15:28:53 -0800430`,
431 wantMessage: &pb2.Nests{
432 OptNested: &pb2.Nested{},
433 Optgroup: &pb2.Nests_OptGroup{},
434 },
435 }, {
Herbie Ong20aefe92019-06-24 19:21:46 -0700436 desc: "group field name",
437 inputMessage: &pb2.Nests{},
438 inputText: `optgroup: {}`,
439 wantErr: true,
440 }, {
Herbie Ong800c9902018-12-06 15:28:53 -0800441 desc: "proto2 nested messages",
442 inputMessage: &pb2.Nests{},
443 inputText: `
444opt_nested: {
445 opt_string: "nested message"
446 opt_nested: {
447 opt_string: "another nested message"
448 }
449}
450`,
451 wantMessage: &pb2.Nests{
452 OptNested: &pb2.Nested{
Damien Neila8a2cea2019-07-10 16:17:16 -0700453 OptString: proto.String("nested message"),
Herbie Ong800c9902018-12-06 15:28:53 -0800454 OptNested: &pb2.Nested{
Damien Neila8a2cea2019-07-10 16:17:16 -0700455 OptString: proto.String("another nested message"),
Herbie Ong800c9902018-12-06 15:28:53 -0800456 },
457 },
458 },
459 }, {
460 desc: "proto3 nested empty message",
461 inputMessage: &pb3.Nests{},
462 inputText: "s_nested: {}",
463 wantMessage: &pb3.Nests{
464 SNested: &pb3.Nested{},
465 },
466 }, {
467 desc: "proto3 nested message",
468 inputMessage: &pb3.Nests{},
469 inputText: `
470s_nested: {
471 s_string: "nested message"
472 s_nested: {
473 s_string: "another nested message"
474 }
475}
476`,
477 wantMessage: &pb3.Nests{
478 SNested: &pb3.Nested{
479 SString: "nested message",
480 SNested: &pb3.Nested{
481 SString: "another nested message",
482 },
483 },
484 },
485 }, {
Herbie Ong21a39742019-04-08 17:32:44 -0700486 desc: "proto3 nested message contains invalid UTF-8",
487 inputMessage: &pb3.Nests{},
488 inputText: `s_nested: {
489 s_string: "abc\xff"
490}
491`,
Herbie Ong21a39742019-04-08 17:32:44 -0700492 wantErr: true,
493 }, {
Herbie Ong8170d692019-02-13 14:13:21 -0800494 desc: "oneof set to empty string",
495 inputMessage: &pb3.Oneofs{},
496 inputText: "oneof_string: ''",
497 wantMessage: &pb3.Oneofs{
498 Union: &pb3.Oneofs_OneofString{},
Herbie Ong800c9902018-12-06 15:28:53 -0800499 },
500 }, {
Herbie Ong8170d692019-02-13 14:13:21 -0800501 desc: "oneof set to string",
502 inputMessage: &pb3.Oneofs{},
503 inputText: "oneof_string: 'hello'",
504 wantMessage: &pb3.Oneofs{
505 Union: &pb3.Oneofs_OneofString{
506 OneofString: "hello",
Herbie Ong800c9902018-12-06 15:28:53 -0800507 },
508 },
509 }, {
Herbie Ong8170d692019-02-13 14:13:21 -0800510 desc: "oneof set to enum",
511 inputMessage: &pb3.Oneofs{},
512 inputText: "oneof_enum: TEN",
513 wantMessage: &pb3.Oneofs{
514 Union: &pb3.Oneofs_OneofEnum{
515 OneofEnum: pb3.Enum_TEN,
Herbie Ong800c9902018-12-06 15:28:53 -0800516 },
517 },
518 }, {
Herbie Ong8170d692019-02-13 14:13:21 -0800519 desc: "oneof set to empty message",
520 inputMessage: &pb3.Oneofs{},
521 inputText: "oneof_nested: {}",
522 wantMessage: &pb3.Oneofs{
523 Union: &pb3.Oneofs_OneofNested{
524 OneofNested: &pb3.Nested{},
525 },
526 },
527 }, {
528 desc: "oneof set to message",
529 inputMessage: &pb3.Oneofs{},
Herbie Ong800c9902018-12-06 15:28:53 -0800530 inputText: `
Herbie Ong8170d692019-02-13 14:13:21 -0800531oneof_nested: {
532 s_string: "nested message"
Herbie Ong800c9902018-12-06 15:28:53 -0800533}
534`,
Herbie Ong8170d692019-02-13 14:13:21 -0800535 wantMessage: &pb3.Oneofs{
536 Union: &pb3.Oneofs_OneofNested{
537 OneofNested: &pb3.Nested{
538 SString: "nested message",
Herbie Ong800c9902018-12-06 15:28:53 -0800539 },
540 },
541 },
542 }, {
Herbie Ong8a1d4602019-04-02 20:19:36 -0700543 desc: "oneof set to more than one field",
Herbie Ong8170d692019-02-13 14:13:21 -0800544 inputMessage: &pb3.Oneofs{},
Herbie Ong6470ea62019-01-07 18:56:57 -0800545 inputText: `
Herbie Ong8a1d4602019-04-02 20:19:36 -0700546oneof_enum: ZERO
547oneof_string: "hello"
Herbie Ong6470ea62019-01-07 18:56:57 -0800548`,
Herbie Ong8a1d4602019-04-02 20:19:36 -0700549 wantErr: true,
Herbie Ong6470ea62019-01-07 18:56:57 -0800550 }, {
Herbie Ong800c9902018-12-06 15:28:53 -0800551 desc: "repeated scalar using same field name",
552 inputMessage: &pb2.Repeats{},
553 inputText: `
554rpt_string: "a"
555rpt_string: "b"
556rpt_int32: 0xff
557rpt_float: 1.23
558rpt_bytes: "bytes"
559`,
560 wantMessage: &pb2.Repeats{
561 RptString: []string{"a", "b"},
562 RptInt32: []int32{0xff},
563 RptFloat: []float32{1.23},
564 RptBytes: [][]byte{[]byte("bytes")},
565 },
566 }, {
567 desc: "repeated using mix of [] and repeated field name",
568 inputMessage: &pb2.Repeats{},
569 inputText: `
570rpt_string: "a"
571rpt_bool: true
572rpt_string: ["x", "y"]
573rpt_bool: [ false, true ]
574rpt_string: "b"
575`,
576 wantMessage: &pb2.Repeats{
577 RptString: []string{"a", "x", "y", "b"},
578 RptBool: []bool{true, false, true},
579 },
580 }, {
Herbie Ong21a39742019-04-08 17:32:44 -0700581 desc: "repeated contains invalid UTF-8",
582 inputMessage: &pb2.Repeats{},
583 inputText: `rpt_string: "abc\xff"`,
Damien Neil8c86fc52019-06-19 09:28:29 -0700584 wantErr: true,
Herbie Ong21a39742019-04-08 17:32:44 -0700585 }, {
Herbie Ong800c9902018-12-06 15:28:53 -0800586 desc: "repeated enums",
587 inputMessage: &pb2.Enums{},
588 inputText: `
Herbie Ong8170d692019-02-13 14:13:21 -0800589rpt_enum: TEN
Herbie Ong800c9902018-12-06 15:28:53 -0800590rpt_enum: 1
591rpt_nested_enum: [DOS, 2]
592rpt_enum: 42
593rpt_nested_enum: -47
594`,
595 wantMessage: &pb2.Enums{
Herbie Ong8170d692019-02-13 14:13:21 -0800596 RptEnum: []pb2.Enum{pb2.Enum_TEN, pb2.Enum_ONE, 42},
Herbie Ong800c9902018-12-06 15:28:53 -0800597 RptNestedEnum: []pb2.Enums_NestedEnum{pb2.Enums_DOS, pb2.Enums_DOS, -47},
598 },
599 }, {
600 desc: "repeated nested messages",
601 inputMessage: &pb2.Nests{},
602 inputText: `
603rpt_nested: {
604 opt_string: "repeat nested one"
605}
606rpt_nested: {
607 opt_string: "repeat nested two"
608 opt_nested: {
609 opt_string: "inside repeat nested two"
610 }
611}
612rpt_nested: {}
613`,
614 wantMessage: &pb2.Nests{
615 RptNested: []*pb2.Nested{
616 {
Damien Neila8a2cea2019-07-10 16:17:16 -0700617 OptString: proto.String("repeat nested one"),
Herbie Ong800c9902018-12-06 15:28:53 -0800618 },
619 {
Damien Neila8a2cea2019-07-10 16:17:16 -0700620 OptString: proto.String("repeat nested two"),
Herbie Ong800c9902018-12-06 15:28:53 -0800621 OptNested: &pb2.Nested{
Damien Neila8a2cea2019-07-10 16:17:16 -0700622 OptString: proto.String("inside repeat nested two"),
Herbie Ong800c9902018-12-06 15:28:53 -0800623 },
624 },
625 {},
626 },
627 },
628 }, {
629 desc: "repeated group fields",
630 inputMessage: &pb2.Nests{},
631 inputText: `
Herbie Ong0dcfb9a2019-01-14 15:32:26 -0800632RptGroup: {
Herbie Ong8170d692019-02-13 14:13:21 -0800633 rpt_string: "hello"
634 rpt_string: "world"
Herbie Ong800c9902018-12-06 15:28:53 -0800635}
Herbie Ong0dcfb9a2019-01-14 15:32:26 -0800636RptGroup: {}
Herbie Ong800c9902018-12-06 15:28:53 -0800637`,
638 wantMessage: &pb2.Nests{
639 Rptgroup: []*pb2.Nests_RptGroup{
640 {
Herbie Ong8170d692019-02-13 14:13:21 -0800641 RptString: []string{"hello", "world"},
Herbie Ong800c9902018-12-06 15:28:53 -0800642 },
643 {},
644 },
645 },
646 }, {
647 desc: "map fields 1",
Herbie Ong8170d692019-02-13 14:13:21 -0800648 inputMessage: &pb3.Maps{},
Herbie Ong800c9902018-12-06 15:28:53 -0800649 inputText: `
650int32_to_str: {
651 key: -101
652 value: "-101"
653}
654int32_to_str: {
655 key: 0
656 value: "zero"
657}
Herbie Ong8170d692019-02-13 14:13:21 -0800658bool_to_uint32: {
659 key: false
660 value: 101
Herbie Ong800c9902018-12-06 15:28:53 -0800661}
662int32_to_str: {
663 key: 255
664 value: "0xff"
665}
666bool_to_uint32: {
Herbie Ong800c9902018-12-06 15:28:53 -0800667 key: true
668 value: 42
669}
670`,
Herbie Ong8170d692019-02-13 14:13:21 -0800671 wantMessage: &pb3.Maps{
Herbie Ong800c9902018-12-06 15:28:53 -0800672 Int32ToStr: map[int32]string{
673 -101: "-101",
674 0xff: "0xff",
675 0: "zero",
676 },
Herbie Ong800c9902018-12-06 15:28:53 -0800677 BoolToUint32: map[bool]uint32{
678 true: 42,
679 false: 101,
680 },
681 },
682 }, {
683 desc: "map fields 2",
Herbie Ong8170d692019-02-13 14:13:21 -0800684 inputMessage: &pb3.Maps{},
Herbie Ong800c9902018-12-06 15:28:53 -0800685 inputText: `
686uint64_to_enum: {
687 key: 1
Herbie Ong8170d692019-02-13 14:13:21 -0800688 value: ONE
Herbie Ong800c9902018-12-06 15:28:53 -0800689}
690uint64_to_enum: {
691 key: 2
Herbie Ong8170d692019-02-13 14:13:21 -0800692 value: 2
Herbie Ong800c9902018-12-06 15:28:53 -0800693}
694uint64_to_enum: {
695 key: 10
Herbie Ong8170d692019-02-13 14:13:21 -0800696 value: 101
Herbie Ong800c9902018-12-06 15:28:53 -0800697}
698`,
Herbie Ong8170d692019-02-13 14:13:21 -0800699 wantMessage: &pb3.Maps{
700 Uint64ToEnum: map[uint64]pb3.Enum{
701 1: pb3.Enum_ONE,
702 2: pb3.Enum_TWO,
703 10: 101,
Herbie Ong800c9902018-12-06 15:28:53 -0800704 },
705 },
706 }, {
707 desc: "map fields 3",
Herbie Ong8170d692019-02-13 14:13:21 -0800708 inputMessage: &pb3.Maps{},
Herbie Ong800c9902018-12-06 15:28:53 -0800709 inputText: `
710str_to_nested: {
711 key: "nested_one"
712 value: {
Herbie Ong8170d692019-02-13 14:13:21 -0800713 s_string: "nested in a map"
Herbie Ong800c9902018-12-06 15:28:53 -0800714 }
715}
716`,
Herbie Ong8170d692019-02-13 14:13:21 -0800717 wantMessage: &pb3.Maps{
718 StrToNested: map[string]*pb3.Nested{
719 "nested_one": &pb3.Nested{
720 SString: "nested in a map",
Herbie Ong800c9902018-12-06 15:28:53 -0800721 },
722 },
723 },
724 }, {
725 desc: "map fields 4",
Herbie Ong8170d692019-02-13 14:13:21 -0800726 inputMessage: &pb3.Maps{},
Herbie Ong800c9902018-12-06 15:28:53 -0800727 inputText: `
728str_to_oneofs: {
729 key: "nested"
730 value: {
Herbie Ong8170d692019-02-13 14:13:21 -0800731 oneof_nested: {
732 s_string: "nested oneof in map field value"
Herbie Ong800c9902018-12-06 15:28:53 -0800733 }
734 }
735}
736str_to_oneofs: {
737 key: "string"
738 value: {
Herbie Ong8170d692019-02-13 14:13:21 -0800739 oneof_string: "hello"
Herbie Ong800c9902018-12-06 15:28:53 -0800740 }
741}
742`,
Herbie Ong8170d692019-02-13 14:13:21 -0800743 wantMessage: &pb3.Maps{
744 StrToOneofs: map[string]*pb3.Oneofs{
745 "string": &pb3.Oneofs{
746 Union: &pb3.Oneofs_OneofString{
747 OneofString: "hello",
Herbie Ong800c9902018-12-06 15:28:53 -0800748 },
749 },
Herbie Ong8170d692019-02-13 14:13:21 -0800750 "nested": &pb3.Oneofs{
751 Union: &pb3.Oneofs_OneofNested{
752 OneofNested: &pb3.Nested{
753 SString: "nested oneof in map field value",
Herbie Ong800c9902018-12-06 15:28:53 -0800754 },
755 },
756 },
757 },
758 },
759 }, {
760 desc: "map contains duplicate keys",
Herbie Ong8170d692019-02-13 14:13:21 -0800761 inputMessage: &pb3.Maps{},
Herbie Ong800c9902018-12-06 15:28:53 -0800762 inputText: `
763int32_to_str: {
764 key: 0
765 value: "cero"
766}
767int32_to_str: {
768 key: 0
769 value: "zero"
770}
771`,
Herbie Ong8170d692019-02-13 14:13:21 -0800772 wantMessage: &pb3.Maps{
Herbie Ong800c9902018-12-06 15:28:53 -0800773 Int32ToStr: map[int32]string{
774 0: "zero",
775 },
776 },
777 }, {
778 desc: "map contains duplicate key fields",
Herbie Ong8170d692019-02-13 14:13:21 -0800779 inputMessage: &pb3.Maps{},
Herbie Ong800c9902018-12-06 15:28:53 -0800780 inputText: `
781int32_to_str: {
782 key: 0
783 key: 1
784 value: "cero"
785}
786`,
787 wantErr: true,
788 }, {
789 desc: "map contains duplicate value fields",
Herbie Ong8170d692019-02-13 14:13:21 -0800790 inputMessage: &pb3.Maps{},
Herbie Ong800c9902018-12-06 15:28:53 -0800791 inputText: `
792int32_to_str: {
793 key: 1
794 value: "cero"
795 value: "uno"
796}
797`,
798 wantErr: true,
799 }, {
800 desc: "map contains missing key",
Herbie Ong8170d692019-02-13 14:13:21 -0800801 inputMessage: &pb3.Maps{},
Herbie Ong800c9902018-12-06 15:28:53 -0800802 inputText: `
803int32_to_str: {
804 value: "zero"
805}
Herbie Ong8170d692019-02-13 14:13:21 -0800806bool_to_uint32: {
807 value: 47
808}
809str_to_nested: {
810 value: {}
811}
Herbie Ong800c9902018-12-06 15:28:53 -0800812`,
Herbie Ong8170d692019-02-13 14:13:21 -0800813 wantMessage: &pb3.Maps{
Herbie Ong800c9902018-12-06 15:28:53 -0800814 Int32ToStr: map[int32]string{
815 0: "zero",
816 },
Herbie Ong8170d692019-02-13 14:13:21 -0800817 BoolToUint32: map[bool]uint32{
818 false: 47,
819 },
820 StrToNested: map[string]*pb3.Nested{
821 "": {},
822 },
Herbie Ong800c9902018-12-06 15:28:53 -0800823 },
824 }, {
825 desc: "map contains missing value",
Herbie Ong8170d692019-02-13 14:13:21 -0800826 inputMessage: &pb3.Maps{},
Herbie Ong800c9902018-12-06 15:28:53 -0800827 inputText: `
828int32_to_str: {
829 key: 100
830}
Herbie Ong8170d692019-02-13 14:13:21 -0800831bool_to_uint32: {
832 key: true
833}
834uint64_to_enum: {
835 key: 101
836}
837str_to_nested: {
838 key: "hello"
839}
Herbie Ong800c9902018-12-06 15:28:53 -0800840`,
Herbie Ong8170d692019-02-13 14:13:21 -0800841 wantMessage: &pb3.Maps{
Herbie Ong800c9902018-12-06 15:28:53 -0800842 Int32ToStr: map[int32]string{
843 100: "",
844 },
Herbie Ong8170d692019-02-13 14:13:21 -0800845 BoolToUint32: map[bool]uint32{
846 true: 0,
847 },
848 Uint64ToEnum: map[uint64]pb3.Enum{
849 101: pb3.Enum_ZERO,
850 },
851 StrToNested: map[string]*pb3.Nested{
852 "hello": {},
853 },
Herbie Ong800c9902018-12-06 15:28:53 -0800854 },
855 }, {
856 desc: "map contains missing key and value",
Herbie Ong8170d692019-02-13 14:13:21 -0800857 inputMessage: &pb3.Maps{},
Herbie Ong800c9902018-12-06 15:28:53 -0800858 inputText: `
859int32_to_str: {}
Herbie Ong8170d692019-02-13 14:13:21 -0800860bool_to_uint32: {}
861uint64_to_enum: {}
862str_to_nested: {}
Herbie Ong800c9902018-12-06 15:28:53 -0800863`,
Herbie Ong8170d692019-02-13 14:13:21 -0800864 wantMessage: &pb3.Maps{
865 Int32ToStr: map[int32]string{
866 0: "",
867 },
868 BoolToUint32: map[bool]uint32{
869 false: 0,
870 },
871 Uint64ToEnum: map[uint64]pb3.Enum{
872 0: pb3.Enum_ZERO,
873 },
874 StrToNested: map[string]*pb3.Nested{
875 "": {},
876 },
877 },
878 }, {
879 desc: "map contains overriding entries",
880 inputMessage: &pb3.Maps{},
881 inputText: `
882int32_to_str: {
883 key: 0
884}
885int32_to_str: {
886 value: "empty"
887}
888int32_to_str: {}
889`,
890 wantMessage: &pb3.Maps{
Herbie Ong800c9902018-12-06 15:28:53 -0800891 Int32ToStr: map[int32]string{
892 0: "",
893 },
894 },
895 }, {
Herbie Ong21a39742019-04-08 17:32:44 -0700896 desc: "map field value contains invalid UTF-8",
897 inputMessage: &pb3.Maps{},
898 inputText: `int32_to_str: {
899 key: 101
900 value: "abc\xff"
901}
902`,
Herbie Ong21a39742019-04-08 17:32:44 -0700903 wantErr: true,
904 }, {
905 desc: "map field key contains invalid UTF-8",
906 inputMessage: &pb3.Maps{},
907 inputText: `str_to_nested: {
908 key: "abc\xff"
909 value: {}
910}
911`,
Herbie Ong21a39742019-04-08 17:32:44 -0700912 wantErr: true,
913 }, {
Herbie Ong800c9902018-12-06 15:28:53 -0800914 desc: "map contains unknown field",
Herbie Ong8170d692019-02-13 14:13:21 -0800915 inputMessage: &pb3.Maps{},
Herbie Ong800c9902018-12-06 15:28:53 -0800916 inputText: `
917int32_to_str: {
918 key: 0
919 value: "cero"
920 unknown: "bad"
921}
922`,
923 wantErr: true,
924 }, {
925 desc: "map contains extension-like key field",
Herbie Ong8170d692019-02-13 14:13:21 -0800926 inputMessage: &pb3.Maps{},
Herbie Ong800c9902018-12-06 15:28:53 -0800927 inputText: `
928int32_to_str: {
929 [key]: 10
930 value: "ten"
931}
932`,
933 wantErr: true,
934 }, {
935 desc: "map contains invalid key",
Herbie Ong8170d692019-02-13 14:13:21 -0800936 inputMessage: &pb3.Maps{},
Herbie Ong800c9902018-12-06 15:28:53 -0800937 inputText: `
938int32_to_str: {
939 key: "invalid"
940 value: "cero"
941}
942`,
943 wantErr: true,
944 }, {
945 desc: "map contains invalid value",
Herbie Ong8170d692019-02-13 14:13:21 -0800946 inputMessage: &pb3.Maps{},
Herbie Ong800c9902018-12-06 15:28:53 -0800947 inputText: `
948int32_to_str: {
949 key: 100
950 value: 101
951}
952`,
953 wantErr: true,
954 }, {
955 desc: "map using mix of [] and repeated",
Herbie Ong8170d692019-02-13 14:13:21 -0800956 inputMessage: &pb3.Maps{},
Herbie Ong800c9902018-12-06 15:28:53 -0800957 inputText: `
958int32_to_str: {
959 key: 1
960 value: "one"
961}
962int32_to_str: [
963 {
964 key: 2
965 value: "not this"
966 },
967 {
968 },
969 {
970 key: 3
971 value: "three"
972 }
973]
974int32_to_str: {
975 key: 2
976 value: "two"
977}
978`,
Herbie Ong8170d692019-02-13 14:13:21 -0800979 wantMessage: &pb3.Maps{
Herbie Ong800c9902018-12-06 15:28:53 -0800980 Int32ToStr: map[int32]string{
981 0: "",
982 1: "one",
983 2: "two",
984 3: "three",
985 },
986 },
987 }, {
Herbie Ong42577ea2019-03-26 16:26:22 -0700988 desc: "required fields not set",
Herbie Ong800c9902018-12-06 15:28:53 -0800989 inputMessage: &pb2.Requireds{},
990 wantErr: true,
991 }, {
Herbie Ong42577ea2019-03-26 16:26:22 -0700992 desc: "required field set",
Herbie Ong800c9902018-12-06 15:28:53 -0800993 inputMessage: &pb2.PartialRequired{},
994 inputText: "req_string: 'this is required'",
995 wantMessage: &pb2.PartialRequired{
Damien Neila8a2cea2019-07-10 16:17:16 -0700996 ReqString: proto.String("this is required"),
Herbie Ong800c9902018-12-06 15:28:53 -0800997 },
998 }, {
Herbie Ong42577ea2019-03-26 16:26:22 -0700999 desc: "required fields partially set",
Herbie Ong800c9902018-12-06 15:28:53 -08001000 inputMessage: &pb2.Requireds{},
1001 inputText: `
1002req_bool: false
Herbie Ong800c9902018-12-06 15:28:53 -08001003req_sfixed64: 3203386110
1004req_string: "hello"
Herbie Ong8170d692019-02-13 14:13:21 -08001005req_enum: ONE
Herbie Ong800c9902018-12-06 15:28:53 -08001006`,
1007 wantMessage: &pb2.Requireds{
Damien Neila8a2cea2019-07-10 16:17:16 -07001008 ReqBool: proto.Bool(false),
1009 ReqSfixed64: proto.Int64(0xbeefcafe),
1010 ReqString: proto.String("hello"),
Herbie Ong8170d692019-02-13 14:13:21 -08001011 ReqEnum: pb2.Enum_ONE.Enum(),
Herbie Ong800c9902018-12-06 15:28:53 -08001012 },
1013 wantErr: true,
1014 }, {
Herbie Ong42577ea2019-03-26 16:26:22 -07001015 desc: "required fields partially set with AllowPartial",
Damien Neil5c5b5312019-05-14 12:44:37 -07001016 umo: prototext.UnmarshalOptions{AllowPartial: true},
Herbie Ong42577ea2019-03-26 16:26:22 -07001017 inputMessage: &pb2.Requireds{},
1018 inputText: `
1019req_bool: false
1020req_sfixed64: 3203386110
1021req_string: "hello"
1022req_enum: ONE
1023`,
1024 wantMessage: &pb2.Requireds{
Damien Neila8a2cea2019-07-10 16:17:16 -07001025 ReqBool: proto.Bool(false),
1026 ReqSfixed64: proto.Int64(0xbeefcafe),
1027 ReqString: proto.String("hello"),
Herbie Ong42577ea2019-03-26 16:26:22 -07001028 ReqEnum: pb2.Enum_ONE.Enum(),
1029 },
1030 }, {
1031 desc: "required fields all set",
Herbie Ong800c9902018-12-06 15:28:53 -08001032 inputMessage: &pb2.Requireds{},
1033 inputText: `
1034req_bool: false
Herbie Ong800c9902018-12-06 15:28:53 -08001035req_sfixed64: 0
Herbie Ong800c9902018-12-06 15:28:53 -08001036req_double: 0
1037req_string: ""
Herbie Ong8170d692019-02-13 14:13:21 -08001038req_enum: ONE
Herbie Ong800c9902018-12-06 15:28:53 -08001039req_nested: {}
1040`,
1041 wantMessage: &pb2.Requireds{
Damien Neila8a2cea2019-07-10 16:17:16 -07001042 ReqBool: proto.Bool(false),
1043 ReqSfixed64: proto.Int64(0),
1044 ReqDouble: proto.Float64(0),
1045 ReqString: proto.String(""),
Herbie Ong8170d692019-02-13 14:13:21 -08001046 ReqEnum: pb2.Enum_ONE.Enum(),
Herbie Ong800c9902018-12-06 15:28:53 -08001047 ReqNested: &pb2.Nested{},
1048 },
1049 }, {
1050 desc: "indirect required field",
1051 inputMessage: &pb2.IndirectRequired{},
1052 inputText: "opt_nested: {}",
1053 wantMessage: &pb2.IndirectRequired{
1054 OptNested: &pb2.NestedWithRequired{},
1055 },
1056 wantErr: true,
1057 }, {
Herbie Ong42577ea2019-03-26 16:26:22 -07001058 desc: "indirect required field with AllowPartial",
Damien Neil5c5b5312019-05-14 12:44:37 -07001059 umo: prototext.UnmarshalOptions{AllowPartial: true},
Herbie Ong42577ea2019-03-26 16:26:22 -07001060 inputMessage: &pb2.IndirectRequired{},
1061 inputText: "opt_nested: {}",
1062 wantMessage: &pb2.IndirectRequired{
1063 OptNested: &pb2.NestedWithRequired{},
1064 },
1065 }, {
Herbie Ong800c9902018-12-06 15:28:53 -08001066 desc: "indirect required field in repeated",
1067 inputMessage: &pb2.IndirectRequired{},
1068 inputText: `
1069rpt_nested: {
1070 req_string: "one"
1071}
1072rpt_nested: {}
Herbie Ong800c9902018-12-06 15:28:53 -08001073`,
1074 wantMessage: &pb2.IndirectRequired{
1075 RptNested: []*pb2.NestedWithRequired{
1076 {
Damien Neila8a2cea2019-07-10 16:17:16 -07001077 ReqString: proto.String("one"),
Herbie Ong800c9902018-12-06 15:28:53 -08001078 },
1079 {},
Herbie Ong800c9902018-12-06 15:28:53 -08001080 },
1081 },
1082 wantErr: true,
1083 }, {
Herbie Ong42577ea2019-03-26 16:26:22 -07001084 desc: "indirect required field in repeated with AllowPartial",
Damien Neil5c5b5312019-05-14 12:44:37 -07001085 umo: prototext.UnmarshalOptions{AllowPartial: true},
Herbie Ong42577ea2019-03-26 16:26:22 -07001086 inputMessage: &pb2.IndirectRequired{},
1087 inputText: `
1088rpt_nested: {
1089 req_string: "one"
1090}
1091rpt_nested: {}
1092`,
1093 wantMessage: &pb2.IndirectRequired{
1094 RptNested: []*pb2.NestedWithRequired{
1095 {
Damien Neila8a2cea2019-07-10 16:17:16 -07001096 ReqString: proto.String("one"),
Herbie Ong42577ea2019-03-26 16:26:22 -07001097 },
1098 {},
1099 },
1100 },
1101 }, {
Herbie Ong800c9902018-12-06 15:28:53 -08001102 desc: "indirect required field in map",
1103 inputMessage: &pb2.IndirectRequired{},
1104 inputText: `
1105str_to_nested: {
1106 key: "missing"
1107}
1108str_to_nested: {
1109 key: "contains"
1110 value: {
1111 req_string: "here"
1112 }
1113}
1114`,
1115 wantMessage: &pb2.IndirectRequired{
1116 StrToNested: map[string]*pb2.NestedWithRequired{
1117 "missing": &pb2.NestedWithRequired{},
1118 "contains": &pb2.NestedWithRequired{
Damien Neila8a2cea2019-07-10 16:17:16 -07001119 ReqString: proto.String("here"),
Herbie Ong800c9902018-12-06 15:28:53 -08001120 },
1121 },
1122 },
1123 wantErr: true,
Herbie Ong7c624e22018-12-13 14:41:22 -08001124 }, {
Herbie Ong42577ea2019-03-26 16:26:22 -07001125 desc: "indirect required field in map with AllowPartial",
Damien Neil5c5b5312019-05-14 12:44:37 -07001126 umo: prototext.UnmarshalOptions{AllowPartial: true},
Herbie Ong42577ea2019-03-26 16:26:22 -07001127 inputMessage: &pb2.IndirectRequired{},
1128 inputText: `
1129str_to_nested: {
1130 key: "missing"
1131}
1132str_to_nested: {
1133 key: "contains"
1134 value: {
1135 req_string: "here"
1136 }
1137}
1138`,
1139 wantMessage: &pb2.IndirectRequired{
1140 StrToNested: map[string]*pb2.NestedWithRequired{
1141 "missing": &pb2.NestedWithRequired{},
1142 "contains": &pb2.NestedWithRequired{
Damien Neila8a2cea2019-07-10 16:17:16 -07001143 ReqString: proto.String("here"),
Herbie Ong42577ea2019-03-26 16:26:22 -07001144 },
1145 },
1146 },
1147 }, {
Herbie Ong8170d692019-02-13 14:13:21 -08001148 desc: "indirect required field in oneof",
1149 inputMessage: &pb2.IndirectRequired{},
1150 inputText: `oneof_nested: {}
1151`,
1152 wantMessage: &pb2.IndirectRequired{
1153 Union: &pb2.IndirectRequired_OneofNested{
1154 OneofNested: &pb2.NestedWithRequired{},
1155 },
1156 },
1157 wantErr: true,
1158 }, {
Herbie Ong42577ea2019-03-26 16:26:22 -07001159 desc: "indirect required field in oneof with AllowPartial",
Damien Neil5c5b5312019-05-14 12:44:37 -07001160 umo: prototext.UnmarshalOptions{AllowPartial: true},
Herbie Ong42577ea2019-03-26 16:26:22 -07001161 inputMessage: &pb2.IndirectRequired{},
1162 inputText: `oneof_nested: {}
1163`,
1164 wantMessage: &pb2.IndirectRequired{
1165 Union: &pb2.IndirectRequired_OneofNested{
1166 OneofNested: &pb2.NestedWithRequired{},
1167 },
1168 },
1169 }, {
Herbie Ong7c624e22018-12-13 14:41:22 -08001170 desc: "ignore reserved field",
1171 inputMessage: &pb2.Nests{},
1172 inputText: "reserved_field: 'ignore this'",
1173 wantMessage: &pb2.Nests{},
Herbie Ongc525c972018-12-18 18:04:31 -08001174 }, {
1175 desc: "extensions of non-repeated fields",
1176 inputMessage: &pb2.Extensions{},
1177 inputText: `opt_string: "non-extension field"
1178[pb2.opt_ext_bool]: true
1179opt_bool: true
1180[pb2.opt_ext_nested]: {
1181 opt_string: "nested in an extension"
1182 opt_nested: {
1183 opt_string: "another nested in an extension"
1184 }
1185}
1186[pb2.opt_ext_string]: "extension field"
1187opt_int32: 42
Herbie Ong8170d692019-02-13 14:13:21 -08001188[pb2.opt_ext_enum]: TEN
Herbie Ongc525c972018-12-18 18:04:31 -08001189`,
1190 wantMessage: func() proto.Message {
1191 m := &pb2.Extensions{
Damien Neila8a2cea2019-07-10 16:17:16 -07001192 OptString: proto.String("non-extension field"),
1193 OptBool: proto.Bool(true),
1194 OptInt32: proto.Int32(42),
Herbie Ongc525c972018-12-18 18:04:31 -08001195 }
Damien Neil92f76182019-08-02 16:58:08 -07001196 proto.SetExtension(m, pb2.E_OptExtBool, true)
1197 proto.SetExtension(m, pb2.E_OptExtString, "extension field")
1198 proto.SetExtension(m, pb2.E_OptExtEnum, pb2.Enum_TEN)
1199 proto.SetExtension(m, pb2.E_OptExtNested, &pb2.Nested{
Damien Neila8a2cea2019-07-10 16:17:16 -07001200 OptString: proto.String("nested in an extension"),
Herbie Ongc525c972018-12-18 18:04:31 -08001201 OptNested: &pb2.Nested{
Damien Neila8a2cea2019-07-10 16:17:16 -07001202 OptString: proto.String("another nested in an extension"),
Herbie Ongc525c972018-12-18 18:04:31 -08001203 },
1204 })
1205 return m
1206 }(),
1207 }, {
Herbie Ong21a39742019-04-08 17:32:44 -07001208 desc: "extension field contains invalid UTF-8",
1209 inputMessage: &pb2.Extensions{},
1210 inputText: `[pb2.opt_ext_string]: "abc\xff"`,
Damien Neil8c86fc52019-06-19 09:28:29 -07001211 wantErr: true,
Herbie Ong21a39742019-04-08 17:32:44 -07001212 }, {
Herbie Ongc525c972018-12-18 18:04:31 -08001213 desc: "extensions of repeated fields",
1214 inputMessage: &pb2.Extensions{},
Herbie Ong8170d692019-02-13 14:13:21 -08001215 inputText: `[pb2.rpt_ext_enum]: TEN
Herbie Ongc525c972018-12-18 18:04:31 -08001216[pb2.rpt_ext_enum]: 101
1217[pb2.rpt_ext_fixed32]: 42
Herbie Ong8170d692019-02-13 14:13:21 -08001218[pb2.rpt_ext_enum]: ONE
Herbie Ongc525c972018-12-18 18:04:31 -08001219[pb2.rpt_ext_nested]: {
1220 opt_string: "one"
1221}
1222[pb2.rpt_ext_nested]: {
1223 opt_string: "two"
1224}
1225[pb2.rpt_ext_fixed32]: 47
1226[pb2.rpt_ext_nested]: {
1227 opt_string: "three"
1228}
1229`,
1230 wantMessage: func() proto.Message {
1231 m := &pb2.Extensions{}
Damien Neil293dc762019-08-29 11:42:57 -07001232 proto.SetExtension(m, pb2.E_RptExtEnum, []pb2.Enum{pb2.Enum_TEN, 101, pb2.Enum_ONE})
1233 proto.SetExtension(m, pb2.E_RptExtFixed32, []uint32{42, 47})
1234 proto.SetExtension(m, pb2.E_RptExtNested, []*pb2.Nested{
Damien Neila8a2cea2019-07-10 16:17:16 -07001235 &pb2.Nested{OptString: proto.String("one")},
1236 &pb2.Nested{OptString: proto.String("two")},
1237 &pb2.Nested{OptString: proto.String("three")},
Herbie Ongc525c972018-12-18 18:04:31 -08001238 })
1239 return m
1240 }(),
1241 }, {
1242 desc: "extensions of non-repeated fields in another message",
1243 inputMessage: &pb2.Extensions{},
1244 inputText: `[pb2.ExtensionsContainer.opt_ext_bool]: true
Herbie Ong8170d692019-02-13 14:13:21 -08001245[pb2.ExtensionsContainer.opt_ext_enum]: TEN
Herbie Ongc525c972018-12-18 18:04:31 -08001246[pb2.ExtensionsContainer.opt_ext_nested]: {
1247 opt_string: "nested in an extension"
1248 opt_nested: {
1249 opt_string: "another nested in an extension"
1250 }
1251}
1252[pb2.ExtensionsContainer.opt_ext_string]: "extension field"
1253`,
1254 wantMessage: func() proto.Message {
1255 m := &pb2.Extensions{}
Damien Neil92f76182019-08-02 16:58:08 -07001256 proto.SetExtension(m, pb2.E_ExtensionsContainer_OptExtBool, true)
1257 proto.SetExtension(m, pb2.E_ExtensionsContainer_OptExtString, "extension field")
1258 proto.SetExtension(m, pb2.E_ExtensionsContainer_OptExtEnum, pb2.Enum_TEN)
1259 proto.SetExtension(m, pb2.E_ExtensionsContainer_OptExtNested, &pb2.Nested{
Damien Neila8a2cea2019-07-10 16:17:16 -07001260 OptString: proto.String("nested in an extension"),
Herbie Ongc525c972018-12-18 18:04:31 -08001261 OptNested: &pb2.Nested{
Damien Neila8a2cea2019-07-10 16:17:16 -07001262 OptString: proto.String("another nested in an extension"),
Herbie Ongc525c972018-12-18 18:04:31 -08001263 },
1264 })
1265 return m
1266 }(),
1267 }, {
1268 desc: "extensions of repeated fields in another message",
1269 inputMessage: &pb2.Extensions{},
1270 inputText: `opt_string: "non-extension field"
1271opt_bool: true
1272opt_int32: 42
1273[pb2.ExtensionsContainer.rpt_ext_nested]: {
1274 opt_string: "one"
1275}
Herbie Ong8170d692019-02-13 14:13:21 -08001276[pb2.ExtensionsContainer.rpt_ext_enum]: TEN
Herbie Ongc525c972018-12-18 18:04:31 -08001277[pb2.ExtensionsContainer.rpt_ext_nested]: {
1278 opt_string: "two"
1279}
1280[pb2.ExtensionsContainer.rpt_ext_enum]: 101
1281[pb2.ExtensionsContainer.rpt_ext_string]: "hello"
Herbie Ong8170d692019-02-13 14:13:21 -08001282[pb2.ExtensionsContainer.rpt_ext_enum]: ONE
Herbie Ongc525c972018-12-18 18:04:31 -08001283[pb2.ExtensionsContainer.rpt_ext_nested]: {
1284 opt_string: "three"
1285}
1286[pb2.ExtensionsContainer.rpt_ext_string]: "world"
1287`,
1288 wantMessage: func() proto.Message {
1289 m := &pb2.Extensions{
Damien Neila8a2cea2019-07-10 16:17:16 -07001290 OptString: proto.String("non-extension field"),
1291 OptBool: proto.Bool(true),
1292 OptInt32: proto.Int32(42),
Herbie Ongc525c972018-12-18 18:04:31 -08001293 }
Damien Neil293dc762019-08-29 11:42:57 -07001294 proto.SetExtension(m, pb2.E_ExtensionsContainer_RptExtEnum, []pb2.Enum{pb2.Enum_TEN, 101, pb2.Enum_ONE})
1295 proto.SetExtension(m, pb2.E_ExtensionsContainer_RptExtString, []string{"hello", "world"})
1296 proto.SetExtension(m, pb2.E_ExtensionsContainer_RptExtNested, []*pb2.Nested{
Damien Neila8a2cea2019-07-10 16:17:16 -07001297 &pb2.Nested{OptString: proto.String("one")},
1298 &pb2.Nested{OptString: proto.String("two")},
1299 &pb2.Nested{OptString: proto.String("three")},
Herbie Ongc525c972018-12-18 18:04:31 -08001300 })
1301 return m
1302 }(),
1303 }, {
1304 desc: "invalid extension field name",
1305 inputMessage: &pb2.Extensions{},
1306 inputText: "[pb2.invalid_message_field]: true",
1307 wantErr: true,
Herbie Ong66c365c2019-01-04 14:08:41 -08001308 }, {
Herbie Ong6470ea62019-01-07 18:56:57 -08001309 desc: "MessageSet",
1310 inputMessage: &pb2.MessageSet{},
1311 inputText: `
1312[pb2.MessageSetExtension]: {
1313 opt_string: "a messageset extension"
1314}
1315[pb2.MessageSetExtension.ext_nested]: {
1316 opt_string: "just a regular extension"
1317}
1318[pb2.MessageSetExtension.not_message_set_extension]: {
1319 opt_string: "not a messageset extension"
1320}
1321`,
1322 wantMessage: func() proto.Message {
1323 m := &pb2.MessageSet{}
Damien Neil92f76182019-08-02 16:58:08 -07001324 proto.SetExtension(m, pb2.E_MessageSetExtension_MessageSetExtension, &pb2.MessageSetExtension{
Damien Neila8a2cea2019-07-10 16:17:16 -07001325 OptString: proto.String("a messageset extension"),
Herbie Ong6470ea62019-01-07 18:56:57 -08001326 })
Damien Neil92f76182019-08-02 16:58:08 -07001327 proto.SetExtension(m, pb2.E_MessageSetExtension_NotMessageSetExtension, &pb2.MessageSetExtension{
Damien Neila8a2cea2019-07-10 16:17:16 -07001328 OptString: proto.String("not a messageset extension"),
Herbie Ong6470ea62019-01-07 18:56:57 -08001329 })
Damien Neil92f76182019-08-02 16:58:08 -07001330 proto.SetExtension(m, pb2.E_MessageSetExtension_ExtNested, &pb2.Nested{
Damien Neila8a2cea2019-07-10 16:17:16 -07001331 OptString: proto.String("just a regular extension"),
Herbie Ong6470ea62019-01-07 18:56:57 -08001332 })
1333 return m
1334 }(),
Joe Tsai1799d112019-08-08 13:31:59 -07001335 skip: !flags.ProtoLegacy,
Herbie Ong6470ea62019-01-07 18:56:57 -08001336 }, {
1337 desc: "not real MessageSet 1",
1338 inputMessage: &pb2.FakeMessageSet{},
1339 inputText: `
1340[pb2.FakeMessageSetExtension.message_set_extension]: {
1341 opt_string: "not a messageset extension"
1342}
1343`,
1344 wantMessage: func() proto.Message {
1345 m := &pb2.FakeMessageSet{}
Damien Neil92f76182019-08-02 16:58:08 -07001346 proto.SetExtension(m, pb2.E_FakeMessageSetExtension_MessageSetExtension, &pb2.FakeMessageSetExtension{
Damien Neila8a2cea2019-07-10 16:17:16 -07001347 OptString: proto.String("not a messageset extension"),
Herbie Ong6470ea62019-01-07 18:56:57 -08001348 })
1349 return m
1350 }(),
Joe Tsai1799d112019-08-08 13:31:59 -07001351 skip: !flags.ProtoLegacy,
Herbie Ong6470ea62019-01-07 18:56:57 -08001352 }, {
1353 desc: "not real MessageSet 2",
1354 inputMessage: &pb2.FakeMessageSet{},
1355 inputText: `
1356[pb2.FakeMessageSetExtension]: {
1357 opt_string: "not a messageset extension"
1358}
1359`,
1360 wantErr: true,
Joe Tsai1799d112019-08-08 13:31:59 -07001361 skip: !flags.ProtoLegacy,
Herbie Ong6470ea62019-01-07 18:56:57 -08001362 }, {
1363 desc: "not real MessageSet 3",
1364 inputMessage: &pb2.MessageSet{},
1365 inputText: `
1366[pb2.message_set_extension]: {
1367 opt_string: "another not a messageset extension"
Herbie Ong300cff02019-03-20 18:05:16 -07001368}`,
Herbie Ong6470ea62019-01-07 18:56:57 -08001369 wantMessage: func() proto.Message {
1370 m := &pb2.MessageSet{}
Damien Neil92f76182019-08-02 16:58:08 -07001371 proto.SetExtension(m, pb2.E_MessageSetExtension, &pb2.FakeMessageSetExtension{
Damien Neila8a2cea2019-07-10 16:17:16 -07001372 OptString: proto.String("another not a messageset extension"),
Herbie Ong6470ea62019-01-07 18:56:57 -08001373 })
1374 return m
1375 }(),
Joe Tsai1799d112019-08-08 13:31:59 -07001376 skip: !flags.ProtoLegacy,
Herbie Ong6470ea62019-01-07 18:56:57 -08001377 }, {
Herbie Ong66c365c2019-01-04 14:08:41 -08001378 desc: "Any not expanded",
Joe Tsaia95b29f2019-05-16 12:47:20 -07001379 inputMessage: &anypb.Any{},
Herbie Ong300cff02019-03-20 18:05:16 -07001380 inputText: `
Herbie Ong66c365c2019-01-04 14:08:41 -08001381type_url: "pb2.Nested"
1382value: "some bytes"
Herbie Ong66c365c2019-01-04 14:08:41 -08001383`,
Joe Tsaia95b29f2019-05-16 12:47:20 -07001384 wantMessage: &anypb.Any{
Herbie Ong300cff02019-03-20 18:05:16 -07001385 TypeUrl: "pb2.Nested",
1386 Value: []byte("some bytes"),
Herbie Ong66c365c2019-01-04 14:08:41 -08001387 },
1388 }, {
1389 desc: "Any not expanded missing value",
Joe Tsaia95b29f2019-05-16 12:47:20 -07001390 inputMessage: &anypb.Any{},
Herbie Ong300cff02019-03-20 18:05:16 -07001391 inputText: `type_url: "pb2.Nested"`,
Joe Tsaia95b29f2019-05-16 12:47:20 -07001392 wantMessage: &anypb.Any{
Herbie Ong300cff02019-03-20 18:05:16 -07001393 TypeUrl: "pb2.Nested",
Herbie Ong66c365c2019-01-04 14:08:41 -08001394 },
1395 }, {
1396 desc: "Any not expanded missing type_url",
Joe Tsaia95b29f2019-05-16 12:47:20 -07001397 inputMessage: &anypb.Any{},
Herbie Ong300cff02019-03-20 18:05:16 -07001398 inputText: `value: "some bytes"`,
Joe Tsaia95b29f2019-05-16 12:47:20 -07001399 wantMessage: &anypb.Any{
Herbie Ong300cff02019-03-20 18:05:16 -07001400 Value: []byte("some bytes"),
Herbie Ong66c365c2019-01-04 14:08:41 -08001401 },
1402 }, {
1403 desc: "Any expanded",
Damien Neil5c5b5312019-05-14 12:44:37 -07001404 umo: prototext.UnmarshalOptions{
Joe Tsai0fc49f82019-05-01 12:29:25 -07001405 Resolver: preg.NewTypes(pimpl.Export{}.MessageTypeOf(&pb2.Nested{})),
Herbie Ong300cff02019-03-20 18:05:16 -07001406 },
Joe Tsaia95b29f2019-05-16 12:47:20 -07001407 inputMessage: &anypb.Any{},
Herbie Ong300cff02019-03-20 18:05:16 -07001408 inputText: `
1409[foobar/pb2.Nested]: {
1410 opt_string: "embedded inside Any"
1411 opt_nested: {
1412 opt_string: "inception"
Herbie Ong66c365c2019-01-04 14:08:41 -08001413 }
1414}
1415`,
1416 wantMessage: func() proto.Message {
1417 m := &pb2.Nested{
Damien Neila8a2cea2019-07-10 16:17:16 -07001418 OptString: proto.String("embedded inside Any"),
Herbie Ong66c365c2019-01-04 14:08:41 -08001419 OptNested: &pb2.Nested{
Damien Neila8a2cea2019-07-10 16:17:16 -07001420 OptString: proto.String("inception"),
Herbie Ong66c365c2019-01-04 14:08:41 -08001421 },
1422 }
Herbie Onge0cf15b2019-03-15 19:32:38 -07001423 b, err := proto.MarshalOptions{Deterministic: true}.Marshal(m)
Herbie Ong66c365c2019-01-04 14:08:41 -08001424 if err != nil {
1425 t.Fatalf("error in binary marshaling message for Any.value: %v", err)
1426 }
Joe Tsaia95b29f2019-05-16 12:47:20 -07001427 return &anypb.Any{
Herbie Ong300cff02019-03-20 18:05:16 -07001428 TypeUrl: "foobar/pb2.Nested",
1429 Value: b,
Herbie Ong66c365c2019-01-04 14:08:41 -08001430 }
1431 }(),
1432 }, {
1433 desc: "Any expanded with empty value",
Damien Neil5c5b5312019-05-14 12:44:37 -07001434 umo: prototext.UnmarshalOptions{
Joe Tsai0fc49f82019-05-01 12:29:25 -07001435 Resolver: preg.NewTypes(pimpl.Export{}.MessageTypeOf(&pb2.Nested{})),
Herbie Ong300cff02019-03-20 18:05:16 -07001436 },
Joe Tsaia95b29f2019-05-16 12:47:20 -07001437 inputMessage: &anypb.Any{},
Herbie Ong300cff02019-03-20 18:05:16 -07001438 inputText: `[foo.com/pb2.Nested]: {}`,
Joe Tsaia95b29f2019-05-16 12:47:20 -07001439 wantMessage: &anypb.Any{
Herbie Ong300cff02019-03-20 18:05:16 -07001440 TypeUrl: "foo.com/pb2.Nested",
Herbie Ong66c365c2019-01-04 14:08:41 -08001441 },
1442 }, {
Damien Neil0c9f0a92019-06-19 10:41:09 -07001443 desc: "Any expanded with missing required",
Damien Neil5c5b5312019-05-14 12:44:37 -07001444 umo: prototext.UnmarshalOptions{
Joe Tsai0fc49f82019-05-01 12:29:25 -07001445 Resolver: preg.NewTypes(pimpl.Export{}.MessageTypeOf(&pb2.PartialRequired{})),
Herbie Ong300cff02019-03-20 18:05:16 -07001446 },
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 }, {
Herbie Ong21a39742019-04-08 17:32:44 -07001470 desc: "Any with invalid UTF-8",
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(&pb3.Nested{})),
Herbie Ong21a39742019-04-08 17:32:44 -07001473 },
Joe Tsaia95b29f2019-05-16 12:47:20 -07001474 inputMessage: &anypb.Any{},
Herbie Ong21a39742019-04-08 17:32:44 -07001475 inputText: `
1476[pb3.Nested]: {
1477 s_string: "abc\xff"
1478}
1479`,
Herbie Ong21a39742019-04-08 17:32:44 -07001480 wantErr: true,
1481 }, {
Herbie Ong66c365c2019-01-04 14:08:41 -08001482 desc: "Any expanded with unregistered type",
Damien Neil5c5b5312019-05-14 12:44:37 -07001483 umo: prototext.UnmarshalOptions{Resolver: preg.NewTypes()},
Joe Tsaia95b29f2019-05-16 12:47:20 -07001484 inputMessage: &anypb.Any{},
Herbie Ong300cff02019-03-20 18:05:16 -07001485 inputText: `[SomeMessage]: {}`,
1486 wantErr: true,
Herbie Ong66c365c2019-01-04 14:08:41 -08001487 }, {
1488 desc: "Any expanded with invalid value",
Damien Neil5c5b5312019-05-14 12:44:37 -07001489 umo: prototext.UnmarshalOptions{
Joe Tsai0fc49f82019-05-01 12:29:25 -07001490 Resolver: preg.NewTypes(pimpl.Export{}.MessageTypeOf(&pb2.Nested{})),
Herbie Ong300cff02019-03-20 18:05:16 -07001491 },
Joe Tsaia95b29f2019-05-16 12:47:20 -07001492 inputMessage: &anypb.Any{},
Herbie Ong300cff02019-03-20 18:05:16 -07001493 inputText: `[pb2.Nested]: 123`,
1494 wantErr: true,
Herbie Ong66c365c2019-01-04 14:08:41 -08001495 }, {
1496 desc: "Any expanded with unknown fields",
Damien Neil5c5b5312019-05-14 12:44:37 -07001497 umo: prototext.UnmarshalOptions{
Joe Tsai0fc49f82019-05-01 12:29:25 -07001498 Resolver: preg.NewTypes(pimpl.Export{}.MessageTypeOf(&pb2.Nested{})),
Herbie Ong300cff02019-03-20 18:05:16 -07001499 },
Joe Tsaia95b29f2019-05-16 12:47:20 -07001500 inputMessage: &anypb.Any{},
Herbie Ong300cff02019-03-20 18:05:16 -07001501 inputText: `
Herbie Ong66c365c2019-01-04 14:08:41 -08001502[pb2.Nested]: {}
1503unknown: ""
Herbie Ong66c365c2019-01-04 14:08:41 -08001504`,
1505 wantErr: true,
1506 }, {
1507 desc: "Any contains expanded and unexpanded fields",
Damien Neil5c5b5312019-05-14 12:44:37 -07001508 umo: prototext.UnmarshalOptions{
Joe Tsai0fc49f82019-05-01 12:29:25 -07001509 Resolver: preg.NewTypes(pimpl.Export{}.MessageTypeOf(&pb2.Nested{})),
Herbie Ong300cff02019-03-20 18:05:16 -07001510 },
Joe Tsaia95b29f2019-05-16 12:47:20 -07001511 inputMessage: &anypb.Any{},
Herbie Ong300cff02019-03-20 18:05:16 -07001512 inputText: `
Herbie Ong66c365c2019-01-04 14:08:41 -08001513[pb2.Nested]: {}
1514type_url: "pb2.Nested"
Herbie Ong66c365c2019-01-04 14:08:41 -08001515`,
1516 wantErr: true,
Joe Tsaid47ea192019-07-09 22:38:15 -07001517 }, {
1518 desc: "weak fields",
1519 inputMessage: &testpb.TestWeak{},
1520 inputText: `weak_message1:{a:1}`,
1521 wantMessage: func() *testpb.TestWeak {
1522 m := new(testpb.TestWeak)
1523 m.SetWeakMessage1(&weakpb.WeakImportMessage1{A: proto.Int32(1)})
1524 return m
1525 }(),
Joe Tsai1799d112019-08-08 13:31:59 -07001526 skip: !flags.ProtoLegacy,
Joe Tsaid47ea192019-07-09 22:38:15 -07001527 }, {
1528 desc: "weak fields; unknown field",
1529 inputMessage: &testpb.TestWeak{},
1530 inputText: `weak_message1:{a:1} weak_message2:{a:1}`,
1531 wantErr: true, // weak_message2 is unknown since the package containing it is not imported
Joe Tsai1799d112019-08-08 13:31:59 -07001532 skip: !flags.ProtoLegacy,
Herbie Ong800c9902018-12-06 15:28:53 -08001533 }}
1534
1535 for _, tt := range tests {
1536 tt := tt
Joe Tsaid47ea192019-07-09 22:38:15 -07001537 if tt.skip {
1538 continue
1539 }
Herbie Ong800c9902018-12-06 15:28:53 -08001540 t.Run(tt.desc, func(t *testing.T) {
Joe Tsaicdb77732019-05-14 16:05:06 -07001541 err := tt.umo.Unmarshal([]byte(tt.inputText), tt.inputMessage)
Herbie Ong800c9902018-12-06 15:28:53 -08001542 if err != nil && !tt.wantErr {
1543 t.Errorf("Unmarshal() returned error: %v\n\n", err)
1544 }
1545 if err == nil && tt.wantErr {
1546 t.Error("Unmarshal() got nil error, want error\n\n")
1547 }
Joe Tsai8d30bbe2019-05-16 15:53:25 -07001548 if tt.wantMessage != nil && !proto.Equal(tt.inputMessage, tt.wantMessage) {
Herbie Ong800c9902018-12-06 15:28:53 -08001549 t.Errorf("Unmarshal()\n<got>\n%v\n<want>\n%v\n", tt.inputMessage, tt.wantMessage)
1550 }
1551 })
1552 }
1553}