implement reserved names and ranges for messages and enums
https://github.com/protocolbuffers/protobuf/issues/10158

PiperOrigin-RevId: 488863171
diff --git a/python/google/protobuf/internal/descriptor_test.py b/python/google/protobuf/internal/descriptor_test.py
index 7961f38..614a845 100644
--- a/python/google/protobuf/internal/descriptor_test.py
+++ b/python/google/protobuf/internal/descriptor_test.py
@@ -134,6 +134,88 @@
     file_descriptor = pool.AddSerializedFile(serialized)
     self.assertEqual('', file_descriptor.package)
 
+  def testReservedName(self):
+    text = """
+      name: "foo.proto"
+      message_type {
+        name: "BrokenMessageFoo"
+        reserved_name: "is_deprecated"
+      }
+      """
+
+    fdp = text_format.Parse(text, descriptor_pb2.FileDescriptorProto())
+    serialized = fdp.SerializeToString()
+    # AddSerializedFile() will allow duplicate adds but only if the descriptors
+    # are identical and can round-trip through a FileDescriptor losslessly.
+    desc1 = descriptor_pool.Default().AddSerializedFile(serialized)
+    desc2 = descriptor_pool.Default().AddSerializedFile(serialized)
+    self.assertEqual(desc1, desc2)
+
+  def testReservedRange(self):
+    text = """
+      name: "bar.proto"
+      message_type {
+        name: "BrokenMessageBar"
+        reserved_range {
+          start: 101
+          end: 102
+        }
+      }
+      """
+
+    fdp = text_format.Parse(text, descriptor_pb2.FileDescriptorProto())
+    serialized = fdp.SerializeToString()
+    # AddSerializedFile() will allow duplicate adds but only if the descriptors
+    # are identical and can round-trip through a FileDescriptor losslessly.
+    desc1 = descriptor_pool.Default().AddSerializedFile(serialized)
+    desc2 = descriptor_pool.Default().AddSerializedFile(serialized)
+    self.assertEqual(desc1, desc2)
+
+  def testReservedNameEnum(self):
+    text = """
+      name: "baz.proto"
+      enum_type {
+        name: "BrokenMessageBaz"
+        value: <
+          name: 'ENUM_BAZ'
+          number: 114
+        >
+        reserved_name: "is_deprecated"
+      }
+      """
+
+    fdp = text_format.Parse(text, descriptor_pb2.FileDescriptorProto())
+    serialized = fdp.SerializeToString()
+    # AddSerializedFile() will allow duplicate adds but only if the descriptors
+    # are identical and can round-trip through a FileDescriptor losslessly.
+    desc1 = descriptor_pool.Default().AddSerializedFile(serialized)
+    desc2 = descriptor_pool.Default().AddSerializedFile(serialized)
+    self.assertEqual(desc1, desc2)
+
+  def testReservedRangeEnum(self):
+    text = """
+      name: "bat.proto"
+      enum_type {
+        name: "BrokenMessageBat"
+        value: <
+          name: 'ENUM_BAT'
+          number: 115
+        >
+        reserved_range {
+          start: 1001
+          end: 1002
+        }
+      }
+      """
+
+    fdp = text_format.Parse(text, descriptor_pb2.FileDescriptorProto())
+    serialized = fdp.SerializeToString()
+    # AddSerializedFile() will allow duplicate adds but only if the descriptors
+    # are identical and can round-trip through a FileDescriptor losslessly.
+    desc1 = descriptor_pool.Default().AddSerializedFile(serialized)
+    desc2 = descriptor_pool.Default().AddSerializedFile(serialized)
+    self.assertEqual(desc1, desc2)
+
   def testFindMethodByName(self):
     service_descriptor = (unittest_custom_options_pb2.
                           TestServiceWithCustomOptions.DESCRIPTOR)