36
36
from google .protobuf .internal import more_extensions_pb2
37
37
from google .protobuf .internal import more_messages_pb2
38
38
from google .protobuf .internal import packed_field_test_pb2
39
+ from google .protobuf .internal import self_recursive_pb2
39
40
from google .protobuf .internal import test_proto3_optional_pb2
40
41
from google .protobuf .internal import test_util
41
42
from google .protobuf .internal import testing_refleaks
@@ -1431,6 +1432,52 @@ def testMessageClassName(self, message_module):
1431
1432
)
1432
1433
1433
1434
1435
+ @testing_refleaks .TestCase
1436
+ class TestRecursiveGroup (unittest .TestCase ):
1437
+
1438
+ def _MakeRecursiveGroupMessage (self , n ):
1439
+ msg = self_recursive_pb2 .SelfRecursive ()
1440
+ sub = msg
1441
+ for _ in range (n ):
1442
+ sub = sub .sub_group
1443
+ sub .i = 1
1444
+ return msg .SerializeToString ()
1445
+
1446
+ def testRecursiveGroups (self ):
1447
+ recurse_msg = self_recursive_pb2 .SelfRecursive ()
1448
+ data = self ._MakeRecursiveGroupMessage (100 )
1449
+ recurse_msg .ParseFromString (data )
1450
+ self .assertTrue (recurse_msg .HasField ('sub_group' ))
1451
+
1452
+ def testRecursiveGroupsException (self ):
1453
+ if api_implementation .Type () != 'python' :
1454
+ api_implementation ._c_module .SetAllowOversizeProtos (False )
1455
+ recurse_msg = self_recursive_pb2 .SelfRecursive ()
1456
+ data = self ._MakeRecursiveGroupMessage (300 )
1457
+ with self .assertRaises (message .DecodeError ) as context :
1458
+ recurse_msg .ParseFromString (data )
1459
+ self .assertIn ('Error parsing message' , str (context .exception ))
1460
+ if api_implementation .Type () == 'python' :
1461
+ self .assertIn ('too many levels of nesting' , str (context .exception ))
1462
+
1463
+ def testRecursiveGroupsUnknownFields (self ):
1464
+ if api_implementation .Type () != 'python' :
1465
+ api_implementation ._c_module .SetAllowOversizeProtos (False )
1466
+ test_msg = unittest_pb2 .TestAllTypes ()
1467
+ data = self ._MakeRecursiveGroupMessage (300 ) # unknown to test_msg
1468
+ with self .assertRaises (message .DecodeError ) as context :
1469
+ test_msg .ParseFromString (data )
1470
+ self .assertIn (
1471
+ 'Error parsing message' ,
1472
+ str (context .exception ),
1473
+ )
1474
+ if api_implementation .Type () == 'python' :
1475
+ self .assertIn ('too many levels of nesting' , str (context .exception ))
1476
+ decoder .SetRecursionLimit (310 )
1477
+ test_msg .ParseFromString (data )
1478
+ decoder .SetRecursionLimit (decoder .DEFAULT_RECURSION_LIMIT )
1479
+
1480
+
1434
1481
# Class to test proto2-only features (required, extensions, etc.)
1435
1482
@testing_refleaks .TestCase
1436
1483
class Proto2Test (unittest .TestCase ):
@@ -2859,8 +2906,6 @@ def testUnpackedFields(self):
2859
2906
self .assertEqual (golden_data , message .SerializeToString ())
2860
2907
2861
2908
2862
- @unittest .skipIf (api_implementation .Type () == 'python' ,
2863
- 'explicit tests of the C++ implementation' )
2864
2909
@testing_refleaks .TestCase
2865
2910
class OversizeProtosTest (unittest .TestCase ):
2866
2911
@@ -2877,16 +2922,23 @@ def testSucceedOkSizedProto(self):
2877
2922
msg .ParseFromString (self .GenerateNestedProto (100 ))
2878
2923
2879
2924
def testAssertOversizeProto (self ):
2880
- api_implementation ._c_module .SetAllowOversizeProtos (False )
2925
+ if api_implementation .Type () != 'python' :
2926
+ api_implementation ._c_module .SetAllowOversizeProtos (False )
2881
2927
msg = unittest_pb2 .TestRecursiveMessage ()
2882
2928
with self .assertRaises (message .DecodeError ) as context :
2883
2929
msg .ParseFromString (self .GenerateNestedProto (101 ))
2884
2930
self .assertIn ('Error parsing message' , str (context .exception ))
2885
2931
2886
2932
def testSucceedOversizeProto (self ):
2887
- api_implementation ._c_module .SetAllowOversizeProtos (True )
2933
+
2934
+ if api_implementation .Type () == 'python' :
2935
+ decoder .SetRecursionLimit (310 )
2936
+ else :
2937
+ api_implementation ._c_module .SetAllowOversizeProtos (True )
2938
+
2888
2939
msg = unittest_pb2 .TestRecursiveMessage ()
2889
2940
msg .ParseFromString (self .GenerateNestedProto (101 ))
2941
+ decoder .SetRecursionLimit (decoder .DEFAULT_RECURSION_LIMIT )
2890
2942
2891
2943
2892
2944
if __name__ == '__main__' :
0 commit comments