Index: third_party/google-endpoints/apitools/base/protorpclite/descriptor_test.py |
diff --git a/third_party/google-endpoints/apitools/base/protorpclite/descriptor_test.py b/third_party/google-endpoints/apitools/base/protorpclite/descriptor_test.py |
new file mode 100644 |
index 0000000000000000000000000000000000000000..fc27ec4171552d57525ad5685c269938be9fa74f |
--- /dev/null |
+++ b/third_party/google-endpoints/apitools/base/protorpclite/descriptor_test.py |
@@ -0,0 +1,515 @@ |
+#!/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 apitools.base.protorpclite.descriptor.""" |
+import platform |
+import types |
+ |
+import six |
+import unittest2 |
+ |
+from apitools.base.protorpclite import descriptor |
+from apitools.base.protorpclite import message_types |
+from apitools.base.protorpclite import messages |
+from apitools.base.protorpclite import test_util |
+ |
+ |
+RUSSIA = u'\u0420\u043e\u0441\u0441\u0438\u044f' |
+ |
+ |
+class ModuleInterfaceTest(test_util.ModuleInterfaceTest, |
+ test_util.TestCase): |
+ |
+ MODULE = descriptor |
+ |
+ |
+class DescribeEnumValueTest(test_util.TestCase): |
+ |
+ def testDescribe(self): |
+ class MyEnum(messages.Enum): |
+ MY_NAME = 10 |
+ |
+ expected = descriptor.EnumValueDescriptor() |
+ expected.name = 'MY_NAME' |
+ expected.number = 10 |
+ |
+ described = descriptor.describe_enum_value(MyEnum.MY_NAME) |
+ described.check_initialized() |
+ self.assertEquals(expected, described) |
+ |
+ |
+class DescribeEnumTest(test_util.TestCase): |
+ |
+ def testEmptyEnum(self): |
+ class EmptyEnum(messages.Enum): |
+ pass |
+ |
+ expected = descriptor.EnumDescriptor() |
+ expected.name = 'EmptyEnum' |
+ |
+ described = descriptor.describe_enum(EmptyEnum) |
+ described.check_initialized() |
+ self.assertEquals(expected, described) |
+ |
+ def testNestedEnum(self): |
+ class MyScope(messages.Message): |
+ |
+ class NestedEnum(messages.Enum): |
+ pass |
+ |
+ expected = descriptor.EnumDescriptor() |
+ expected.name = 'NestedEnum' |
+ |
+ described = descriptor.describe_enum(MyScope.NestedEnum) |
+ described.check_initialized() |
+ self.assertEquals(expected, described) |
+ |
+ @unittest2.skipIf('PyPy' in platform.python_implementation(), |
+ 'todo: reenable this') |
+ def testEnumWithItems(self): |
+ class EnumWithItems(messages.Enum): |
+ A = 3 |
+ B = 1 |
+ C = 2 |
+ |
+ expected = descriptor.EnumDescriptor() |
+ expected.name = 'EnumWithItems' |
+ |
+ a = descriptor.EnumValueDescriptor() |
+ a.name = 'A' |
+ a.number = 3 |
+ |
+ b = descriptor.EnumValueDescriptor() |
+ b.name = 'B' |
+ b.number = 1 |
+ |
+ c = descriptor.EnumValueDescriptor() |
+ c.name = 'C' |
+ c.number = 2 |
+ |
+ expected.values = [b, c, a] |
+ |
+ described = descriptor.describe_enum(EnumWithItems) |
+ described.check_initialized() |
+ self.assertEquals(expected, described) |
+ |
+ |
+class DescribeFieldTest(test_util.TestCase): |
+ |
+ def testLabel(self): |
+ for repeated, required, expected_label in ( |
+ (True, False, descriptor.FieldDescriptor.Label.REPEATED), |
+ (False, True, descriptor.FieldDescriptor.Label.REQUIRED), |
+ (False, False, descriptor.FieldDescriptor.Label.OPTIONAL)): |
+ field = messages.IntegerField( |
+ 10, required=required, repeated=repeated) |
+ field.name = 'a_field' |
+ |
+ expected = descriptor.FieldDescriptor() |
+ expected.name = 'a_field' |
+ expected.number = 10 |
+ expected.label = expected_label |
+ expected.variant = descriptor.FieldDescriptor.Variant.INT64 |
+ |
+ described = descriptor.describe_field(field) |
+ described.check_initialized() |
+ self.assertEquals(expected, described) |
+ |
+ def testDefault(self): |
+ test_cases = ( |
+ (messages.IntegerField, 200, '200'), |
+ (messages.FloatField, 1.5, '1.5'), |
+ (messages.FloatField, 1e6, '1000000.0'), |
+ (messages.BooleanField, True, 'true'), |
+ (messages.BooleanField, False, 'false'), |
+ (messages.BytesField, |
+ b''.join([six.int2byte(x) for x in (31, 32, 33)]), |
+ b'\\x1f !'), |
+ (messages.StringField, RUSSIA, RUSSIA), |
+ ) |
+ for field_class, default, expected_default in test_cases: |
+ field = field_class(10, default=default) |
+ field.name = u'a_field' |
+ |
+ expected = descriptor.FieldDescriptor() |
+ expected.name = u'a_field' |
+ expected.number = 10 |
+ expected.label = descriptor.FieldDescriptor.Label.OPTIONAL |
+ expected.variant = field_class.DEFAULT_VARIANT |
+ expected.default_value = expected_default |
+ |
+ described = descriptor.describe_field(field) |
+ described.check_initialized() |
+ self.assertEquals(expected, described) |
+ |
+ def testDefault_EnumField(self): |
+ class MyEnum(messages.Enum): |
+ |
+ VAL = 1 |
+ |
+ module_name = test_util.get_module_name(MyEnum) |
+ field = messages.EnumField(MyEnum, 10, default=MyEnum.VAL) |
+ field.name = 'a_field' |
+ |
+ expected = descriptor.FieldDescriptor() |
+ expected.name = 'a_field' |
+ expected.number = 10 |
+ expected.label = descriptor.FieldDescriptor.Label.OPTIONAL |
+ expected.variant = messages.EnumField.DEFAULT_VARIANT |
+ expected.type_name = '%s.MyEnum' % module_name |
+ expected.default_value = '1' |
+ |
+ described = descriptor.describe_field(field) |
+ self.assertEquals(expected, described) |
+ |
+ def testMessageField(self): |
+ field = messages.MessageField(descriptor.FieldDescriptor, 10) |
+ field.name = 'a_field' |
+ |
+ expected = descriptor.FieldDescriptor() |
+ expected.name = 'a_field' |
+ expected.number = 10 |
+ expected.label = descriptor.FieldDescriptor.Label.OPTIONAL |
+ expected.variant = messages.MessageField.DEFAULT_VARIANT |
+ expected.type_name = ( |
+ 'apitools.base.protorpclite.descriptor.FieldDescriptor') |
+ |
+ described = descriptor.describe_field(field) |
+ described.check_initialized() |
+ self.assertEquals(expected, described) |
+ |
+ def testDateTimeField(self): |
+ field = message_types.DateTimeField(20) |
+ field.name = 'a_timestamp' |
+ |
+ expected = descriptor.FieldDescriptor() |
+ expected.name = 'a_timestamp' |
+ expected.number = 20 |
+ expected.label = descriptor.FieldDescriptor.Label.OPTIONAL |
+ expected.variant = messages.MessageField.DEFAULT_VARIANT |
+ expected.type_name = ( |
+ 'apitools.base.protorpclite.message_types.DateTimeMessage') |
+ |
+ described = descriptor.describe_field(field) |
+ described.check_initialized() |
+ self.assertEquals(expected, described) |
+ |
+ |
+class DescribeMessageTest(test_util.TestCase): |
+ |
+ def testEmptyDefinition(self): |
+ class MyMessage(messages.Message): |
+ pass |
+ |
+ expected = descriptor.MessageDescriptor() |
+ expected.name = 'MyMessage' |
+ |
+ described = descriptor.describe_message(MyMessage) |
+ described.check_initialized() |
+ self.assertEquals(expected, described) |
+ |
+ def testDefinitionWithFields(self): |
+ class MessageWithFields(messages.Message): |
+ field1 = messages.IntegerField(10) |
+ field2 = messages.StringField(30) |
+ field3 = messages.IntegerField(20) |
+ |
+ expected = descriptor.MessageDescriptor() |
+ expected.name = 'MessageWithFields' |
+ |
+ expected.fields = [ |
+ descriptor.describe_field( |
+ MessageWithFields.field_by_name('field1')), |
+ descriptor.describe_field( |
+ MessageWithFields.field_by_name('field3')), |
+ descriptor.describe_field( |
+ MessageWithFields.field_by_name('field2')), |
+ ] |
+ |
+ described = descriptor.describe_message(MessageWithFields) |
+ described.check_initialized() |
+ self.assertEquals(expected, described) |
+ |
+ def testNestedEnum(self): |
+ class MessageWithEnum(messages.Message): |
+ |
+ class Mood(messages.Enum): |
+ GOOD = 1 |
+ BAD = 2 |
+ UGLY = 3 |
+ |
+ class Music(messages.Enum): |
+ CLASSIC = 1 |
+ JAZZ = 2 |
+ BLUES = 3 |
+ |
+ expected = descriptor.MessageDescriptor() |
+ expected.name = 'MessageWithEnum' |
+ |
+ expected.enum_types = [descriptor.describe_enum(MessageWithEnum.Mood), |
+ descriptor.describe_enum(MessageWithEnum.Music)] |
+ |
+ described = descriptor.describe_message(MessageWithEnum) |
+ described.check_initialized() |
+ self.assertEquals(expected, described) |
+ |
+ def testNestedMessage(self): |
+ class MessageWithMessage(messages.Message): |
+ |
+ class Nesty(messages.Message): |
+ pass |
+ |
+ expected = descriptor.MessageDescriptor() |
+ expected.name = 'MessageWithMessage' |
+ |
+ expected.message_types = [ |
+ descriptor.describe_message(MessageWithMessage.Nesty)] |
+ |
+ described = descriptor.describe_message(MessageWithMessage) |
+ described.check_initialized() |
+ self.assertEquals(expected, described) |
+ |
+ |
+class DescribeFileTest(test_util.TestCase): |
+ """Test describing modules.""" |
+ |
+ def LoadModule(self, module_name, source): |
+ result = { |
+ '__name__': module_name, |
+ 'messages': messages, |
+ } |
+ exec(source, result) |
+ |
+ module = types.ModuleType(module_name) |
+ for name, value in result.items(): |
+ setattr(module, name, value) |
+ |
+ return module |
+ |
+ def testEmptyModule(self): |
+ """Test describing an empty file.""" |
+ module = types.ModuleType('my.package.name') |
+ |
+ expected = descriptor.FileDescriptor() |
+ expected.package = 'my.package.name' |
+ |
+ described = descriptor.describe_file(module) |
+ described.check_initialized() |
+ self.assertEquals(expected, described) |
+ |
+ def testNoPackageName(self): |
+ """Test describing a module with no module name.""" |
+ module = types.ModuleType('') |
+ |
+ expected = descriptor.FileDescriptor() |
+ |
+ described = descriptor.describe_file(module) |
+ described.check_initialized() |
+ self.assertEquals(expected, described) |
+ |
+ def testPackageName(self): |
+ """Test using the 'package' module attribute.""" |
+ module = types.ModuleType('my.module.name') |
+ module.package = 'my.package.name' |
+ |
+ expected = descriptor.FileDescriptor() |
+ expected.package = 'my.package.name' |
+ |
+ described = descriptor.describe_file(module) |
+ described.check_initialized() |
+ self.assertEquals(expected, described) |
+ |
+ def testMain(self): |
+ """Test using the 'package' module attribute.""" |
+ module = types.ModuleType('__main__') |
+ module.__file__ = '/blim/blam/bloom/my_package.py' |
+ |
+ expected = descriptor.FileDescriptor() |
+ expected.package = 'my_package' |
+ |
+ described = descriptor.describe_file(module) |
+ described.check_initialized() |
+ self.assertEquals(expected, described) |
+ |
+ def testMessages(self): |
+ """Test that messages are described.""" |
+ module = self.LoadModule('my.package', |
+ 'class Message1(messages.Message): pass\n' |
+ 'class Message2(messages.Message): pass\n') |
+ |
+ message1 = descriptor.MessageDescriptor() |
+ message1.name = 'Message1' |
+ |
+ message2 = descriptor.MessageDescriptor() |
+ message2.name = 'Message2' |
+ |
+ expected = descriptor.FileDescriptor() |
+ expected.package = 'my.package' |
+ expected.message_types = [message1, message2] |
+ |
+ described = descriptor.describe_file(module) |
+ described.check_initialized() |
+ self.assertEquals(expected, described) |
+ |
+ def testEnums(self): |
+ """Test that enums are described.""" |
+ module = self.LoadModule('my.package', |
+ 'class Enum1(messages.Enum): pass\n' |
+ 'class Enum2(messages.Enum): pass\n') |
+ |
+ enum1 = descriptor.EnumDescriptor() |
+ enum1.name = 'Enum1' |
+ |
+ enum2 = descriptor.EnumDescriptor() |
+ enum2.name = 'Enum2' |
+ |
+ expected = descriptor.FileDescriptor() |
+ expected.package = 'my.package' |
+ expected.enum_types = [enum1, enum2] |
+ |
+ described = descriptor.describe_file(module) |
+ described.check_initialized() |
+ self.assertEquals(expected, described) |
+ |
+ |
+class DescribeFileSetTest(test_util.TestCase): |
+ """Test describing multiple modules.""" |
+ |
+ def testNoModules(self): |
+ """Test what happens when no modules provided.""" |
+ described = descriptor.describe_file_set([]) |
+ described.check_initialized() |
+ # The described FileSet.files will be None. |
+ self.assertEquals(descriptor.FileSet(), described) |
+ |
+ def testWithModules(self): |
+ """Test what happens when no modules provided.""" |
+ modules = [types.ModuleType('package1'), types.ModuleType('package1')] |
+ |
+ file1 = descriptor.FileDescriptor() |
+ file1.package = 'package1' |
+ file2 = descriptor.FileDescriptor() |
+ file2.package = 'package2' |
+ |
+ expected = descriptor.FileSet() |
+ expected.files = [file1, file1] |
+ |
+ described = descriptor.describe_file_set(modules) |
+ described.check_initialized() |
+ self.assertEquals(expected, described) |
+ |
+ |
+class DescribeTest(test_util.TestCase): |
+ |
+ def testModule(self): |
+ self.assertEquals(descriptor.describe_file(test_util), |
+ descriptor.describe(test_util)) |
+ |
+ def testField(self): |
+ self.assertEquals( |
+ descriptor.describe_field(test_util.NestedMessage.a_value), |
+ descriptor.describe(test_util.NestedMessage.a_value)) |
+ |
+ def testEnumValue(self): |
+ self.assertEquals( |
+ descriptor.describe_enum_value( |
+ test_util.OptionalMessage.SimpleEnum.VAL1), |
+ descriptor.describe(test_util.OptionalMessage.SimpleEnum.VAL1)) |
+ |
+ def testMessage(self): |
+ self.assertEquals(descriptor.describe_message(test_util.NestedMessage), |
+ descriptor.describe(test_util.NestedMessage)) |
+ |
+ def testEnum(self): |
+ self.assertEquals( |
+ descriptor.describe_enum(test_util.OptionalMessage.SimpleEnum), |
+ descriptor.describe(test_util.OptionalMessage.SimpleEnum)) |
+ |
+ def testUndescribable(self): |
+ class NonService(object): |
+ |
+ def fn(self): |
+ pass |
+ |
+ for value in (NonService, |
+ NonService.fn, |
+ 1, |
+ 'string', |
+ 1.2, |
+ None): |
+ self.assertEquals(None, descriptor.describe(value)) |
+ |
+ |
+class ModuleFinderTest(test_util.TestCase): |
+ |
+ def testFindMessage(self): |
+ self.assertEquals( |
+ descriptor.describe_message(descriptor.FileSet), |
+ descriptor.import_descriptor_loader( |
+ 'apitools.base.protorpclite.descriptor.FileSet')) |
+ |
+ def testFindField(self): |
+ self.assertEquals( |
+ descriptor.describe_field(descriptor.FileSet.files), |
+ descriptor.import_descriptor_loader( |
+ 'apitools.base.protorpclite.descriptor.FileSet.files')) |
+ |
+ def testFindEnumValue(self): |
+ self.assertEquals( |
+ descriptor.describe_enum_value( |
+ test_util.OptionalMessage.SimpleEnum.VAL1), |
+ descriptor.import_descriptor_loader( |
+ 'apitools.base.protorpclite.test_util.' |
+ 'OptionalMessage.SimpleEnum.VAL1')) |
+ |
+ |
+class DescriptorLibraryTest(test_util.TestCase): |
+ |
+ def setUp(self): |
+ self.packageless = descriptor.MessageDescriptor() |
+ self.packageless.name = 'Packageless' |
+ self.library = descriptor.DescriptorLibrary( |
+ descriptors={ |
+ 'not.real.Packageless': self.packageless, |
+ 'Packageless': self.packageless, |
+ }) |
+ |
+ def testLookupPackage(self): |
+ self.assertEquals('csv', self.library.lookup_package('csv')) |
+ self.assertEquals( |
+ 'apitools.base.protorpclite', |
+ self.library.lookup_package('apitools.base.protorpclite')) |
+ |
+ def testLookupNonPackages(self): |
+ lib = 'apitools.base.protorpclite.descriptor.DescriptorLibrary' |
+ for name in ('', 'a', lib): |
+ self.assertRaisesWithRegexpMatch( |
+ messages.DefinitionNotFoundError, |
+ 'Could not find definition for %s' % name, |
+ self.library.lookup_package, name) |
+ |
+ def testNoPackage(self): |
+ self.assertRaisesWithRegexpMatch( |
+ messages.DefinitionNotFoundError, |
+ 'Could not find definition for not.real', |
+ self.library.lookup_package, 'not.real.Packageless') |
+ |
+ self.assertEquals(None, self.library.lookup_package('Packageless')) |
+ |
+ |
+if __name__ == '__main__': |
+ unittest2.main() |