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 |
index be3ad11ae0a18676a23790fc6c5c1cc11ec2dfd2..bdc9f49a4071ad077807f1db56f88149999a4998 100644 |
--- a/third_party/protobuf/python/google/protobuf/internal/json_format_test.py |
+++ b/third_party/protobuf/python/google/protobuf/internal/json_format_test.py |
@@ -39,9 +39,16 @@ import math |
import sys |
try: |
- import unittest2 as unittest |
+ import unittest2 as unittest #PY26 |
except ImportError: |
import unittest |
+ |
+from google.protobuf import any_pb2 |
+from google.protobuf import duration_pb2 |
+from google.protobuf import field_mask_pb2 |
+from google.protobuf import struct_pb2 |
+from google.protobuf import timestamp_pb2 |
+from google.protobuf import wrappers_pb2 |
from google.protobuf.internal import well_known_types |
from google.protobuf import json_format |
from google.protobuf.util import json_format_proto3_pb2 |
@@ -326,6 +333,7 @@ class JsonFormatTest(JsonFormatBase): |
message.bytes_value.value = b'' |
message.repeated_bool_value.add().value = True |
message.repeated_bool_value.add().value = False |
+ message.repeated_int32_value.add() |
self.assertEqual( |
json.loads(json_format.MessageToJson(message, True)), |
json.loads('{\n' |
@@ -334,7 +342,7 @@ class JsonFormatTest(JsonFormatBase): |
' "stringValue": "",' |
' "bytesValue": "",' |
' "repeatedBoolValue": [true, false],' |
- ' "repeatedInt32Value": [],' |
+ ' "repeatedInt32Value": [0],' |
' "repeatedUint32Value": [],' |
' "repeatedFloatValue": [],' |
' "repeatedDoubleValue": [],' |
@@ -346,11 +354,192 @@ class JsonFormatTest(JsonFormatBase): |
parsed_message = json_format_proto3_pb2.TestWrapper() |
self.CheckParseBack(message, parsed_message) |
+ def testStructMessage(self): |
+ message = json_format_proto3_pb2.TestStruct() |
+ message.value['name'] = 'Jim' |
+ message.value['age'] = 10 |
+ message.value['attend'] = True |
+ message.value['email'] = None |
+ message.value.get_or_create_struct('address')['city'] = 'SFO' |
+ message.value['address']['house_number'] = 1024 |
+ struct_list = message.value.get_or_create_list('list') |
+ struct_list.extend([6, 'seven', True, False, None]) |
+ struct_list.add_struct()['subkey2'] = 9 |
+ message.repeated_value.add()['age'] = 11 |
+ message.repeated_value.add() |
+ self.assertEqual( |
+ json.loads(json_format.MessageToJson(message, False)), |
+ json.loads( |
+ '{' |
+ ' "value": {' |
+ ' "address": {' |
+ ' "city": "SFO", ' |
+ ' "house_number": 1024' |
+ ' }, ' |
+ ' "age": 10, ' |
+ ' "name": "Jim", ' |
+ ' "attend": true, ' |
+ ' "email": null, ' |
+ ' "list": [6, "seven", true, false, null, {"subkey2": 9}]' |
+ ' },' |
+ ' "repeatedValue": [{"age": 11}, {}]' |
+ '}')) |
+ parsed_message = json_format_proto3_pb2.TestStruct() |
+ self.CheckParseBack(message, parsed_message) |
+ |
+ def testValueMessage(self): |
+ message = json_format_proto3_pb2.TestValue() |
+ message.value.string_value = 'hello' |
+ message.repeated_value.add().number_value = 11.1 |
+ message.repeated_value.add().bool_value = False |
+ message.repeated_value.add().null_value = 0 |
+ self.assertEqual( |
+ json.loads(json_format.MessageToJson(message, False)), |
+ json.loads( |
+ '{' |
+ ' "value": "hello",' |
+ ' "repeatedValue": [11.1, false, null]' |
+ '}')) |
+ parsed_message = json_format_proto3_pb2.TestValue() |
+ self.CheckParseBack(message, parsed_message) |
+ # Can't parse back if the Value message is not set. |
+ message.repeated_value.add() |
+ self.assertEqual( |
+ json.loads(json_format.MessageToJson(message, False)), |
+ json.loads( |
+ '{' |
+ ' "value": "hello",' |
+ ' "repeatedValue": [11.1, false, null, null]' |
+ '}')) |
+ |
+ def testListValueMessage(self): |
+ message = json_format_proto3_pb2.TestListValue() |
+ message.value.values.add().number_value = 11.1 |
+ message.value.values.add().null_value = 0 |
+ message.value.values.add().bool_value = True |
+ message.value.values.add().string_value = 'hello' |
+ message.value.values.add().struct_value['name'] = 'Jim' |
+ message.repeated_value.add().values.add().number_value = 1 |
+ message.repeated_value.add() |
+ self.assertEqual( |
+ json.loads(json_format.MessageToJson(message, False)), |
+ json.loads( |
+ '{"value": [11.1, null, true, "hello", {"name": "Jim"}]\n,' |
+ '"repeatedValue": [[1], []]}')) |
+ parsed_message = json_format_proto3_pb2.TestListValue() |
+ self.CheckParseBack(message, parsed_message) |
+ |
+ def testAnyMessage(self): |
+ message = json_format_proto3_pb2.TestAny() |
+ value1 = json_format_proto3_pb2.MessageType() |
+ value2 = json_format_proto3_pb2.MessageType() |
+ value1.value = 1234 |
+ value2.value = 5678 |
+ message.value.Pack(value1) |
+ message.repeated_value.add().Pack(value1) |
+ message.repeated_value.add().Pack(value2) |
+ message.repeated_value.add() |
+ self.assertEqual( |
+ json.loads(json_format.MessageToJson(message, True)), |
+ json.loads( |
+ '{\n' |
+ ' "repeatedValue": [ {\n' |
+ ' "@type": "type.googleapis.com/proto3.MessageType",\n' |
+ ' "value": 1234\n' |
+ ' }, {\n' |
+ ' "@type": "type.googleapis.com/proto3.MessageType",\n' |
+ ' "value": 5678\n' |
+ ' },\n' |
+ ' {}],\n' |
+ ' "value": {\n' |
+ ' "@type": "type.googleapis.com/proto3.MessageType",\n' |
+ ' "value": 1234\n' |
+ ' }\n' |
+ '}\n')) |
+ parsed_message = json_format_proto3_pb2.TestAny() |
+ self.CheckParseBack(message, parsed_message) |
+ |
+ def testWellKnownInAnyMessage(self): |
+ message = any_pb2.Any() |
+ int32_value = wrappers_pb2.Int32Value() |
+ int32_value.value = 1234 |
+ message.Pack(int32_value) |
+ self.assertEqual( |
+ json.loads(json_format.MessageToJson(message, True)), |
+ json.loads( |
+ '{\n' |
+ ' "@type": \"type.googleapis.com/google.protobuf.Int32Value\",\n' |
+ ' "value": 1234\n' |
+ '}\n')) |
+ parsed_message = any_pb2.Any() |
+ self.CheckParseBack(message, parsed_message) |
+ |
+ timestamp = timestamp_pb2.Timestamp() |
+ message.Pack(timestamp) |
+ self.assertEqual( |
+ json.loads(json_format.MessageToJson(message, True)), |
+ json.loads( |
+ '{\n' |
+ ' "@type": "type.googleapis.com/google.protobuf.Timestamp",\n' |
+ ' "value": "1970-01-01T00:00:00Z"\n' |
+ '}\n')) |
+ self.CheckParseBack(message, parsed_message) |
+ |
+ duration = duration_pb2.Duration() |
+ duration.seconds = 1 |
+ message.Pack(duration) |
+ self.assertEqual( |
+ json.loads(json_format.MessageToJson(message, True)), |
+ json.loads( |
+ '{\n' |
+ ' "@type": "type.googleapis.com/google.protobuf.Duration",\n' |
+ ' "value": "1s"\n' |
+ '}\n')) |
+ self.CheckParseBack(message, parsed_message) |
+ |
+ field_mask = field_mask_pb2.FieldMask() |
+ field_mask.paths.append('foo.bar') |
+ field_mask.paths.append('bar') |
+ message.Pack(field_mask) |
+ self.assertEqual( |
+ json.loads(json_format.MessageToJson(message, True)), |
+ json.loads( |
+ '{\n' |
+ ' "@type": "type.googleapis.com/google.protobuf.FieldMask",\n' |
+ ' "value": "foo.bar,bar"\n' |
+ '}\n')) |
+ self.CheckParseBack(message, parsed_message) |
+ |
+ struct_message = struct_pb2.Struct() |
+ struct_message['name'] = 'Jim' |
+ message.Pack(struct_message) |
+ self.assertEqual( |
+ json.loads(json_format.MessageToJson(message, True)), |
+ json.loads( |
+ '{\n' |
+ ' "@type": "type.googleapis.com/google.protobuf.Struct",\n' |
+ ' "value": {"name": "Jim"}\n' |
+ '}\n')) |
+ self.CheckParseBack(message, parsed_message) |
+ |
+ nested_any = any_pb2.Any() |
+ int32_value.value = 5678 |
+ nested_any.Pack(int32_value) |
+ message.Pack(nested_any) |
+ self.assertEqual( |
+ json.loads(json_format.MessageToJson(message, True)), |
+ json.loads( |
+ '{\n' |
+ ' "@type": "type.googleapis.com/google.protobuf.Any",\n' |
+ ' "value": {\n' |
+ ' "@type": "type.googleapis.com/google.protobuf.Int32Value",\n' |
+ ' "value": 5678\n' |
+ ' }\n' |
+ '}\n')) |
+ 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, ' |
@@ -364,7 +553,7 @@ class JsonFormatTest(JsonFormatBase): |
'"bytesValue": null,' |
'"messageValue": null,' |
'"enumValue": null,' |
- '"repeatedInt32Value": [1, 2, null, 3],' |
+ '"repeatedInt32Value": null,' |
'"repeatedInt64Value": null,' |
'"repeatedUint32Value": null,' |
'"repeatedUint64Value": null,' |
@@ -378,6 +567,13 @@ class JsonFormatTest(JsonFormatBase): |
'}', |
parsed_message) |
self.assertEqual(message, parsed_message) |
+ self.assertRaisesRegexp( |
+ json_format.ParseError, |
+ 'Failed to parse repeatedInt32Value field: ' |
+ 'null is not allowed to be used as an element in a repeated field.', |
+ json_format.Parse, |
+ '{"repeatedInt32Value":[1, null]}', |
+ parsed_message) |
def testNanFloat(self): |
message = json_format_proto3_pb2.TestMessage() |
@@ -529,6 +725,45 @@ class JsonFormatTest(JsonFormatBase): |
' should not have multiple "oneof_value" oneof fields.', |
json_format.Parse, text, message) |
+ def testInvalidListValue(self): |
+ message = json_format_proto3_pb2.TestListValue() |
+ text = '{"value": 1234}' |
+ self.assertRaisesRegexp( |
+ json_format.ParseError, |
+ r'Failed to parse value field: ListValue must be in \[\] which is 1234', |
+ json_format.Parse, text, message) |
+ |
+ def testInvalidStruct(self): |
+ message = json_format_proto3_pb2.TestStruct() |
+ text = '{"value": 1234}' |
+ self.assertRaisesRegexp( |
+ json_format.ParseError, |
+ 'Failed to parse value field: Struct must be in a dict which is 1234', |
+ json_format.Parse, text, message) |
+ |
+ def testInvalidAny(self): |
+ message = any_pb2.Any() |
+ text = '{"@type": "type.googleapis.com/google.protobuf.Int32Value"}' |
+ self.assertRaisesRegexp( |
+ KeyError, |
+ 'value', |
+ json_format.Parse, text, message) |
+ text = '{"value": 1234}' |
+ self.assertRaisesRegexp( |
+ json_format.ParseError, |
+ '@type is missing when parsing any message.', |
+ json_format.Parse, text, message) |
+ text = '{"@type": "type.googleapis.com/MessageNotExist", "value": 1234}' |
+ self.assertRaisesRegexp( |
+ TypeError, |
+ 'Can not find message descriptor by type_url: ' |
+ 'type.googleapis.com/MessageNotExist.', |
+ json_format.Parse, text, message) |
+ # Only last part is to be used: b/25630112 |
+ text = (r'{"@type": "incorrect.googleapis.com/google.protobuf.Int32Value",' |
+ r'"value": 1234}') |
+ json_format.Parse(text, message) |
+ |
if __name__ == '__main__': |
unittest.main() |