Index: tools/telemetry/third_party/gsutil/third_party/protorpc/protorpc/protojson_test.py |
diff --git a/tools/telemetry/third_party/gsutil/third_party/protorpc/protorpc/protojson_test.py b/tools/telemetry/third_party/gsutil/third_party/protorpc/protorpc/protojson_test.py |
deleted file mode 100644 |
index 1ed23e201a3dd8a02c40f9b0ac0fe8485c78c2ff..0000000000000000000000000000000000000000 |
--- a/tools/telemetry/third_party/gsutil/third_party/protorpc/protorpc/protojson_test.py |
+++ /dev/null |
@@ -1,554 +0,0 @@ |
-#!/usr/bin/env python |
-# |
-# Copyright 2010 Google Inc. |
-# |
-# Licensed under the Apache License, Version 2.0 (the "License"); |
-# you may not use this file except in compliance with the License. |
-# You may obtain a copy of the License at |
-# |
-# http://www.apache.org/licenses/LICENSE-2.0 |
-# |
-# Unless required by applicable law or agreed to in writing, software |
-# distributed under the License is distributed on an "AS IS" BASIS, |
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
-# See the License for the specific language governing permissions and |
-# limitations under the License. |
-# |
- |
-"""Tests for protorpc.protojson.""" |
- |
-__author__ = 'rafek@google.com (Rafe Kaplan)' |
- |
- |
-import datetime |
-import imp |
-import sys |
-import unittest |
- |
-from protorpc import message_types |
-from protorpc import messages |
-from protorpc import protojson |
-from protorpc import test_util |
- |
-import simplejson |
- |
- |
-class CustomField(messages.MessageField): |
- """Custom MessageField class.""" |
- |
- type = int |
- message_type = message_types.VoidMessage |
- |
- def __init__(self, number, **kwargs): |
- super(CustomField, self).__init__(self.message_type, number, **kwargs) |
- |
- def value_to_message(self, value): |
- return self.message_type() |
- |
- |
-class MyMessage(messages.Message): |
- """Test message containing various types.""" |
- |
- class Color(messages.Enum): |
- |
- RED = 1 |
- GREEN = 2 |
- BLUE = 3 |
- |
- class Nested(messages.Message): |
- |
- nested_value = messages.StringField(1) |
- |
- a_string = messages.StringField(2) |
- an_integer = messages.IntegerField(3) |
- a_float = messages.FloatField(4) |
- a_boolean = messages.BooleanField(5) |
- an_enum = messages.EnumField(Color, 6) |
- a_nested = messages.MessageField(Nested, 7) |
- a_repeated = messages.IntegerField(8, repeated=True) |
- a_repeated_float = messages.FloatField(9, repeated=True) |
- a_datetime = message_types.DateTimeField(10) |
- a_repeated_datetime = message_types.DateTimeField(11, repeated=True) |
- a_custom = CustomField(12) |
- a_repeated_custom = CustomField(13, repeated=True) |
- |
- |
-class ModuleInterfaceTest(test_util.ModuleInterfaceTest, |
- test_util.TestCase): |
- |
- MODULE = protojson |
- |
- |
-# TODO(rafek): Convert this test to the compliance test in test_util. |
-class ProtojsonTest(test_util.TestCase, |
- test_util.ProtoConformanceTestBase): |
- """Test JSON encoding and decoding.""" |
- |
- PROTOLIB = protojson |
- |
- def CompareEncoded(self, expected_encoded, actual_encoded): |
- """JSON encoding will be laundered to remove string differences.""" |
- self.assertEquals(simplejson.loads(expected_encoded), |
- simplejson.loads(actual_encoded)) |
- |
- encoded_empty_message = '{}' |
- |
- encoded_partial = """{ |
- "double_value": 1.23, |
- "int64_value": -100000000000, |
- "int32_value": 1020, |
- "string_value": "a string", |
- "enum_value": "VAL2" |
- } |
- """ |
- |
- encoded_full = """{ |
- "double_value": 1.23, |
- "float_value": -2.5, |
- "int64_value": -100000000000, |
- "uint64_value": 102020202020, |
- "int32_value": 1020, |
- "bool_value": true, |
- "string_value": "a string\u044f", |
- "bytes_value": "YSBieXRlc//+", |
- "enum_value": "VAL2" |
- } |
- """ |
- |
- encoded_repeated = """{ |
- "double_value": [1.23, 2.3], |
- "float_value": [-2.5, 0.5], |
- "int64_value": [-100000000000, 20], |
- "uint64_value": [102020202020, 10], |
- "int32_value": [1020, 718], |
- "bool_value": [true, false], |
- "string_value": ["a string\u044f", "another string"], |
- "bytes_value": ["YSBieXRlc//+", "YW5vdGhlciBieXRlcw=="], |
- "enum_value": ["VAL2", "VAL1"] |
- } |
- """ |
- |
- encoded_nested = """{ |
- "nested": { |
- "a_value": "a string" |
- } |
- } |
- """ |
- |
- encoded_repeated_nested = """{ |
- "repeated_nested": [{"a_value": "a string"}, |
- {"a_value": "another string"}] |
- } |
- """ |
- |
- unexpected_tag_message = '{"unknown": "value"}' |
- |
- encoded_default_assigned = '{"a_value": "a default"}' |
- |
- encoded_nested_empty = '{"nested": {}}' |
- |
- encoded_repeated_nested_empty = '{"repeated_nested": [{}, {}]}' |
- |
- encoded_extend_message = '{"int64_value": [400, 50, 6000]}' |
- |
- encoded_string_types = '{"string_value": "Latin"}' |
- |
- encoded_invalid_enum = '{"enum_value": "undefined"}' |
- |
- def testConvertIntegerToFloat(self): |
- """Test that integers passed in to float fields are converted. |
- |
- This is necessary because JSON outputs integers for numbers with 0 decimals. |
- """ |
- message = protojson.decode_message(MyMessage, '{"a_float": 10}') |
- |
- self.assertTrue(isinstance(message.a_float, float)) |
- self.assertEquals(10.0, message.a_float) |
- |
- def testConvertStringToNumbers(self): |
- """Test that strings passed to integer fields are converted.""" |
- message = protojson.decode_message(MyMessage, |
- """{"an_integer": "10", |
- "a_float": "3.5", |
- "a_repeated": ["1", "2"], |
- "a_repeated_float": ["1.5", "2", 10] |
- }""") |
- |
- self.assertEquals(MyMessage(an_integer=10, |
- a_float=3.5, |
- a_repeated=[1, 2], |
- a_repeated_float=[1.5, 2.0, 10.0]), |
- message) |
- |
- def testWrongTypeAssignment(self): |
- """Test when wrong type is assigned to a field.""" |
- self.assertRaises(messages.ValidationError, |
- protojson.decode_message, |
- MyMessage, '{"a_string": 10}') |
- self.assertRaises(messages.ValidationError, |
- protojson.decode_message, |
- MyMessage, '{"an_integer": 10.2}') |
- self.assertRaises(messages.ValidationError, |
- protojson.decode_message, |
- MyMessage, '{"an_integer": "10.2"}') |
- |
- def testNumericEnumeration(self): |
- """Test that numbers work for enum values.""" |
- message = protojson.decode_message(MyMessage, '{"an_enum": 2}') |
- |
- expected_message = MyMessage() |
- expected_message.an_enum = MyMessage.Color.GREEN |
- |
- self.assertEquals(expected_message, message) |
- |
- def testNumericEnumerationNegativeTest(self): |
- """Test with an invalid number for the enum value.""" |
- self.assertRaisesRegexp( |
- messages.DecodeError, |
- 'Invalid enum value "89"', |
- protojson.decode_message, |
- MyMessage, |
- '{"an_enum": 89}') |
- |
- def testAlphaEnumeration(self): |
- """Test that alpha enum values work.""" |
- message = protojson.decode_message(MyMessage, '{"an_enum": "RED"}') |
- |
- expected_message = MyMessage() |
- expected_message.an_enum = MyMessage.Color.RED |
- |
- self.assertEquals(expected_message, message) |
- |
- def testAlphaEnumerationNegativeTest(self): |
- """The alpha enum value is invalid.""" |
- self.assertRaisesRegexp( |
- messages.DecodeError, |
- 'Invalid enum value "IAMINVALID"', |
- protojson.decode_message, |
- MyMessage, |
- '{"an_enum": "IAMINVALID"}') |
- |
- def testEnumerationNegativeTestWithEmptyString(self): |
- """The enum value is an empty string.""" |
- self.assertRaisesRegexp( |
- messages.DecodeError, |
- 'Invalid enum value ""', |
- protojson.decode_message, |
- MyMessage, |
- '{"an_enum": ""}') |
- |
- def testNullValues(self): |
- """Test that null values overwrite existing values.""" |
- self.assertEquals(MyMessage(), |
- protojson.decode_message(MyMessage, |
- ('{"an_integer": null,' |
- ' "a_nested": null,' |
- ' "an_enum": null' |
- '}'))) |
- |
- def testEmptyList(self): |
- """Test that empty lists are ignored.""" |
- self.assertEquals(MyMessage(), |
- protojson.decode_message(MyMessage, |
- '{"a_repeated": []}')) |
- |
- def testNotJSON(self): |
- """Test error when string is not valid JSON.""" |
- self.assertRaises(ValueError, |
- protojson.decode_message, MyMessage, '{this is not json}') |
- |
- def testDoNotEncodeStrangeObjects(self): |
- """Test trying to encode a strange object. |
- |
- The main purpose of this test is to complete coverage. It ensures that |
- the default behavior of the JSON encoder is preserved when someone tries to |
- serialized an unexpected type. |
- """ |
- class BogusObject(object): |
- |
- def check_initialized(self): |
- pass |
- |
- self.assertRaises(TypeError, |
- protojson.encode_message, |
- BogusObject()) |
- |
- def testMergeEmptyString(self): |
- """Test merging the empty or space only string.""" |
- message = protojson.decode_message(test_util.OptionalMessage, '') |
- self.assertEquals(test_util.OptionalMessage(), message) |
- |
- message = protojson.decode_message(test_util.OptionalMessage, ' ') |
- self.assertEquals(test_util.OptionalMessage(), message) |
- |
- def testProtojsonUnrecognizedFieldName(self): |
- """Test that unrecognized fields are saved and can be accessed.""" |
- decoded = protojson.decode_message(MyMessage, |
- ('{"an_integer": 1, "unknown_val": 2}')) |
- self.assertEquals(decoded.an_integer, 1) |
- self.assertEquals(1, len(decoded.all_unrecognized_fields())) |
- self.assertEquals('unknown_val', decoded.all_unrecognized_fields()[0]) |
- self.assertEquals((2, messages.Variant.INT64), |
- decoded.get_unrecognized_field_info('unknown_val')) |
- |
- def testProtojsonUnrecognizedFieldNumber(self): |
- """Test that unrecognized fields are saved and can be accessed.""" |
- decoded = protojson.decode_message( |
- MyMessage, |
- '{"an_integer": 1, "1001": "unknown", "-123": "negative", ' |
- '"456_mixed": 2}') |
- self.assertEquals(decoded.an_integer, 1) |
- self.assertEquals(3, len(decoded.all_unrecognized_fields())) |
- self.assertTrue(1001 in decoded.all_unrecognized_fields()) |
- self.assertEquals(('unknown', messages.Variant.STRING), |
- decoded.get_unrecognized_field_info(1001)) |
- self.assertTrue('-123' in decoded.all_unrecognized_fields()) |
- self.assertEquals(('negative', messages.Variant.STRING), |
- decoded.get_unrecognized_field_info('-123')) |
- self.assertTrue('456_mixed' in decoded.all_unrecognized_fields()) |
- self.assertEquals((2, messages.Variant.INT64), |
- decoded.get_unrecognized_field_info('456_mixed')) |
- |
- def testProtojsonUnrecognizedNull(self): |
- """Test that unrecognized fields that are None are skipped.""" |
- decoded = protojson.decode_message( |
- MyMessage, |
- '{"an_integer": 1, "unrecognized_null": null}') |
- self.assertEquals(decoded.an_integer, 1) |
- self.assertEquals(decoded.all_unrecognized_fields(), []) |
- |
- def testUnrecognizedFieldVariants(self): |
- """Test that unrecognized fields are mapped to the right variants.""" |
- for encoded, expected_variant in ( |
- ('{"an_integer": 1, "unknown_val": 2}', messages.Variant.INT64), |
- ('{"an_integer": 1, "unknown_val": 2.0}', messages.Variant.DOUBLE), |
- ('{"an_integer": 1, "unknown_val": "string value"}', |
- messages.Variant.STRING), |
- ('{"an_integer": 1, "unknown_val": [1, 2, 3]}', messages.Variant.INT64), |
- ('{"an_integer": 1, "unknown_val": [1, 2.0, 3]}', |
- messages.Variant.DOUBLE), |
- ('{"an_integer": 1, "unknown_val": [1, "foo", 3]}', |
- messages.Variant.STRING), |
- ('{"an_integer": 1, "unknown_val": true}', messages.Variant.BOOL)): |
- decoded = protojson.decode_message(MyMessage, encoded) |
- self.assertEquals(decoded.an_integer, 1) |
- self.assertEquals(1, len(decoded.all_unrecognized_fields())) |
- self.assertEquals('unknown_val', decoded.all_unrecognized_fields()[0]) |
- _, decoded_variant = decoded.get_unrecognized_field_info('unknown_val') |
- self.assertEquals(expected_variant, decoded_variant) |
- |
- def testDecodeDateTime(self): |
- for datetime_string, datetime_vals in ( |
- ('2012-09-30T15:31:50.262', (2012, 9, 30, 15, 31, 50, 262000)), |
- ('2012-09-30T15:31:50', (2012, 9, 30, 15, 31, 50, 0))): |
- message = protojson.decode_message( |
- MyMessage, '{"a_datetime": "%s"}' % datetime_string) |
- expected_message = MyMessage( |
- a_datetime=datetime.datetime(*datetime_vals)) |
- |
- self.assertEquals(expected_message, message) |
- |
- def testDecodeInvalidDateTime(self): |
- self.assertRaises(messages.DecodeError, protojson.decode_message, |
- MyMessage, '{"a_datetime": "invalid"}') |
- |
- def testEncodeDateTime(self): |
- for datetime_string, datetime_vals in ( |
- ('2012-09-30T15:31:50.262000', (2012, 9, 30, 15, 31, 50, 262000)), |
- ('2012-09-30T15:31:50.262123', (2012, 9, 30, 15, 31, 50, 262123)), |
- ('2012-09-30T15:31:50', (2012, 9, 30, 15, 31, 50, 0))): |
- decoded_message = protojson.encode_message( |
- MyMessage(a_datetime=datetime.datetime(*datetime_vals))) |
- expected_decoding = '{"a_datetime": "%s"}' % datetime_string |
- self.CompareEncoded(expected_decoding, decoded_message) |
- |
- def testDecodeRepeatedDateTime(self): |
- message = protojson.decode_message( |
- MyMessage, |
- '{"a_repeated_datetime": ["2012-09-30T15:31:50.262", ' |
- '"2010-01-21T09:52:00", "2000-01-01T01:00:59.999999"]}') |
- expected_message = MyMessage( |
- a_repeated_datetime=[ |
- datetime.datetime(2012, 9, 30, 15, 31, 50, 262000), |
- datetime.datetime(2010, 1, 21, 9, 52), |
- datetime.datetime(2000, 1, 1, 1, 0, 59, 999999)]) |
- |
- self.assertEquals(expected_message, message) |
- |
- def testDecodeCustom(self): |
- message = protojson.decode_message(MyMessage, '{"a_custom": 1}') |
- self.assertEquals(MyMessage(a_custom=1), message) |
- |
- def testDecodeInvalidCustom(self): |
- self.assertRaises(messages.ValidationError, protojson.decode_message, |
- MyMessage, '{"a_custom": "invalid"}') |
- |
- def testEncodeCustom(self): |
- decoded_message = protojson.encode_message(MyMessage(a_custom=1)) |
- self.CompareEncoded('{"a_custom": 1}', decoded_message) |
- |
- def testDecodeRepeatedCustom(self): |
- message = protojson.decode_message( |
- MyMessage, '{"a_repeated_custom": [1, 2, 3]}') |
- self.assertEquals(MyMessage(a_repeated_custom=[1, 2, 3]), message) |
- |
- def testDecodeBadBase64BytesField(self): |
- """Test decoding improperly encoded base64 bytes value.""" |
- self.assertRaisesWithRegexpMatch( |
- messages.DecodeError, |
- 'Base64 decoding error: Incorrect padding', |
- protojson.decode_message, |
- test_util.OptionalMessage, |
- '{"bytes_value": "abcdefghijklmnopq"}') |
- |
- |
-class CustomProtoJson(protojson.ProtoJson): |
- |
- def encode_field(self, field, value): |
- return '{encoded}' + value |
- |
- def decode_field(self, field, value): |
- return '{decoded}' + value |
- |
- |
-class CustomProtoJsonTest(test_util.TestCase): |
- """Tests for serialization overriding functionality.""" |
- |
- def setUp(self): |
- self.protojson = CustomProtoJson() |
- |
- def testEncode(self): |
- self.assertEqual('{"a_string": "{encoded}xyz"}', |
- self.protojson.encode_message(MyMessage(a_string='xyz'))) |
- |
- def testDecode(self): |
- self.assertEqual( |
- MyMessage(a_string='{decoded}xyz'), |
- self.protojson.decode_message(MyMessage, '{"a_string": "xyz"}')) |
- |
- def testDecodeEmptyMessage(self): |
- self.assertEqual( |
- MyMessage(a_string='{decoded}'), |
- self.protojson.decode_message(MyMessage, '{"a_string": ""}')) |
- |
- def testDefault(self): |
- self.assertTrue(protojson.ProtoJson.get_default(), |
- protojson.ProtoJson.get_default()) |
- |
- instance = CustomProtoJson() |
- protojson.ProtoJson.set_default(instance) |
- self.assertTrue(instance is protojson.ProtoJson.get_default()) |
- |
- |
-class InvalidJsonModule(object): |
- pass |
- |
- |
-class ValidJsonModule(object): |
- class JSONEncoder(object): |
- pass |
- |
- |
-class TestJsonDependencyLoading(test_util.TestCase): |
- """Test loading various implementations of json.""" |
- |
- def get_import(self): |
- """Get __import__ method. |
- |
- Returns: |
- The current __import__ method. |
- """ |
- if isinstance(__builtins__, dict): |
- return __builtins__['__import__'] |
- else: |
- return __builtins__.__import__ |
- |
- def set_import(self, new_import): |
- """Set __import__ method. |
- |
- Args: |
- new_import: Function to replace __import__. |
- """ |
- if isinstance(__builtins__, dict): |
- __builtins__['__import__'] = new_import |
- else: |
- __builtins__.__import__ = new_import |
- |
- def setUp(self): |
- """Save original import function.""" |
- self.simplejson = sys.modules.pop('simplejson', None) |
- self.json = sys.modules.pop('json', None) |
- self.original_import = self.get_import() |
- def block_all_jsons(name, *args, **kwargs): |
- if 'json' in name: |
- if name in sys.modules: |
- module = sys.modules[name] |
- module.name = name |
- return module |
- raise ImportError('Unable to find %s' % name) |
- else: |
- return self.original_import(name, *args, **kwargs) |
- self.set_import(block_all_jsons) |
- |
- def tearDown(self): |
- """Restore original import functions and any loaded modules.""" |
- |
- def reset_module(name, module): |
- if module: |
- sys.modules[name] = module |
- else: |
- sys.modules.pop(name, None) |
- reset_module('simplejson', self.simplejson) |
- reset_module('json', self.json) |
- imp.reload(protojson) |
- |
- def testLoadProtojsonWithValidJsonModule(self): |
- """Test loading protojson module with a valid json dependency.""" |
- sys.modules['json'] = ValidJsonModule |
- |
- # This will cause protojson to reload with the default json module |
- # instead of simplejson. |
- imp.reload(protojson) |
- self.assertEquals('json', protojson.json.name) |
- |
- def testLoadProtojsonWithSimplejsonModule(self): |
- """Test loading protojson module with simplejson dependency.""" |
- sys.modules['simplejson'] = ValidJsonModule |
- |
- # This will cause protojson to reload with the default json module |
- # instead of simplejson. |
- imp.reload(protojson) |
- self.assertEquals('simplejson', protojson.json.name) |
- |
- def testLoadProtojsonWithInvalidJsonModule(self): |
- """Loading protojson module with an invalid json defaults to simplejson.""" |
- sys.modules['json'] = InvalidJsonModule |
- sys.modules['simplejson'] = ValidJsonModule |
- |
- # Ignore bad module and default back to simplejson. |
- imp.reload(protojson) |
- self.assertEquals('simplejson', protojson.json.name) |
- |
- def testLoadProtojsonWithInvalidJsonModuleAndNoSimplejson(self): |
- """Loading protojson module with invalid json and no simplejson.""" |
- sys.modules['json'] = InvalidJsonModule |
- |
- # Bad module without simplejson back raises errors. |
- self.assertRaisesWithRegexpMatch( |
- ImportError, |
- 'json library "json" is not compatible with ProtoRPC', |
- imp.reload, |
- protojson) |
- |
- def testLoadProtojsonWithNoJsonModules(self): |
- """Loading protojson module with invalid json and no simplejson.""" |
- # No json modules raise the first exception. |
- self.assertRaisesWithRegexpMatch( |
- ImportError, |
- 'Unable to find json', |
- imp.reload, |
- protojson) |
- |
- |
-if __name__ == '__main__': |
- unittest.main() |