@@ -2489,6 +2489,87 @@ func TestUnmarshal(t *testing.T) {
24892489 inputText : `{"weak_message1":{"a":1}, "weak_message2":{"a":1}}` ,
24902490 wantErr : `unknown field "weak_message2"` , // weak_message2 is unknown since the package containing it is not imported
24912491 skip : ! flags .ProtoLegacy ,
2492+ }, {
2493+ desc : "just at recursion limit: nested messages" ,
2494+ inputMessage : & testpb.TestAllTypes {},
2495+ inputText : `{"optionalNestedMessage":{"corecursive":{"optionalNestedMessage":{"corecursive":{}}}}}` ,
2496+ umo : protojson.UnmarshalOptions {RecursionLimit : 5 },
2497+ }, {
2498+ desc : "exceed recursion limit: nested messages" ,
2499+ inputMessage : & testpb.TestAllTypes {},
2500+ inputText : `{"optionalNestedMessage":{"corecursive":{"optionalNestedMessage":{"corecursive":{"optionalNestedMessage":{}}}}}}` ,
2501+ umo : protojson.UnmarshalOptions {RecursionLimit : 5 },
2502+ wantErr : "exceeded max recursion depth" ,
2503+ }, {
2504+
2505+ desc : "just at recursion limit: maps" ,
2506+ inputMessage : & testpb.TestAllTypes {},
2507+ inputText : `{"mapStringNestedMessage":{"key1":{"corecursive":{"mapStringNestedMessage":{}}}}}` ,
2508+ umo : protojson.UnmarshalOptions {RecursionLimit : 3 },
2509+ }, {
2510+ desc : "exceed recursion limit: maps" ,
2511+ inputMessage : & testpb.TestAllTypes {},
2512+ inputText : `{"mapStringNestedMessage":{"key1":{"corecursive":{"mapStringNestedMessage":{}}}}}` ,
2513+ umo : protojson.UnmarshalOptions {RecursionLimit : 2 },
2514+ wantErr : "exceeded max recursion depth" ,
2515+ }, {
2516+ desc : "just at recursion limit: arrays" ,
2517+ inputMessage : & testpb.TestAllTypes {},
2518+ inputText : `{"repeatedNestedMessage":[{"corecursive":{"repeatedInt32":[1,2,3]}}]}` ,
2519+ umo : protojson.UnmarshalOptions {RecursionLimit : 3 },
2520+ }, {
2521+ desc : "exceed recursion limit: arrays" ,
2522+ inputMessage : & testpb.TestAllTypes {},
2523+ inputText : `{"repeatedNestedMessage":[{"corecursive":{"repeatedNestedMessage":[{}]}}]}` ,
2524+ umo : protojson.UnmarshalOptions {RecursionLimit : 3 },
2525+ wantErr : "exceeded max recursion depth" ,
2526+ }, {
2527+ desc : "just at recursion limit: value" ,
2528+ inputMessage : & structpb.Value {},
2529+ inputText : `{"a":{"b":{"c":{"d":{}}}}}` ,
2530+ umo : protojson.UnmarshalOptions {RecursionLimit : 5 },
2531+ }, {
2532+ desc : "exceed recursion limit: value" ,
2533+ inputMessage : & structpb.Value {},
2534+ inputText : `{"a":{"b":{"c":{"d":{"e":[]}}}}}` ,
2535+ umo : protojson.UnmarshalOptions {RecursionLimit : 5 },
2536+ wantErr : "exceeded max recursion depth" ,
2537+ }, {
2538+ desc : "just at recursion limit: list value" ,
2539+ inputMessage : & structpb.ListValue {},
2540+ inputText : `[[[[[1, 2, 3, 4]]]]]` ,
2541+ // Note: the JSON appears to have recursion of only 5. But it's actually 6 because the
2542+ // first leaf value (1) is actually a message (google.protobuf.Value), even though the
2543+ // JSON doesn't use an open brace.
2544+ umo : protojson.UnmarshalOptions {RecursionLimit : 6 },
2545+ }, {
2546+ desc : "exceed recursion limit: list value" ,
2547+ inputMessage : & structpb.ListValue {},
2548+ inputText : `[[[[[1, 2, 3, 4, ["a", "b"]]]]]]` ,
2549+ umo : protojson.UnmarshalOptions {RecursionLimit : 6 },
2550+ wantErr : "exceeded max recursion depth" ,
2551+ }, {
2552+ desc : "just at recursion limit: struct value" ,
2553+ inputMessage : & structpb.Struct {},
2554+ inputText : `{"a":{"b":{"c":{"d":{}}}}}` ,
2555+ umo : protojson.UnmarshalOptions {RecursionLimit : 5 },
2556+ }, {
2557+ desc : "exceed recursion limit: struct value" ,
2558+ inputMessage : & structpb.Struct {},
2559+ inputText : `{"a":{"b":{"c":{"d":{"e":{}]}}}}}` ,
2560+ umo : protojson.UnmarshalOptions {RecursionLimit : 5 },
2561+ wantErr : "exceeded max recursion depth" ,
2562+ }, {
2563+ desc : "just at recursion limit: skip unknown" ,
2564+ inputMessage : & testpb.TestAllTypes {},
2565+ inputText : `{"foo":{"bar":[{"baz":{}}]}}` ,
2566+ umo : protojson.UnmarshalOptions {RecursionLimit : 5 , DiscardUnknown : true },
2567+ }, {
2568+ desc : "exceed recursion limit: skip unknown" ,
2569+ inputMessage : & testpb.TestAllTypes {},
2570+ inputText : `{"foo":{"bar":[{"baz":[{}]]}}` ,
2571+ umo : protojson.UnmarshalOptions {RecursionLimit : 5 , DiscardUnknown : true },
2572+ wantErr : "exceeded max recursion depth" ,
24922573 }}
24932574
24942575 for _ , tt := range tests {
0 commit comments