1fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#! /usr/bin/python 2fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# 3fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# Protocol Buffers - Google's data interchange format 4fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# Copyright 2008 Google Inc. All rights reserved. 5afb4b72037e3f13db208590fc782c4bc8e27f862Jeff Davidson# https://developers.google.com/protocol-buffers/ 6fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# 7fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# Redistribution and use in source and binary forms, with or without 8fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# modification, are permitted provided that the following conditions are 9fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# met: 10fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# 11fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# * Redistributions of source code must retain the above copyright 12fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# notice, this list of conditions and the following disclaimer. 13fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# * Redistributions in binary form must reproduce the above 14fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# copyright notice, this list of conditions and the following disclaimer 15fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# in the documentation and/or other materials provided with the 16fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# distribution. 17fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# * Neither the name of Google Inc. nor the names of its 18fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# contributors may be used to endorse or promote products derived from 19fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# this software without specific prior written permission. 20fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# 21fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 22fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 23fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 24fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 25fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 26fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 27fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 28fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 29fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 30fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 31fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 32fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 33fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# TODO(robinson): Flesh this out considerably. We focused on reflection_test.py 34fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# first, since it's testing the subtler code, and since it provides decent 35fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville# indirect testing of the protocol compiler output. 36fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 37fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville"""Unittest that directly tests the output of the pure-Python protocol 38d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Savillecompiler. See //google/protobuf/reflection_test.py for a test which 39fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillefurther ensures that we can use Python protocol message objects as we expect. 40fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville""" 41fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 42fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville__author__ = 'robinson@google.com (Will Robinson)' 43fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 44a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonfrom google.apputils import basetest 45a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonfrom google.protobuf.internal import test_bad_identifiers_pb2 46a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonfrom google.protobuf import unittest_custom_options_pb2 47d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Savillefrom google.protobuf import unittest_import_pb2 48a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonfrom google.protobuf import unittest_import_public_pb2 49fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillefrom google.protobuf import unittest_mset_pb2 50d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Savillefrom google.protobuf import unittest_no_generic_services_pb2 51a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonfrom google.protobuf import unittest_pb2 52a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonfrom google.protobuf import service 53a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonfrom google.protobuf import symbol_database 54d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville 55d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink SavilleMAX_EXTENSION = 536870912 56fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 57fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 58a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonclass GeneratorTest(basetest.TestCase): 59fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 60fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville def testNestedMessageDescriptor(self): 61fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville field_name = 'optional_nested_message' 62fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto_type = unittest_pb2.TestAllTypes 63fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual( 64fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto_type.NestedMessage.DESCRIPTOR, 65fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto_type.DESCRIPTOR.fields_by_name[field_name].message_type) 66fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 67fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville def testEnums(self): 68fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # We test only module-level enums here. 69fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # TODO(robinson): Examine descriptors directly to check 70fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville # enum descriptor output. 71fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(4, unittest_pb2.FOREIGN_FOO) 72fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(5, unittest_pb2.FOREIGN_BAR) 73fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(6, unittest_pb2.FOREIGN_BAZ) 74fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 75fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto = unittest_pb2.TestAllTypes() 76fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(1, proto.FOO) 77fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(1, unittest_pb2.TestAllTypes.FOO) 78fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(2, proto.BAR) 79fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(2, unittest_pb2.TestAllTypes.BAR) 80fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(3, proto.BAZ) 81fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(3, unittest_pb2.TestAllTypes.BAZ) 82fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 83d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville def testExtremeDefaultValues(self): 84d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville message = unittest_pb2.TestExtremeDefaultValues() 85d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville 86d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville # Python pre-2.6 does not have isinf() or isnan() functions, so we have 87d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville # to provide our own. 88d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville def isnan(val): 89d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville # NaN is never equal to itself. 90d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville return val != val 91d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville def isinf(val): 92d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville # Infinity times zero equals NaN. 93d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville return not isnan(val) and isnan(val * 0) 94d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville 95d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville self.assertTrue(isinf(message.inf_double)) 96d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville self.assertTrue(message.inf_double > 0) 97d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville self.assertTrue(isinf(message.neg_inf_double)) 98d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville self.assertTrue(message.neg_inf_double < 0) 99d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville self.assertTrue(isnan(message.nan_double)) 100d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville 101d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville self.assertTrue(isinf(message.inf_float)) 102d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville self.assertTrue(message.inf_float > 0) 103d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville self.assertTrue(isinf(message.neg_inf_float)) 104d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville self.assertTrue(message.neg_inf_float < 0) 105d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville self.assertTrue(isnan(message.nan_float)) 106a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson self.assertEqual("? ? ?? ?? ??? ??/ ??-", message.cpp_trigraph) 107d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville 108d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville def testHasDefaultValues(self): 109d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville desc = unittest_pb2.TestAllTypes.DESCRIPTOR 110d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville 111d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville expected_has_default_by_name = { 112d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville 'optional_int32': False, 113d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville 'repeated_int32': False, 114d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville 'optional_nested_message': False, 115d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville 'default_int32': True, 116d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville } 117d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville 118d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville has_default_by_name = dict( 119d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville [(f.name, f.has_default_value) 120d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville for f in desc.fields 121d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville if f.name in expected_has_default_by_name]) 122d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville self.assertEqual(expected_has_default_by_name, has_default_by_name) 123d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville 124fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville def testContainingTypeBehaviorForExtensions(self): 125fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(unittest_pb2.optional_int32_extension.containing_type, 126fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville unittest_pb2.TestAllExtensions.DESCRIPTOR) 127fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(unittest_pb2.TestRequired.single.containing_type, 128fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville unittest_pb2.TestAllExtensions.DESCRIPTOR) 129fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 130fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville def testExtensionScope(self): 131fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(unittest_pb2.optional_int32_extension.extension_scope, 132fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville None) 133fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertEqual(unittest_pb2.TestRequired.single.extension_scope, 134fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville unittest_pb2.TestRequired.DESCRIPTOR) 135fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 136fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville def testIsExtension(self): 137fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertTrue(unittest_pb2.optional_int32_extension.is_extension) 138fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertTrue(unittest_pb2.TestRequired.single.is_extension) 139fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 140fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville message_descriptor = unittest_pb2.TestRequired.DESCRIPTOR 141fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville non_extension_descriptor = message_descriptor.fields_by_name['a'] 142fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertTrue(not non_extension_descriptor.is_extension) 143fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 144fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville def testOptions(self): 145fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville proto = unittest_mset_pb2.TestMessageSet() 146fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville self.assertTrue(proto.DESCRIPTOR.GetOptions().message_set_wire_format) 147fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 148a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson def testMessageWithCustomOptions(self): 149a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson proto = unittest_custom_options_pb2.TestMessageWithCustomOptions() 150a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson enum_options = proto.DESCRIPTOR.enum_types_by_name['AnEnum'].GetOptions() 151a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson self.assertTrue(enum_options is not None) 152a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson # TODO(gps): We really should test for the presense of the enum_opt1 153a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson # extension and for its value to be set to -789. 154a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 155d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville def testNestedTypes(self): 156d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville self.assertEquals( 157d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville set(unittest_pb2.TestAllTypes.DESCRIPTOR.nested_types), 158d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville set([ 159d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville unittest_pb2.TestAllTypes.NestedMessage.DESCRIPTOR, 160d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville unittest_pb2.TestAllTypes.OptionalGroup.DESCRIPTOR, 161d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville unittest_pb2.TestAllTypes.RepeatedGroup.DESCRIPTOR, 162d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville ])) 163d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville self.assertEqual(unittest_pb2.TestEmptyMessage.DESCRIPTOR.nested_types, []) 164d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville self.assertEqual( 165d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville unittest_pb2.TestAllTypes.NestedMessage.DESCRIPTOR.nested_types, []) 166d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville 167d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville def testContainingType(self): 168d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville self.assertTrue( 169d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville unittest_pb2.TestEmptyMessage.DESCRIPTOR.containing_type is None) 170d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville self.assertTrue( 171d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville unittest_pb2.TestAllTypes.DESCRIPTOR.containing_type is None) 172d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville self.assertEqual( 173d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville unittest_pb2.TestAllTypes.NestedMessage.DESCRIPTOR.containing_type, 174d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville unittest_pb2.TestAllTypes.DESCRIPTOR) 175d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville self.assertEqual( 176d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville unittest_pb2.TestAllTypes.NestedMessage.DESCRIPTOR.containing_type, 177d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville unittest_pb2.TestAllTypes.DESCRIPTOR) 178d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville self.assertEqual( 179d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville unittest_pb2.TestAllTypes.RepeatedGroup.DESCRIPTOR.containing_type, 180d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville unittest_pb2.TestAllTypes.DESCRIPTOR) 181d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville 182d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville def testContainingTypeInEnumDescriptor(self): 183d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville self.assertTrue(unittest_pb2._FOREIGNENUM.containing_type is None) 184d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville self.assertEqual(unittest_pb2._TESTALLTYPES_NESTEDENUM.containing_type, 185d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville unittest_pb2.TestAllTypes.DESCRIPTOR) 186d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville 187d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville def testPackage(self): 188d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville self.assertEqual( 189d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville unittest_pb2.TestAllTypes.DESCRIPTOR.file.package, 190d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville 'protobuf_unittest') 191d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville desc = unittest_pb2.TestAllTypes.NestedMessage.DESCRIPTOR 192d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville self.assertEqual(desc.file.package, 'protobuf_unittest') 193d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville self.assertEqual( 194d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville unittest_import_pb2.ImportMessage.DESCRIPTOR.file.package, 195d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville 'protobuf_unittest_import') 196d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville 197d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville self.assertEqual( 198d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville unittest_pb2._FOREIGNENUM.file.package, 'protobuf_unittest') 199d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville self.assertEqual( 200d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville unittest_pb2._TESTALLTYPES_NESTEDENUM.file.package, 201d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville 'protobuf_unittest') 202d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville self.assertEqual( 203d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville unittest_import_pb2._IMPORTENUM.file.package, 204d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville 'protobuf_unittest_import') 205d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville 206d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville def testExtensionRange(self): 207d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville self.assertEqual( 208d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville unittest_pb2.TestAllTypes.DESCRIPTOR.extension_ranges, []) 209d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville self.assertEqual( 210d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville unittest_pb2.TestAllExtensions.DESCRIPTOR.extension_ranges, 211d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville [(1, MAX_EXTENSION)]) 212d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville self.assertEqual( 213d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville unittest_pb2.TestMultipleExtensionRanges.DESCRIPTOR.extension_ranges, 214d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville [(42, 43), (4143, 4244), (65536, MAX_EXTENSION)]) 215d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville 216d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville def testFileDescriptor(self): 217d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville self.assertEqual(unittest_pb2.DESCRIPTOR.name, 218d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville 'google/protobuf/unittest.proto') 219d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville self.assertEqual(unittest_pb2.DESCRIPTOR.package, 'protobuf_unittest') 220d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville self.assertFalse(unittest_pb2.DESCRIPTOR.serialized_pb is None) 221a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson self.assertEqual(unittest_pb2.DESCRIPTOR.dependencies, 222a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson [unittest_import_pb2.DESCRIPTOR]) 223a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson self.assertEqual(unittest_import_pb2.DESCRIPTOR.dependencies, 224a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson [unittest_import_public_pb2.DESCRIPTOR]) 225d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville 226d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville def testNoGenericServices(self): 227d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville self.assertTrue(hasattr(unittest_no_generic_services_pb2, "TestMessage")) 228d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville self.assertTrue(hasattr(unittest_no_generic_services_pb2, "FOO")) 229d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville self.assertTrue(hasattr(unittest_no_generic_services_pb2, "test_extension")) 230d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville 231a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson # Make sure unittest_no_generic_services_pb2 has no services subclassing 232a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson # Proto2 Service class. 233a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson if hasattr(unittest_no_generic_services_pb2, "TestService"): 234a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson self.assertFalse(issubclass(unittest_no_generic_services_pb2.TestService, 235a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson service.Service)) 236a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 237a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson def testMessageTypesByName(self): 238a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson file_type = unittest_pb2.DESCRIPTOR 239a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson self.assertEqual( 240a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson unittest_pb2._TESTALLTYPES, 241a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson file_type.message_types_by_name[unittest_pb2._TESTALLTYPES.name]) 242a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 243a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson # Nested messages shouldn't be included in the message_types_by_name 244a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson # dictionary (like in the C++ API). 245a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson self.assertFalse( 246a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson unittest_pb2._TESTALLTYPES_NESTEDMESSAGE.name in 247a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson file_type.message_types_by_name) 248a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 249a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson def testEnumTypesByName(self): 250a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson file_type = unittest_pb2.DESCRIPTOR 251a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson self.assertEqual( 252a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson unittest_pb2._FOREIGNENUM, 253a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson file_type.enum_types_by_name[unittest_pb2._FOREIGNENUM.name]) 254a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 255a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson def testExtensionsByName(self): 256a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson file_type = unittest_pb2.DESCRIPTOR 257a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson self.assertEqual( 258a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson unittest_pb2.my_extension_string, 259a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson file_type.extensions_by_name[unittest_pb2.my_extension_string.name]) 260a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 261a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson def testPublicImports(self): 262a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson # Test public imports as embedded message. 263a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson all_type_proto = unittest_pb2.TestAllTypes() 264a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson self.assertEqual(0, all_type_proto.optional_public_import_message.e) 265a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 266a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson # PublicImportMessage is actually defined in unittest_import_public_pb2 267a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson # module, and is public imported by unittest_import_pb2 module. 268a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson public_import_proto = unittest_import_pb2.PublicImportMessage() 269a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson self.assertEqual(0, public_import_proto.e) 270a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson self.assertTrue(unittest_import_public_pb2.PublicImportMessage is 271a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson unittest_import_pb2.PublicImportMessage) 272a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 273a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson def testBadIdentifiers(self): 274a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson # We're just testing that the code was imported without problems. 275a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson message = test_bad_identifiers_pb2.TestBadIdentifiers() 276a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson self.assertEqual(message.Extensions[test_bad_identifiers_pb2.message], 277a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "foo") 278a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson self.assertEqual(message.Extensions[test_bad_identifiers_pb2.descriptor], 279a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "bar") 280a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson self.assertEqual(message.Extensions[test_bad_identifiers_pb2.reflection], 281a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "baz") 282a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson self.assertEqual(message.Extensions[test_bad_identifiers_pb2.service], 283a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "qux") 284a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 285a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson def testOneof(self): 286a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson desc = unittest_pb2.TestAllTypes.DESCRIPTOR 287a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson self.assertEqual(1, len(desc.oneofs)) 288a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson self.assertEqual('oneof_field', desc.oneofs[0].name) 289a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson self.assertEqual(0, desc.oneofs[0].index) 290a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson self.assertIs(desc, desc.oneofs[0].containing_type) 291a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson self.assertIs(desc.oneofs[0], desc.oneofs_by_name['oneof_field']) 292a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson nested_names = set(['oneof_uint32', 'oneof_nested_message', 293a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 'oneof_string', 'oneof_bytes']) 294a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson self.assertSameElements( 295a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson nested_names, 296a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson [field.name for field in desc.oneofs[0].fields]) 297a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson for field_name, field_desc in desc.fields_by_name.iteritems(): 298a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson if field_name in nested_names: 299a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson self.assertIs(desc.oneofs[0], field_desc.containing_oneof) 300a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson else: 301a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson self.assertIsNone(field_desc.containing_oneof) 302a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 303a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 304a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonclass SymbolDatabaseRegistrationTest(basetest.TestCase): 305a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson """Checks that messages, enums and files are correctly registered.""" 306a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 307a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson def testGetSymbol(self): 308a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson self.assertEquals( 309a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson unittest_pb2.TestAllTypes, symbol_database.Default().GetSymbol( 310a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 'protobuf_unittest.TestAllTypes')) 311a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson self.assertEquals( 312a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson unittest_pb2.TestAllTypes.NestedMessage, 313a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson symbol_database.Default().GetSymbol( 314a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 'protobuf_unittest.TestAllTypes.NestedMessage')) 315a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson with self.assertRaises(KeyError): 316a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson symbol_database.Default().GetSymbol('protobuf_unittest.NestedMessage') 317a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson self.assertEquals( 318a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson unittest_pb2.TestAllTypes.OptionalGroup, 319a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson symbol_database.Default().GetSymbol( 320a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 'protobuf_unittest.TestAllTypes.OptionalGroup')) 321a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson self.assertEquals( 322a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson unittest_pb2.TestAllTypes.RepeatedGroup, 323a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson symbol_database.Default().GetSymbol( 324a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 'protobuf_unittest.TestAllTypes.RepeatedGroup')) 325a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 326a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson def testEnums(self): 327a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson self.assertEquals( 328a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 'protobuf_unittest.ForeignEnum', 329a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson symbol_database.Default().pool.FindEnumTypeByName( 330a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 'protobuf_unittest.ForeignEnum').full_name) 331a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson self.assertEquals( 332a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 'protobuf_unittest.TestAllTypes.NestedEnum', 333a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson symbol_database.Default().pool.FindEnumTypeByName( 334a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 'protobuf_unittest.TestAllTypes.NestedEnum').full_name) 335a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 336a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson def testFindFileByName(self): 337a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson self.assertEquals( 338a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 'google/protobuf/unittest.proto', 339a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson symbol_database.Default().pool.FindFileByName( 340a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 'google/protobuf/unittest.proto').name) 341fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 342fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleif __name__ == '__main__': 343a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson basetest.main() 344