1#! /usr/bin/python 2# 3# Protocol Buffers - Google's data interchange format 4# Copyright 2008 Google Inc. All rights reserved. 5# http://code.google.com/p/protobuf/ 6# 7# Redistribution and use in source and binary forms, with or without 8# modification, are permitted provided that the following conditions are 9# met: 10# 11# * Redistributions of source code must retain the above copyright 12# notice, this list of conditions and the following disclaimer. 13# * Redistributions in binary form must reproduce the above 14# copyright notice, this list of conditions and the following disclaimer 15# in the documentation and/or other materials provided with the 16# distribution. 17# * Neither the name of Google Inc. nor the names of its 18# contributors may be used to endorse or promote products derived from 19# this software without specific prior written permission. 20# 21# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 22# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 23# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 24# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 25# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 26# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 27# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 28# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 29# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 30# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 31# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 32 33"""Tests for google.protobuf.descriptor_pool.""" 34 35__author__ = 'matthewtoia@google.com (Matt Toia)' 36 37import unittest 38from google.protobuf import descriptor_pb2 39from google.protobuf.internal import factory_test1_pb2 40from google.protobuf.internal import factory_test2_pb2 41from google.protobuf import descriptor 42from google.protobuf import descriptor_database 43from google.protobuf import descriptor_pool 44 45 46class DescriptorPoolTest(unittest.TestCase): 47 48 def setUp(self): 49 self.pool = descriptor_pool.DescriptorPool() 50 self.factory_test1_fd = descriptor_pb2.FileDescriptorProto.FromString( 51 factory_test1_pb2.DESCRIPTOR.serialized_pb) 52 self.factory_test2_fd = descriptor_pb2.FileDescriptorProto.FromString( 53 factory_test2_pb2.DESCRIPTOR.serialized_pb) 54 self.pool.Add(self.factory_test1_fd) 55 self.pool.Add(self.factory_test2_fd) 56 57 def testFindFileByName(self): 58 name1 = 'net/proto2/python/internal/factory_test1.proto' 59 file_desc1 = self.pool.FindFileByName(name1) 60 self.assertIsInstance(file_desc1, descriptor.FileDescriptor) 61 self.assertEquals(name1, file_desc1.name) 62 self.assertEquals('net.proto2.python.internal', file_desc1.package) 63 self.assertIn('Factory1Message', file_desc1.message_types_by_name) 64 65 name2 = 'net/proto2/python/internal/factory_test2.proto' 66 file_desc2 = self.pool.FindFileByName(name2) 67 self.assertIsInstance(file_desc2, descriptor.FileDescriptor) 68 self.assertEquals(name2, file_desc2.name) 69 self.assertEquals('net.proto2.python.internal', file_desc2.package) 70 self.assertIn('Factory2Message', file_desc2.message_types_by_name) 71 72 def testFindFileByNameFailure(self): 73 try: 74 self.pool.FindFileByName('Does not exist') 75 self.fail('Expected KeyError') 76 except KeyError: 77 pass 78 79 def testFindFileContainingSymbol(self): 80 file_desc1 = self.pool.FindFileContainingSymbol( 81 'net.proto2.python.internal.Factory1Message') 82 self.assertIsInstance(file_desc1, descriptor.FileDescriptor) 83 self.assertEquals('net/proto2/python/internal/factory_test1.proto', 84 file_desc1.name) 85 self.assertEquals('net.proto2.python.internal', file_desc1.package) 86 self.assertIn('Factory1Message', file_desc1.message_types_by_name) 87 88 file_desc2 = self.pool.FindFileContainingSymbol( 89 'net.proto2.python.internal.Factory2Message') 90 self.assertIsInstance(file_desc2, descriptor.FileDescriptor) 91 self.assertEquals('net/proto2/python/internal/factory_test2.proto', 92 file_desc2.name) 93 self.assertEquals('net.proto2.python.internal', file_desc2.package) 94 self.assertIn('Factory2Message', file_desc2.message_types_by_name) 95 96 def testFindFileContainingSymbolFailure(self): 97 try: 98 self.pool.FindFileContainingSymbol('Does not exist') 99 self.fail('Expected KeyError') 100 except KeyError: 101 pass 102 103 def testFindMessageTypeByName(self): 104 msg1 = self.pool.FindMessageTypeByName( 105 'net.proto2.python.internal.Factory1Message') 106 self.assertIsInstance(msg1, descriptor.Descriptor) 107 self.assertEquals('Factory1Message', msg1.name) 108 self.assertEquals('net.proto2.python.internal.Factory1Message', 109 msg1.full_name) 110 self.assertEquals(None, msg1.containing_type) 111 112 nested_msg1 = msg1.nested_types[0] 113 self.assertEquals('NestedFactory1Message', nested_msg1.name) 114 self.assertEquals(msg1, nested_msg1.containing_type) 115 116 nested_enum1 = msg1.enum_types[0] 117 self.assertEquals('NestedFactory1Enum', nested_enum1.name) 118 self.assertEquals(msg1, nested_enum1.containing_type) 119 120 self.assertEquals(nested_msg1, msg1.fields_by_name[ 121 'nested_factory_1_message'].message_type) 122 self.assertEquals(nested_enum1, msg1.fields_by_name[ 123 'nested_factory_1_enum'].enum_type) 124 125 msg2 = self.pool.FindMessageTypeByName( 126 'net.proto2.python.internal.Factory2Message') 127 self.assertIsInstance(msg2, descriptor.Descriptor) 128 self.assertEquals('Factory2Message', msg2.name) 129 self.assertEquals('net.proto2.python.internal.Factory2Message', 130 msg2.full_name) 131 self.assertIsNone(msg2.containing_type) 132 133 nested_msg2 = msg2.nested_types[0] 134 self.assertEquals('NestedFactory2Message', nested_msg2.name) 135 self.assertEquals(msg2, nested_msg2.containing_type) 136 137 nested_enum2 = msg2.enum_types[0] 138 self.assertEquals('NestedFactory2Enum', nested_enum2.name) 139 self.assertEquals(msg2, nested_enum2.containing_type) 140 141 self.assertEquals(nested_msg2, msg2.fields_by_name[ 142 'nested_factory_2_message'].message_type) 143 self.assertEquals(nested_enum2, msg2.fields_by_name[ 144 'nested_factory_2_enum'].enum_type) 145 146 self.assertTrue(msg2.fields_by_name['int_with_default'].has_default) 147 self.assertEquals( 148 1776, msg2.fields_by_name['int_with_default'].default_value) 149 150 self.assertTrue(msg2.fields_by_name['double_with_default'].has_default) 151 self.assertEquals( 152 9.99, msg2.fields_by_name['double_with_default'].default_value) 153 154 self.assertTrue(msg2.fields_by_name['string_with_default'].has_default) 155 self.assertEquals( 156 'hello world', msg2.fields_by_name['string_with_default'].default_value) 157 158 self.assertTrue(msg2.fields_by_name['bool_with_default'].has_default) 159 self.assertFalse(msg2.fields_by_name['bool_with_default'].default_value) 160 161 self.assertTrue(msg2.fields_by_name['enum_with_default'].has_default) 162 self.assertEquals( 163 1, msg2.fields_by_name['enum_with_default'].default_value) 164 165 msg3 = self.pool.FindMessageTypeByName( 166 'net.proto2.python.internal.Factory2Message.NestedFactory2Message') 167 self.assertEquals(nested_msg2, msg3) 168 169 def testFindMessageTypeByNameFailure(self): 170 try: 171 self.pool.FindMessageTypeByName('Does not exist') 172 self.fail('Expected KeyError') 173 except KeyError: 174 pass 175 176 def testFindEnumTypeByName(self): 177 enum1 = self.pool.FindEnumTypeByName( 178 'net.proto2.python.internal.Factory1Enum') 179 self.assertIsInstance(enum1, descriptor.EnumDescriptor) 180 self.assertEquals(0, enum1.values_by_name['FACTORY_1_VALUE_0'].number) 181 self.assertEquals(1, enum1.values_by_name['FACTORY_1_VALUE_1'].number) 182 183 nested_enum1 = self.pool.FindEnumTypeByName( 184 'net.proto2.python.internal.Factory1Message.NestedFactory1Enum') 185 self.assertIsInstance(nested_enum1, descriptor.EnumDescriptor) 186 self.assertEquals( 187 0, nested_enum1.values_by_name['NESTED_FACTORY_1_VALUE_0'].number) 188 self.assertEquals( 189 1, nested_enum1.values_by_name['NESTED_FACTORY_1_VALUE_1'].number) 190 191 enum2 = self.pool.FindEnumTypeByName( 192 'net.proto2.python.internal.Factory2Enum') 193 self.assertIsInstance(enum2, descriptor.EnumDescriptor) 194 self.assertEquals(0, enum2.values_by_name['FACTORY_2_VALUE_0'].number) 195 self.assertEquals(1, enum2.values_by_name['FACTORY_2_VALUE_1'].number) 196 197 nested_enum2 = self.pool.FindEnumTypeByName( 198 'net.proto2.python.internal.Factory2Message.NestedFactory2Enum') 199 self.assertIsInstance(nested_enum2, descriptor.EnumDescriptor) 200 self.assertEquals( 201 0, nested_enum2.values_by_name['NESTED_FACTORY_2_VALUE_0'].number) 202 self.assertEquals( 203 1, nested_enum2.values_by_name['NESTED_FACTORY_2_VALUE_1'].number) 204 205 def testFindEnumTypeByNameFailure(self): 206 try: 207 self.pool.FindEnumTypeByName('Does not exist') 208 self.fail('Expected KeyError') 209 except KeyError: 210 pass 211 212 def testUserDefinedDB(self): 213 db = descriptor_database.DescriptorDatabase() 214 self.pool = descriptor_pool.DescriptorPool(db) 215 db.Add(self.factory_test1_fd) 216 db.Add(self.factory_test2_fd) 217 self.testFindMessageTypeByName() 218 219if __name__ == '__main__': 220 unittest.main() 221