|
|
|
@ -41,6 +41,7 @@ import copy |
|
|
|
|
import gc |
|
|
|
|
import operator |
|
|
|
|
import struct |
|
|
|
|
import sys |
|
|
|
|
|
|
|
|
|
from google.apputils import basetest |
|
|
|
|
from google.protobuf import unittest_import_pb2 |
|
|
|
@ -1556,6 +1557,20 @@ class ReflectionTest(basetest.TestCase): |
|
|
|
|
|
|
|
|
|
def assertNotInitialized(self, proto): |
|
|
|
|
self.assertFalse(proto.IsInitialized()) |
|
|
|
|
try: |
|
|
|
|
proto.SerializeToString() |
|
|
|
|
except message.EncodeError: |
|
|
|
|
return |
|
|
|
|
except: |
|
|
|
|
# C++ implementation in opensource do not consider the catched |
|
|
|
|
# exception google.protobuf.message.EncodeError same as |
|
|
|
|
# message.EncodeError. Add an additional catch to deal with it. |
|
|
|
|
if api_implementation.Type() == 'python': |
|
|
|
|
raise self.failureException('message.EncodeError not raised') |
|
|
|
|
self.assertEqual('<class \'google.protobuf.message.EncodeError\'>', |
|
|
|
|
str(sys.exc_info()[0])) |
|
|
|
|
else: |
|
|
|
|
raise self.failureException('message.EncodeError not raised') |
|
|
|
|
# "Partial" serialization doesn't care if message is uninitialized. |
|
|
|
|
proto.SerializePartialToString() |
|
|
|
|
|
|
|
|
@ -2485,11 +2500,23 @@ class SerializationTest(basetest.TestCase): |
|
|
|
|
# Check if the exception message is the right one. |
|
|
|
|
self.assertEqual(exception, str(ex)) |
|
|
|
|
return |
|
|
|
|
except: |
|
|
|
|
# C++ implementation in opensource do not consider the catched |
|
|
|
|
# exception google.protobuf.message.EncodeError same as |
|
|
|
|
# message.EncodeError. Add an additional catch to deal with it. |
|
|
|
|
if api_implementation.Type() == 'python': |
|
|
|
|
raise self.failureException('%s not raised' % str(exc_class)) |
|
|
|
|
self.assertEqual(exception, str(sys.exc_info()[1])) |
|
|
|
|
else: |
|
|
|
|
raise self.failureException('%s not raised' % str(exc_class)) |
|
|
|
|
|
|
|
|
|
def testSerializeUninitialized(self): |
|
|
|
|
proto = unittest_pb2.TestRequired() |
|
|
|
|
self._CheckRaises( |
|
|
|
|
message.EncodeError, |
|
|
|
|
proto.SerializeToString, |
|
|
|
|
'Message protobuf_unittest.TestRequired is missing required fields: ' |
|
|
|
|
'a,b,c') |
|
|
|
|
# Shouldn't raise exceptions. |
|
|
|
|
partial = proto.SerializePartialToString() |
|
|
|
|
|
|
|
|
@ -2500,10 +2527,18 @@ class SerializationTest(basetest.TestCase): |
|
|
|
|
self.assertFalse(proto2.HasField('a')) |
|
|
|
|
|
|
|
|
|
proto.a = 1 |
|
|
|
|
self._CheckRaises( |
|
|
|
|
message.EncodeError, |
|
|
|
|
proto.SerializeToString, |
|
|
|
|
'Message protobuf_unittest.TestRequired is missing required fields: b,c') |
|
|
|
|
# Shouldn't raise exceptions. |
|
|
|
|
partial = proto.SerializePartialToString() |
|
|
|
|
|
|
|
|
|
proto.b = 2 |
|
|
|
|
self._CheckRaises( |
|
|
|
|
message.EncodeError, |
|
|
|
|
proto.SerializeToString, |
|
|
|
|
'Message protobuf_unittest.TestRequired is missing required fields: c') |
|
|
|
|
# Shouldn't raise exceptions. |
|
|
|
|
partial = proto.SerializePartialToString() |
|
|
|
|
|
|
|
|
@ -2533,6 +2568,12 @@ class SerializationTest(basetest.TestCase): |
|
|
|
|
proto.SerializeToString() |
|
|
|
|
|
|
|
|
|
proto.optional_message.a = 1 |
|
|
|
|
self._CheckRaises( |
|
|
|
|
message.EncodeError, |
|
|
|
|
proto.SerializeToString, |
|
|
|
|
'Message protobuf_unittest.TestRequiredForeign ' |
|
|
|
|
'is missing required fields: ' |
|
|
|
|
'optional_message.b,optional_message.c') |
|
|
|
|
|
|
|
|
|
proto.optional_message.b = 2 |
|
|
|
|
proto.optional_message.c = 3 |
|
|
|
@ -2540,6 +2581,12 @@ class SerializationTest(basetest.TestCase): |
|
|
|
|
|
|
|
|
|
proto.repeated_message.add().a = 1 |
|
|
|
|
proto.repeated_message.add().b = 2 |
|
|
|
|
self._CheckRaises( |
|
|
|
|
message.EncodeError, |
|
|
|
|
proto.SerializeToString, |
|
|
|
|
'Message protobuf_unittest.TestRequiredForeign is missing required fields: ' |
|
|
|
|
'repeated_message[0].b,repeated_message[0].c,' |
|
|
|
|
'repeated_message[1].a,repeated_message[1].c') |
|
|
|
|
|
|
|
|
|
proto.repeated_message[0].b = 2 |
|
|
|
|
proto.repeated_message[0].c = 3 |
|
|
|
|