| Index: third_party/protobuf/python/google/protobuf/internal/json_format_test.py
|
| diff --git a/third_party/protobuf/python/google/protobuf/internal/json_format_test.py b/third_party/protobuf/python/google/protobuf/internal/json_format_test.py
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..be3ad11ae0a18676a23790fc6c5c1cc11ec2dfd2
|
| --- /dev/null
|
| +++ b/third_party/protobuf/python/google/protobuf/internal/json_format_test.py
|
| @@ -0,0 +1,534 @@
|
| +#! /usr/bin/env python
|
| +#
|
| +# Protocol Buffers - Google's data interchange format
|
| +# Copyright 2008 Google Inc. All rights reserved.
|
| +# https://developers.google.com/protocol-buffers/
|
| +#
|
| +# Redistribution and use in source and binary forms, with or without
|
| +# modification, are permitted provided that the following conditions are
|
| +# met:
|
| +#
|
| +# * Redistributions of source code must retain the above copyright
|
| +# notice, this list of conditions and the following disclaimer.
|
| +# * Redistributions in binary form must reproduce the above
|
| +# copyright notice, this list of conditions and the following disclaimer
|
| +# in the documentation and/or other materials provided with the
|
| +# distribution.
|
| +# * Neither the name of Google Inc. nor the names of its
|
| +# contributors may be used to endorse or promote products derived from
|
| +# this software without specific prior written permission.
|
| +#
|
| +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
| +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
| +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
| +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
| +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
| +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
| +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
| +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
| +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
| +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
| +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
| +
|
| +"""Test for google.protobuf.json_format."""
|
| +
|
| +__author__ = 'jieluo@google.com (Jie Luo)'
|
| +
|
| +import json
|
| +import math
|
| +import sys
|
| +
|
| +try:
|
| + import unittest2 as unittest
|
| +except ImportError:
|
| + import unittest
|
| +from google.protobuf.internal import well_known_types
|
| +from google.protobuf import json_format
|
| +from google.protobuf.util import json_format_proto3_pb2
|
| +
|
| +
|
| +class JsonFormatBase(unittest.TestCase):
|
| +
|
| + def FillAllFields(self, message):
|
| + message.int32_value = 20
|
| + message.int64_value = -20
|
| + message.uint32_value = 3120987654
|
| + message.uint64_value = 12345678900
|
| + message.float_value = float('-inf')
|
| + message.double_value = 3.1415
|
| + message.bool_value = True
|
| + message.string_value = 'foo'
|
| + message.bytes_value = b'bar'
|
| + message.message_value.value = 10
|
| + message.enum_value = json_format_proto3_pb2.BAR
|
| + # Repeated
|
| + message.repeated_int32_value.append(0x7FFFFFFF)
|
| + message.repeated_int32_value.append(-2147483648)
|
| + message.repeated_int64_value.append(9007199254740992)
|
| + message.repeated_int64_value.append(-9007199254740992)
|
| + message.repeated_uint32_value.append(0xFFFFFFF)
|
| + message.repeated_uint32_value.append(0x7FFFFFF)
|
| + message.repeated_uint64_value.append(9007199254740992)
|
| + message.repeated_uint64_value.append(9007199254740991)
|
| + message.repeated_float_value.append(0)
|
| +
|
| + message.repeated_double_value.append(1E-15)
|
| + message.repeated_double_value.append(float('inf'))
|
| + message.repeated_bool_value.append(True)
|
| + message.repeated_bool_value.append(False)
|
| + message.repeated_string_value.append('Few symbols!#$,;')
|
| + message.repeated_string_value.append('bar')
|
| + message.repeated_bytes_value.append(b'foo')
|
| + message.repeated_bytes_value.append(b'bar')
|
| + message.repeated_message_value.add().value = 10
|
| + message.repeated_message_value.add().value = 11
|
| + message.repeated_enum_value.append(json_format_proto3_pb2.FOO)
|
| + message.repeated_enum_value.append(json_format_proto3_pb2.BAR)
|
| + self.message = message
|
| +
|
| + def CheckParseBack(self, message, parsed_message):
|
| + json_format.Parse(json_format.MessageToJson(message),
|
| + parsed_message)
|
| + self.assertEqual(message, parsed_message)
|
| +
|
| + def CheckError(self, text, error_message):
|
| + message = json_format_proto3_pb2.TestMessage()
|
| + self.assertRaisesRegexp(
|
| + json_format.ParseError,
|
| + error_message,
|
| + json_format.Parse, text, message)
|
| +
|
| +
|
| +class JsonFormatTest(JsonFormatBase):
|
| +
|
| + def testEmptyMessageToJson(self):
|
| + message = json_format_proto3_pb2.TestMessage()
|
| + self.assertEqual(json_format.MessageToJson(message),
|
| + '{}')
|
| + parsed_message = json_format_proto3_pb2.TestMessage()
|
| + self.CheckParseBack(message, parsed_message)
|
| +
|
| + def testPartialMessageToJson(self):
|
| + message = json_format_proto3_pb2.TestMessage(
|
| + string_value='test',
|
| + repeated_int32_value=[89, 4])
|
| + self.assertEqual(json.loads(json_format.MessageToJson(message)),
|
| + json.loads('{"stringValue": "test", '
|
| + '"repeatedInt32Value": [89, 4]}'))
|
| + parsed_message = json_format_proto3_pb2.TestMessage()
|
| + self.CheckParseBack(message, parsed_message)
|
| +
|
| + def testAllFieldsToJson(self):
|
| + message = json_format_proto3_pb2.TestMessage()
|
| + text = ('{"int32Value": 20, '
|
| + '"int64Value": "-20", '
|
| + '"uint32Value": 3120987654,'
|
| + '"uint64Value": "12345678900",'
|
| + '"floatValue": "-Infinity",'
|
| + '"doubleValue": 3.1415,'
|
| + '"boolValue": true,'
|
| + '"stringValue": "foo",'
|
| + '"bytesValue": "YmFy",'
|
| + '"messageValue": {"value": 10},'
|
| + '"enumValue": "BAR",'
|
| + '"repeatedInt32Value": [2147483647, -2147483648],'
|
| + '"repeatedInt64Value": ["9007199254740992", "-9007199254740992"],'
|
| + '"repeatedUint32Value": [268435455, 134217727],'
|
| + '"repeatedUint64Value": ["9007199254740992", "9007199254740991"],'
|
| + '"repeatedFloatValue": [0],'
|
| + '"repeatedDoubleValue": [1e-15, "Infinity"],'
|
| + '"repeatedBoolValue": [true, false],'
|
| + '"repeatedStringValue": ["Few symbols!#$,;", "bar"],'
|
| + '"repeatedBytesValue": ["Zm9v", "YmFy"],'
|
| + '"repeatedMessageValue": [{"value": 10}, {"value": 11}],'
|
| + '"repeatedEnumValue": ["FOO", "BAR"]'
|
| + '}')
|
| + self.FillAllFields(message)
|
| + self.assertEqual(
|
| + json.loads(json_format.MessageToJson(message)),
|
| + json.loads(text))
|
| + parsed_message = json_format_proto3_pb2.TestMessage()
|
| + json_format.Parse(text, parsed_message)
|
| + self.assertEqual(message, parsed_message)
|
| +
|
| + def testJsonEscapeString(self):
|
| + message = json_format_proto3_pb2.TestMessage()
|
| + if sys.version_info[0] < 3:
|
| + message.string_value = '&\n<\"\r>\b\t\f\\\001/\xe2\x80\xa8\xe2\x80\xa9'
|
| + else:
|
| + message.string_value = '&\n<\"\r>\b\t\f\\\001/'
|
| + message.string_value += (b'\xe2\x80\xa8\xe2\x80\xa9').decode('utf-8')
|
| + self.assertEqual(
|
| + json_format.MessageToJson(message),
|
| + '{\n "stringValue": '
|
| + '"&\\n<\\\"\\r>\\b\\t\\f\\\\\\u0001/\\u2028\\u2029"\n}')
|
| + parsed_message = json_format_proto3_pb2.TestMessage()
|
| + self.CheckParseBack(message, parsed_message)
|
| + text = u'{"int32Value": "\u0031"}'
|
| + json_format.Parse(text, message)
|
| + self.assertEqual(message.int32_value, 1)
|
| +
|
| + def testAlwaysSeriliaze(self):
|
| + message = json_format_proto3_pb2.TestMessage(
|
| + string_value='foo')
|
| + self.assertEqual(
|
| + json.loads(json_format.MessageToJson(message, True)),
|
| + json.loads('{'
|
| + '"repeatedStringValue": [],'
|
| + '"stringValue": "foo",'
|
| + '"repeatedBoolValue": [],'
|
| + '"repeatedUint32Value": [],'
|
| + '"repeatedInt32Value": [],'
|
| + '"enumValue": "FOO",'
|
| + '"int32Value": 0,'
|
| + '"floatValue": 0,'
|
| + '"int64Value": "0",'
|
| + '"uint32Value": 0,'
|
| + '"repeatedBytesValue": [],'
|
| + '"repeatedUint64Value": [],'
|
| + '"repeatedDoubleValue": [],'
|
| + '"bytesValue": "",'
|
| + '"boolValue": false,'
|
| + '"repeatedEnumValue": [],'
|
| + '"uint64Value": "0",'
|
| + '"doubleValue": 0,'
|
| + '"repeatedFloatValue": [],'
|
| + '"repeatedInt64Value": [],'
|
| + '"repeatedMessageValue": []}'))
|
| + parsed_message = json_format_proto3_pb2.TestMessage()
|
| + self.CheckParseBack(message, parsed_message)
|
| +
|
| + def testMapFields(self):
|
| + message = json_format_proto3_pb2.TestMap()
|
| + message.bool_map[True] = 1
|
| + message.bool_map[False] = 2
|
| + message.int32_map[1] = 2
|
| + message.int32_map[2] = 3
|
| + message.int64_map[1] = 2
|
| + message.int64_map[2] = 3
|
| + message.uint32_map[1] = 2
|
| + message.uint32_map[2] = 3
|
| + message.uint64_map[1] = 2
|
| + message.uint64_map[2] = 3
|
| + message.string_map['1'] = 2
|
| + message.string_map['null'] = 3
|
| + self.assertEqual(
|
| + json.loads(json_format.MessageToJson(message, True)),
|
| + json.loads('{'
|
| + '"boolMap": {"false": 2, "true": 1},'
|
| + '"int32Map": {"1": 2, "2": 3},'
|
| + '"int64Map": {"1": 2, "2": 3},'
|
| + '"uint32Map": {"1": 2, "2": 3},'
|
| + '"uint64Map": {"1": 2, "2": 3},'
|
| + '"stringMap": {"1": 2, "null": 3}'
|
| + '}'))
|
| + parsed_message = json_format_proto3_pb2.TestMap()
|
| + self.CheckParseBack(message, parsed_message)
|
| +
|
| + def testOneofFields(self):
|
| + message = json_format_proto3_pb2.TestOneof()
|
| + # Always print does not affect oneof fields.
|
| + self.assertEqual(
|
| + json_format.MessageToJson(message, True),
|
| + '{}')
|
| + message.oneof_int32_value = 0
|
| + self.assertEqual(
|
| + json_format.MessageToJson(message, True),
|
| + '{\n'
|
| + ' "oneofInt32Value": 0\n'
|
| + '}')
|
| + parsed_message = json_format_proto3_pb2.TestOneof()
|
| + self.CheckParseBack(message, parsed_message)
|
| +
|
| + def testTimestampMessage(self):
|
| + message = json_format_proto3_pb2.TestTimestamp()
|
| + message.value.seconds = 0
|
| + message.value.nanos = 0
|
| + message.repeated_value.add().seconds = 20
|
| + message.repeated_value[0].nanos = 1
|
| + message.repeated_value.add().seconds = 0
|
| + message.repeated_value[1].nanos = 10000
|
| + message.repeated_value.add().seconds = 100000000
|
| + message.repeated_value[2].nanos = 0
|
| + # Maximum time
|
| + message.repeated_value.add().seconds = 253402300799
|
| + message.repeated_value[3].nanos = 999999999
|
| + # Minimum time
|
| + message.repeated_value.add().seconds = -62135596800
|
| + message.repeated_value[4].nanos = 0
|
| + self.assertEqual(
|
| + json.loads(json_format.MessageToJson(message, True)),
|
| + json.loads('{'
|
| + '"value": "1970-01-01T00:00:00Z",'
|
| + '"repeatedValue": ['
|
| + ' "1970-01-01T00:00:20.000000001Z",'
|
| + ' "1970-01-01T00:00:00.000010Z",'
|
| + ' "1973-03-03T09:46:40Z",'
|
| + ' "9999-12-31T23:59:59.999999999Z",'
|
| + ' "0001-01-01T00:00:00Z"'
|
| + ']'
|
| + '}'))
|
| + parsed_message = json_format_proto3_pb2.TestTimestamp()
|
| + self.CheckParseBack(message, parsed_message)
|
| + text = (r'{"value": "1970-01-01T00:00:00.01+08:00",'
|
| + r'"repeatedValue":['
|
| + r' "1970-01-01T00:00:00.01+08:30",'
|
| + r' "1970-01-01T00:00:00.01-01:23"]}')
|
| + json_format.Parse(text, parsed_message)
|
| + self.assertEqual(parsed_message.value.seconds, -8 * 3600)
|
| + self.assertEqual(parsed_message.value.nanos, 10000000)
|
| + self.assertEqual(parsed_message.repeated_value[0].seconds, -8.5 * 3600)
|
| + self.assertEqual(parsed_message.repeated_value[1].seconds, 3600 + 23 * 60)
|
| +
|
| + def testDurationMessage(self):
|
| + message = json_format_proto3_pb2.TestDuration()
|
| + message.value.seconds = 1
|
| + message.repeated_value.add().seconds = 0
|
| + message.repeated_value[0].nanos = 10
|
| + message.repeated_value.add().seconds = -1
|
| + message.repeated_value[1].nanos = -1000
|
| + message.repeated_value.add().seconds = 10
|
| + message.repeated_value[2].nanos = 11000000
|
| + message.repeated_value.add().seconds = -315576000000
|
| + message.repeated_value.add().seconds = 315576000000
|
| + self.assertEqual(
|
| + json.loads(json_format.MessageToJson(message, True)),
|
| + json.loads('{'
|
| + '"value": "1s",'
|
| + '"repeatedValue": ['
|
| + ' "0.000000010s",'
|
| + ' "-1.000001s",'
|
| + ' "10.011s",'
|
| + ' "-315576000000s",'
|
| + ' "315576000000s"'
|
| + ']'
|
| + '}'))
|
| + parsed_message = json_format_proto3_pb2.TestDuration()
|
| + self.CheckParseBack(message, parsed_message)
|
| +
|
| + def testFieldMaskMessage(self):
|
| + message = json_format_proto3_pb2.TestFieldMask()
|
| + message.value.paths.append('foo.bar')
|
| + message.value.paths.append('bar')
|
| + self.assertEqual(
|
| + json_format.MessageToJson(message, True),
|
| + '{\n'
|
| + ' "value": "foo.bar,bar"\n'
|
| + '}')
|
| + parsed_message = json_format_proto3_pb2.TestFieldMask()
|
| + self.CheckParseBack(message, parsed_message)
|
| +
|
| + def testWrapperMessage(self):
|
| + message = json_format_proto3_pb2.TestWrapper()
|
| + message.bool_value.value = False
|
| + message.int32_value.value = 0
|
| + message.string_value.value = ''
|
| + message.bytes_value.value = b''
|
| + message.repeated_bool_value.add().value = True
|
| + message.repeated_bool_value.add().value = False
|
| + self.assertEqual(
|
| + json.loads(json_format.MessageToJson(message, True)),
|
| + json.loads('{\n'
|
| + ' "int32Value": 0,'
|
| + ' "boolValue": false,'
|
| + ' "stringValue": "",'
|
| + ' "bytesValue": "",'
|
| + ' "repeatedBoolValue": [true, false],'
|
| + ' "repeatedInt32Value": [],'
|
| + ' "repeatedUint32Value": [],'
|
| + ' "repeatedFloatValue": [],'
|
| + ' "repeatedDoubleValue": [],'
|
| + ' "repeatedBytesValue": [],'
|
| + ' "repeatedInt64Value": [],'
|
| + ' "repeatedUint64Value": [],'
|
| + ' "repeatedStringValue": []'
|
| + '}'))
|
| + parsed_message = json_format_proto3_pb2.TestWrapper()
|
| + self.CheckParseBack(message, parsed_message)
|
| +
|
| + def testParseNull(self):
|
| + message = json_format_proto3_pb2.TestMessage()
|
| + message.repeated_int32_value.append(1)
|
| + message.repeated_int32_value.append(2)
|
| + message.repeated_int32_value.append(3)
|
| + parsed_message = json_format_proto3_pb2.TestMessage()
|
| + self.FillAllFields(parsed_message)
|
| + json_format.Parse('{"int32Value": null, '
|
| + '"int64Value": null, '
|
| + '"uint32Value": null,'
|
| + '"uint64Value": null,'
|
| + '"floatValue": null,'
|
| + '"doubleValue": null,'
|
| + '"boolValue": null,'
|
| + '"stringValue": null,'
|
| + '"bytesValue": null,'
|
| + '"messageValue": null,'
|
| + '"enumValue": null,'
|
| + '"repeatedInt32Value": [1, 2, null, 3],'
|
| + '"repeatedInt64Value": null,'
|
| + '"repeatedUint32Value": null,'
|
| + '"repeatedUint64Value": null,'
|
| + '"repeatedFloatValue": null,'
|
| + '"repeatedDoubleValue": null,'
|
| + '"repeatedBoolValue": null,'
|
| + '"repeatedStringValue": null,'
|
| + '"repeatedBytesValue": null,'
|
| + '"repeatedMessageValue": null,'
|
| + '"repeatedEnumValue": null'
|
| + '}',
|
| + parsed_message)
|
| + self.assertEqual(message, parsed_message)
|
| +
|
| + def testNanFloat(self):
|
| + message = json_format_proto3_pb2.TestMessage()
|
| + message.float_value = float('nan')
|
| + text = '{\n "floatValue": "NaN"\n}'
|
| + self.assertEqual(json_format.MessageToJson(message), text)
|
| + parsed_message = json_format_proto3_pb2.TestMessage()
|
| + json_format.Parse(text, parsed_message)
|
| + self.assertTrue(math.isnan(parsed_message.float_value))
|
| +
|
| + def testParseEmptyText(self):
|
| + self.CheckError('',
|
| + r'Failed to load JSON: (Expecting value)|(No JSON).')
|
| +
|
| + def testParseBadEnumValue(self):
|
| + self.CheckError(
|
| + '{"enumValue": 1}',
|
| + 'Enum value must be a string literal with double quotes. '
|
| + 'Type "proto3.EnumType" has no value named 1.')
|
| + self.CheckError(
|
| + '{"enumValue": "baz"}',
|
| + 'Enum value must be a string literal with double quotes. '
|
| + 'Type "proto3.EnumType" has no value named baz.')
|
| +
|
| + def testParseBadIdentifer(self):
|
| + self.CheckError('{int32Value: 1}',
|
| + (r'Failed to load JSON: Expecting property name'
|
| + r'( enclosed in double quotes)?: line 1'))
|
| + self.CheckError('{"unknownName": 1}',
|
| + 'Message type "proto3.TestMessage" has no field named '
|
| + '"unknownName".')
|
| +
|
| + def testDuplicateField(self):
|
| + # Duplicate key check is not supported for python2.6
|
| + if sys.version_info < (2, 7):
|
| + return
|
| + self.CheckError('{"int32Value": 1,\n"int32Value":2}',
|
| + 'Failed to load JSON: duplicate key int32Value.')
|
| +
|
| + def testInvalidBoolValue(self):
|
| + self.CheckError('{"boolValue": 1}',
|
| + 'Failed to parse boolValue field: '
|
| + 'Expected true or false without quotes.')
|
| + self.CheckError('{"boolValue": "true"}',
|
| + 'Failed to parse boolValue field: '
|
| + 'Expected true or false without quotes.')
|
| +
|
| + def testInvalidIntegerValue(self):
|
| + message = json_format_proto3_pb2.TestMessage()
|
| + text = '{"int32Value": 0x12345}'
|
| + self.assertRaises(json_format.ParseError,
|
| + json_format.Parse, text, message)
|
| + self.CheckError('{"int32Value": 012345}',
|
| + (r'Failed to load JSON: Expecting \'?,\'? delimiter: '
|
| + r'line 1.'))
|
| + self.CheckError('{"int32Value": 1.0}',
|
| + 'Failed to parse int32Value field: '
|
| + 'Couldn\'t parse integer: 1.0.')
|
| + self.CheckError('{"int32Value": " 1 "}',
|
| + 'Failed to parse int32Value field: '
|
| + 'Couldn\'t parse integer: " 1 ".')
|
| + self.CheckError('{"int32Value": "1 "}',
|
| + 'Failed to parse int32Value field: '
|
| + 'Couldn\'t parse integer: "1 ".')
|
| + self.CheckError('{"int32Value": 12345678901234567890}',
|
| + 'Failed to parse int32Value field: Value out of range: '
|
| + '12345678901234567890.')
|
| + self.CheckError('{"int32Value": 1e5}',
|
| + 'Failed to parse int32Value field: '
|
| + 'Couldn\'t parse integer: 100000.0.')
|
| + self.CheckError('{"uint32Value": -1}',
|
| + 'Failed to parse uint32Value field: '
|
| + 'Value out of range: -1.')
|
| +
|
| + def testInvalidFloatValue(self):
|
| + self.CheckError('{"floatValue": "nan"}',
|
| + 'Failed to parse floatValue field: Couldn\'t '
|
| + 'parse float "nan", use "NaN" instead.')
|
| +
|
| + def testInvalidBytesValue(self):
|
| + self.CheckError('{"bytesValue": "AQI"}',
|
| + 'Failed to parse bytesValue field: Incorrect padding.')
|
| + self.CheckError('{"bytesValue": "AQI*"}',
|
| + 'Failed to parse bytesValue field: Incorrect padding.')
|
| +
|
| + def testInvalidMap(self):
|
| + message = json_format_proto3_pb2.TestMap()
|
| + text = '{"int32Map": {"null": 2, "2": 3}}'
|
| + self.assertRaisesRegexp(
|
| + json_format.ParseError,
|
| + 'Failed to parse int32Map field: invalid literal',
|
| + json_format.Parse, text, message)
|
| + text = '{"int32Map": {1: 2, "2": 3}}'
|
| + self.assertRaisesRegexp(
|
| + json_format.ParseError,
|
| + (r'Failed to load JSON: Expecting property name'
|
| + r'( enclosed in double quotes)?: line 1'),
|
| + json_format.Parse, text, message)
|
| + text = '{"boolMap": {"null": 1}}'
|
| + self.assertRaisesRegexp(
|
| + json_format.ParseError,
|
| + 'Failed to parse boolMap field: Expected "true" or "false", not null.',
|
| + json_format.Parse, text, message)
|
| + if sys.version_info < (2, 7):
|
| + return
|
| + text = r'{"stringMap": {"a": 3, "\u0061": 2}}'
|
| + self.assertRaisesRegexp(
|
| + json_format.ParseError,
|
| + 'Failed to load JSON: duplicate key a',
|
| + json_format.Parse, text, message)
|
| +
|
| + def testInvalidTimestamp(self):
|
| + message = json_format_proto3_pb2.TestTimestamp()
|
| + text = '{"value": "10000-01-01T00:00:00.00Z"}'
|
| + self.assertRaisesRegexp(
|
| + json_format.ParseError,
|
| + 'time data \'10000-01-01T00:00:00\' does not match'
|
| + ' format \'%Y-%m-%dT%H:%M:%S\'.',
|
| + json_format.Parse, text, message)
|
| + text = '{"value": "1970-01-01T00:00:00.0123456789012Z"}'
|
| + self.assertRaisesRegexp(
|
| + well_known_types.ParseError,
|
| + 'nanos 0123456789012 more than 9 fractional digits.',
|
| + json_format.Parse, text, message)
|
| + text = '{"value": "1972-01-01T01:00:00.01+08"}'
|
| + self.assertRaisesRegexp(
|
| + well_known_types.ParseError,
|
| + (r'Invalid timezone offset value: \+08.'),
|
| + json_format.Parse, text, message)
|
| + # Time smaller than minimum time.
|
| + text = '{"value": "0000-01-01T00:00:00Z"}'
|
| + self.assertRaisesRegexp(
|
| + json_format.ParseError,
|
| + 'Failed to parse value field: year is out of range.',
|
| + json_format.Parse, text, message)
|
| + # Time bigger than maxinum time.
|
| + message.value.seconds = 253402300800
|
| + self.assertRaisesRegexp(
|
| + OverflowError,
|
| + 'date value out of range',
|
| + json_format.MessageToJson, message)
|
| +
|
| + def testInvalidOneof(self):
|
| + message = json_format_proto3_pb2.TestOneof()
|
| + text = '{"oneofInt32Value": 1, "oneofStringValue": "2"}'
|
| + self.assertRaisesRegexp(
|
| + json_format.ParseError,
|
| + 'Message type "proto3.TestOneof"'
|
| + ' should not have multiple "oneof_value" oneof fields.',
|
| + json_format.Parse, text, message)
|
| +
|
| +
|
| +if __name__ == '__main__':
|
| + unittest.main()
|
|
|