1a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson#! /usr/bin/python
2a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson#
3a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson# Protocol Buffers - Google's data interchange format
4a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson# Copyright 2008 Google Inc.  All rights reserved.
5afb4b72037e3f13db208590fc782c4bc8e27f862Jeff Davidson# https://developers.google.com/protocol-buffers/
6a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson#
7a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson# Redistribution and use in source and binary forms, with or without
8a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson# modification, are permitted provided that the following conditions are
9a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson# met:
10a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson#
11a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson#     * Redistributions of source code must retain the above copyright
12a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson# notice, this list of conditions and the following disclaimer.
13a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson#     * Redistributions in binary form must reproduce the above
14a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson# copyright notice, this list of conditions and the following disclaimer
15a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson# in the documentation and/or other materials provided with the
16a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson# distribution.
17a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson#     * Neither the name of Google Inc. nor the names of its
18a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson# contributors may be used to endorse or promote products derived from
19a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson# this software without specific prior written permission.
20a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson#
21a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
24a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
25a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
26a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
27a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
28a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
29a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
30a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
31a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
33a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson"""Tests for google.protobuf.descriptor_pool."""
34a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
35a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson__author__ = 'matthewtoia@google.com (Matt Toia)'
36a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
37a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonimport os
38a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonimport unittest
39a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
40a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonfrom google.apputils import basetest
41a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonfrom google.protobuf import unittest_pb2
42a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonfrom google.protobuf import descriptor_pb2
43a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonfrom google.protobuf.internal import api_implementation
44a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonfrom google.protobuf.internal import descriptor_pool_test1_pb2
45a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonfrom google.protobuf.internal import descriptor_pool_test2_pb2
46a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonfrom google.protobuf.internal import factory_test1_pb2
47a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonfrom google.protobuf.internal import factory_test2_pb2
48a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonfrom google.protobuf import descriptor
49a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonfrom google.protobuf import descriptor_database
50a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonfrom google.protobuf import descriptor_pool
51a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
52a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
53a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonclass DescriptorPoolTest(basetest.TestCase):
54a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
55a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  def setUp(self):
56a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    self.pool = descriptor_pool.DescriptorPool()
57a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    self.factory_test1_fd = descriptor_pb2.FileDescriptorProto.FromString(
58a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        factory_test1_pb2.DESCRIPTOR.serialized_pb)
59a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    self.factory_test2_fd = descriptor_pb2.FileDescriptorProto.FromString(
60a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        factory_test2_pb2.DESCRIPTOR.serialized_pb)
61a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    self.pool.Add(self.factory_test1_fd)
62a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    self.pool.Add(self.factory_test2_fd)
63a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
64a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  def testFindFileByName(self):
65a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    name1 = 'google/protobuf/internal/factory_test1.proto'
66a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    file_desc1 = self.pool.FindFileByName(name1)
67a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    self.assertIsInstance(file_desc1, descriptor.FileDescriptor)
68a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    self.assertEquals(name1, file_desc1.name)
69a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    self.assertEquals('google.protobuf.python.internal', file_desc1.package)
70a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    self.assertIn('Factory1Message', file_desc1.message_types_by_name)
71a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
72a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    name2 = 'google/protobuf/internal/factory_test2.proto'
73a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    file_desc2 = self.pool.FindFileByName(name2)
74a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    self.assertIsInstance(file_desc2, descriptor.FileDescriptor)
75a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    self.assertEquals(name2, file_desc2.name)
76a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    self.assertEquals('google.protobuf.python.internal', file_desc2.package)
77a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    self.assertIn('Factory2Message', file_desc2.message_types_by_name)
78a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
79a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  def testFindFileByNameFailure(self):
80a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    with self.assertRaises(KeyError):
81a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      self.pool.FindFileByName('Does not exist')
82a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
83a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  def testFindFileContainingSymbol(self):
84a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    file_desc1 = self.pool.FindFileContainingSymbol(
85a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        'google.protobuf.python.internal.Factory1Message')
86a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    self.assertIsInstance(file_desc1, descriptor.FileDescriptor)
87a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    self.assertEquals('google/protobuf/internal/factory_test1.proto',
88a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson                      file_desc1.name)
89a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    self.assertEquals('google.protobuf.python.internal', file_desc1.package)
90a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    self.assertIn('Factory1Message', file_desc1.message_types_by_name)
91a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
92a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    file_desc2 = self.pool.FindFileContainingSymbol(
93a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        'google.protobuf.python.internal.Factory2Message')
94a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    self.assertIsInstance(file_desc2, descriptor.FileDescriptor)
95a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    self.assertEquals('google/protobuf/internal/factory_test2.proto',
96a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson                      file_desc2.name)
97a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    self.assertEquals('google.protobuf.python.internal', file_desc2.package)
98a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    self.assertIn('Factory2Message', file_desc2.message_types_by_name)
99a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
100a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  def testFindFileContainingSymbolFailure(self):
101a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    with self.assertRaises(KeyError):
102a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      self.pool.FindFileContainingSymbol('Does not exist')
103a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
104a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  def testFindMessageTypeByName(self):
105a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    msg1 = self.pool.FindMessageTypeByName(
106a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        'google.protobuf.python.internal.Factory1Message')
107a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    self.assertIsInstance(msg1, descriptor.Descriptor)
108a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    self.assertEquals('Factory1Message', msg1.name)
109a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    self.assertEquals('google.protobuf.python.internal.Factory1Message',
110a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson                      msg1.full_name)
111a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    self.assertEquals(None, msg1.containing_type)
112a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
113a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    nested_msg1 = msg1.nested_types[0]
114a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    self.assertEquals('NestedFactory1Message', nested_msg1.name)
115a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    self.assertEquals(msg1, nested_msg1.containing_type)
116a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
117a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    nested_enum1 = msg1.enum_types[0]
118a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    self.assertEquals('NestedFactory1Enum', nested_enum1.name)
119a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    self.assertEquals(msg1, nested_enum1.containing_type)
120a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
121a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    self.assertEquals(nested_msg1, msg1.fields_by_name[
122a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        'nested_factory_1_message'].message_type)
123a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    self.assertEquals(nested_enum1, msg1.fields_by_name[
124a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        'nested_factory_1_enum'].enum_type)
125a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
126a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    msg2 = self.pool.FindMessageTypeByName(
127a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        'google.protobuf.python.internal.Factory2Message')
128a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    self.assertIsInstance(msg2, descriptor.Descriptor)
129a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    self.assertEquals('Factory2Message', msg2.name)
130a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    self.assertEquals('google.protobuf.python.internal.Factory2Message',
131a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson                      msg2.full_name)
132a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    self.assertIsNone(msg2.containing_type)
133a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
134a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    nested_msg2 = msg2.nested_types[0]
135a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    self.assertEquals('NestedFactory2Message', nested_msg2.name)
136a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    self.assertEquals(msg2, nested_msg2.containing_type)
137a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
138a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    nested_enum2 = msg2.enum_types[0]
139a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    self.assertEquals('NestedFactory2Enum', nested_enum2.name)
140a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    self.assertEquals(msg2, nested_enum2.containing_type)
141a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
142a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    self.assertEquals(nested_msg2, msg2.fields_by_name[
143a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        'nested_factory_2_message'].message_type)
144a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    self.assertEquals(nested_enum2, msg2.fields_by_name[
145a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        'nested_factory_2_enum'].enum_type)
146a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
147a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    self.assertTrue(msg2.fields_by_name['int_with_default'].has_default_value)
148a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    self.assertEquals(
149a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        1776, msg2.fields_by_name['int_with_default'].default_value)
150a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
151a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    self.assertTrue(
152a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        msg2.fields_by_name['double_with_default'].has_default_value)
153a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    self.assertEquals(
154a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        9.99, msg2.fields_by_name['double_with_default'].default_value)
155a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
156a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    self.assertTrue(
157a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        msg2.fields_by_name['string_with_default'].has_default_value)
158a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    self.assertEquals(
159a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        'hello world', msg2.fields_by_name['string_with_default'].default_value)
160a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
161a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    self.assertTrue(msg2.fields_by_name['bool_with_default'].has_default_value)
162a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    self.assertFalse(msg2.fields_by_name['bool_with_default'].default_value)
163a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
164a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    self.assertTrue(msg2.fields_by_name['enum_with_default'].has_default_value)
165a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    self.assertEquals(
166a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        1, msg2.fields_by_name['enum_with_default'].default_value)
167a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
168a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    msg3 = self.pool.FindMessageTypeByName(
169a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        'google.protobuf.python.internal.Factory2Message.NestedFactory2Message')
170a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    self.assertEquals(nested_msg2, msg3)
171a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
172a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    self.assertTrue(msg2.fields_by_name['bytes_with_default'].has_default_value)
173a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    self.assertEquals(
174a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        b'a\xfb\x00c',
175a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        msg2.fields_by_name['bytes_with_default'].default_value)
176a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
177a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    self.assertEqual(1, len(msg2.oneofs))
178a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    self.assertEqual(1, len(msg2.oneofs_by_name))
179a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    self.assertEqual(2, len(msg2.oneofs[0].fields))
180a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    for name in ['oneof_int', 'oneof_string']:
181a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      self.assertEqual(msg2.oneofs[0],
182a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson                       msg2.fields_by_name[name].containing_oneof)
183a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      self.assertIn(msg2.fields_by_name[name], msg2.oneofs[0].fields)
184a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
185a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  def testFindMessageTypeByNameFailure(self):
186a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    with self.assertRaises(KeyError):
187a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      self.pool.FindMessageTypeByName('Does not exist')
188a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
189a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  def testFindEnumTypeByName(self):
190a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    enum1 = self.pool.FindEnumTypeByName(
191a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        'google.protobuf.python.internal.Factory1Enum')
192a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    self.assertIsInstance(enum1, descriptor.EnumDescriptor)
193a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    self.assertEquals(0, enum1.values_by_name['FACTORY_1_VALUE_0'].number)
194a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    self.assertEquals(1, enum1.values_by_name['FACTORY_1_VALUE_1'].number)
195a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
196a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    nested_enum1 = self.pool.FindEnumTypeByName(
197a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        'google.protobuf.python.internal.Factory1Message.NestedFactory1Enum')
198a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    self.assertIsInstance(nested_enum1, descriptor.EnumDescriptor)
199a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    self.assertEquals(
200a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        0, nested_enum1.values_by_name['NESTED_FACTORY_1_VALUE_0'].number)
201a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    self.assertEquals(
202a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        1, nested_enum1.values_by_name['NESTED_FACTORY_1_VALUE_1'].number)
203a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
204a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    enum2 = self.pool.FindEnumTypeByName(
205a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        'google.protobuf.python.internal.Factory2Enum')
206a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    self.assertIsInstance(enum2, descriptor.EnumDescriptor)
207a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    self.assertEquals(0, enum2.values_by_name['FACTORY_2_VALUE_0'].number)
208a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    self.assertEquals(1, enum2.values_by_name['FACTORY_2_VALUE_1'].number)
209a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
210a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    nested_enum2 = self.pool.FindEnumTypeByName(
211a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        'google.protobuf.python.internal.Factory2Message.NestedFactory2Enum')
212a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    self.assertIsInstance(nested_enum2, descriptor.EnumDescriptor)
213a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    self.assertEquals(
214a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        0, nested_enum2.values_by_name['NESTED_FACTORY_2_VALUE_0'].number)
215a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    self.assertEquals(
216a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        1, nested_enum2.values_by_name['NESTED_FACTORY_2_VALUE_1'].number)
217a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
218a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  def testFindEnumTypeByNameFailure(self):
219a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    with self.assertRaises(KeyError):
220a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      self.pool.FindEnumTypeByName('Does not exist')
221a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
222a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  def testUserDefinedDB(self):
223a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    db = descriptor_database.DescriptorDatabase()
224a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    self.pool = descriptor_pool.DescriptorPool(db)
225a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    db.Add(self.factory_test1_fd)
226a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    db.Add(self.factory_test2_fd)
227a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    self.testFindMessageTypeByName()
228a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
229a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  def testComplexNesting(self):
230a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    test1_desc = descriptor_pb2.FileDescriptorProto.FromString(
231a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        descriptor_pool_test1_pb2.DESCRIPTOR.serialized_pb)
232a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    test2_desc = descriptor_pb2.FileDescriptorProto.FromString(
233a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        descriptor_pool_test2_pb2.DESCRIPTOR.serialized_pb)
234a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    self.pool.Add(test1_desc)
235a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    self.pool.Add(test2_desc)
236a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    TEST1_FILE.CheckFile(self, self.pool)
237a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    TEST2_FILE.CheckFile(self, self.pool)
238a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
239a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
240a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
241a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonclass ProtoFile(object):
242a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
243a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  def __init__(self, name, package, messages, dependencies=None):
244a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    self.name = name
245a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    self.package = package
246a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    self.messages = messages
247a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    self.dependencies = dependencies or []
248a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
249a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  def CheckFile(self, test, pool):
250a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    file_desc = pool.FindFileByName(self.name)
251a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    test.assertEquals(self.name, file_desc.name)
252a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    test.assertEquals(self.package, file_desc.package)
253a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    dependencies_names = [f.name for f in file_desc.dependencies]
254a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    test.assertEqual(self.dependencies, dependencies_names)
255a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    for name, msg_type in self.messages.items():
256a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      msg_type.CheckType(test, None, name, file_desc)
257a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
258a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
259a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonclass EnumType(object):
260a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
261a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  def __init__(self, values):
262a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    self.values = values
263a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
264a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  def CheckType(self, test, msg_desc, name, file_desc):
265a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    enum_desc = msg_desc.enum_types_by_name[name]
266a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    test.assertEqual(name, enum_desc.name)
267a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    expected_enum_full_name = '.'.join([msg_desc.full_name, name])
268a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    test.assertEqual(expected_enum_full_name, enum_desc.full_name)
269a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    test.assertEqual(msg_desc, enum_desc.containing_type)
270a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    test.assertEqual(file_desc, enum_desc.file)
271a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    for index, (value, number) in enumerate(self.values):
272a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      value_desc = enum_desc.values_by_name[value]
273a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      test.assertEqual(value, value_desc.name)
274a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      test.assertEqual(index, value_desc.index)
275a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      test.assertEqual(number, value_desc.number)
276a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      test.assertEqual(enum_desc, value_desc.type)
277a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      test.assertIn(value, msg_desc.enum_values_by_name)
278a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
279a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
280a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonclass MessageType(object):
281a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
282a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  def __init__(self, type_dict, field_list, is_extendable=False,
283a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson               extensions=None):
284a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    self.type_dict = type_dict
285a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    self.field_list = field_list
286a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    self.is_extendable = is_extendable
287a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    self.extensions = extensions or []
288a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
289a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  def CheckType(self, test, containing_type_desc, name, file_desc):
290a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    if containing_type_desc is None:
291a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      desc = file_desc.message_types_by_name[name]
292a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      expected_full_name = '.'.join([file_desc.package, name])
293a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    else:
294a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      desc = containing_type_desc.nested_types_by_name[name]
295a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      expected_full_name = '.'.join([containing_type_desc.full_name, name])
296a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
297a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    test.assertEqual(name, desc.name)
298a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    test.assertEqual(expected_full_name, desc.full_name)
299a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    test.assertEqual(containing_type_desc, desc.containing_type)
300a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    test.assertEqual(desc.file, file_desc)
301a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    test.assertEqual(self.is_extendable, desc.is_extendable)
302a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    for name, subtype in self.type_dict.items():
303a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      subtype.CheckType(test, desc, name, file_desc)
304a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
305a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    for index, (name, field) in enumerate(self.field_list):
306a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      field.CheckField(test, desc, name, index)
307a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
308a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    for index, (name, field) in enumerate(self.extensions):
309a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      field.CheckField(test, desc, name, index)
310a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
311a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
312a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonclass EnumField(object):
313a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
314a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  def __init__(self, number, type_name, default_value):
315a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    self.number = number
316a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    self.type_name = type_name
317a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    self.default_value = default_value
318a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
319a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  def CheckField(self, test, msg_desc, name, index):
320a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    field_desc = msg_desc.fields_by_name[name]
321a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    enum_desc = msg_desc.enum_types_by_name[self.type_name]
322a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    test.assertEqual(name, field_desc.name)
323a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    expected_field_full_name = '.'.join([msg_desc.full_name, name])
324a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    test.assertEqual(expected_field_full_name, field_desc.full_name)
325a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    test.assertEqual(index, field_desc.index)
326a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    test.assertEqual(self.number, field_desc.number)
327a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    test.assertEqual(descriptor.FieldDescriptor.TYPE_ENUM, field_desc.type)
328a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    test.assertEqual(descriptor.FieldDescriptor.CPPTYPE_ENUM,
329a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson                     field_desc.cpp_type)
330a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    test.assertTrue(field_desc.has_default_value)
331a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    test.assertEqual(enum_desc.values_by_name[self.default_value].index,
332a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson                     field_desc.default_value)
333a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    test.assertEqual(msg_desc, field_desc.containing_type)
334a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    test.assertEqual(enum_desc, field_desc.enum_type)
335a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
336a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
337a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonclass MessageField(object):
338a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
339a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  def __init__(self, number, type_name):
340a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    self.number = number
341a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    self.type_name = type_name
342a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
343a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  def CheckField(self, test, msg_desc, name, index):
344a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    field_desc = msg_desc.fields_by_name[name]
345a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    field_type_desc = msg_desc.nested_types_by_name[self.type_name]
346a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    test.assertEqual(name, field_desc.name)
347a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    expected_field_full_name = '.'.join([msg_desc.full_name, name])
348a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    test.assertEqual(expected_field_full_name, field_desc.full_name)
349a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    test.assertEqual(index, field_desc.index)
350a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    test.assertEqual(self.number, field_desc.number)
351a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    test.assertEqual(descriptor.FieldDescriptor.TYPE_MESSAGE, field_desc.type)
352a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    test.assertEqual(descriptor.FieldDescriptor.CPPTYPE_MESSAGE,
353a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson                     field_desc.cpp_type)
354a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    test.assertFalse(field_desc.has_default_value)
355a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    test.assertEqual(msg_desc, field_desc.containing_type)
356a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    test.assertEqual(field_type_desc, field_desc.message_type)
357a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
358a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
359a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonclass StringField(object):
360a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
361a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  def __init__(self, number, default_value):
362a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    self.number = number
363a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    self.default_value = default_value
364a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
365a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  def CheckField(self, test, msg_desc, name, index):
366a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    field_desc = msg_desc.fields_by_name[name]
367a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    test.assertEqual(name, field_desc.name)
368a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    expected_field_full_name = '.'.join([msg_desc.full_name, name])
369a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    test.assertEqual(expected_field_full_name, field_desc.full_name)
370a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    test.assertEqual(index, field_desc.index)
371a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    test.assertEqual(self.number, field_desc.number)
372a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    test.assertEqual(descriptor.FieldDescriptor.TYPE_STRING, field_desc.type)
373a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    test.assertEqual(descriptor.FieldDescriptor.CPPTYPE_STRING,
374a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson                     field_desc.cpp_type)
375a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    test.assertTrue(field_desc.has_default_value)
376a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    test.assertEqual(self.default_value, field_desc.default_value)
377a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
378a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
379a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonclass ExtensionField(object):
380a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
381a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  def __init__(self, number, extended_type):
382a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    self.number = number
383a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    self.extended_type = extended_type
384a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
385a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  def CheckField(self, test, msg_desc, name, index):
386a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    field_desc = msg_desc.extensions_by_name[name]
387a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    test.assertEqual(name, field_desc.name)
388a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    expected_field_full_name = '.'.join([msg_desc.full_name, name])
389a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    test.assertEqual(expected_field_full_name, field_desc.full_name)
390a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    test.assertEqual(self.number, field_desc.number)
391a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    test.assertEqual(index, field_desc.index)
392a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    test.assertEqual(descriptor.FieldDescriptor.TYPE_MESSAGE, field_desc.type)
393a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    test.assertEqual(descriptor.FieldDescriptor.CPPTYPE_MESSAGE,
394a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson                     field_desc.cpp_type)
395a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    test.assertFalse(field_desc.has_default_value)
396a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    test.assertTrue(field_desc.is_extension)
397a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    test.assertEqual(msg_desc, field_desc.extension_scope)
398a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    test.assertEqual(msg_desc, field_desc.message_type)
399a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    test.assertEqual(self.extended_type, field_desc.containing_type.name)
400a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
401a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
402a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonclass AddDescriptorTest(basetest.TestCase):
403a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
404a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  def _TestMessage(self, prefix):
405a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    pool = descriptor_pool.DescriptorPool()
406a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    pool.AddDescriptor(unittest_pb2.TestAllTypes.DESCRIPTOR)
407a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    self.assertEquals(
408a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        'protobuf_unittest.TestAllTypes',
409a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        pool.FindMessageTypeByName(
410a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson            prefix + 'protobuf_unittest.TestAllTypes').full_name)
411a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
412a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    # AddDescriptor is not recursive.
413a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    with self.assertRaises(KeyError):
414a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      pool.FindMessageTypeByName(
415a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson          prefix + 'protobuf_unittest.TestAllTypes.NestedMessage')
416a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
417a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    pool.AddDescriptor(unittest_pb2.TestAllTypes.NestedMessage.DESCRIPTOR)
418a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    self.assertEquals(
419a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        'protobuf_unittest.TestAllTypes.NestedMessage',
420a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        pool.FindMessageTypeByName(
421a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson            prefix + 'protobuf_unittest.TestAllTypes.NestedMessage').full_name)
422a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
423a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    # Files are implicitly also indexed when messages are added.
424a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    self.assertEquals(
425a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        'google/protobuf/unittest.proto',
426a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        pool.FindFileByName(
427a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson            'google/protobuf/unittest.proto').name)
428a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
429a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    self.assertEquals(
430a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        'google/protobuf/unittest.proto',
431a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        pool.FindFileContainingSymbol(
432a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson            prefix + 'protobuf_unittest.TestAllTypes.NestedMessage').name)
433a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
434a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  def testMessage(self):
435a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    self._TestMessage('')
436a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    self._TestMessage('.')
437a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
438a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  def _TestEnum(self, prefix):
439a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    pool = descriptor_pool.DescriptorPool()
440a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    pool.AddEnumDescriptor(unittest_pb2.ForeignEnum.DESCRIPTOR)
441a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    self.assertEquals(
442a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        'protobuf_unittest.ForeignEnum',
443a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        pool.FindEnumTypeByName(
444a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson            prefix + 'protobuf_unittest.ForeignEnum').full_name)
445a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
446a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    # AddEnumDescriptor is not recursive.
447a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    with self.assertRaises(KeyError):
448a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      pool.FindEnumTypeByName(
449a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson          prefix + 'protobuf_unittest.ForeignEnum.NestedEnum')
450a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
451a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    pool.AddEnumDescriptor(unittest_pb2.TestAllTypes.NestedEnum.DESCRIPTOR)
452a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    self.assertEquals(
453a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        'protobuf_unittest.TestAllTypes.NestedEnum',
454a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        pool.FindEnumTypeByName(
455a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson            prefix + 'protobuf_unittest.TestAllTypes.NestedEnum').full_name)
456a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
457a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    # Files are implicitly also indexed when enums are added.
458a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    self.assertEquals(
459a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        'google/protobuf/unittest.proto',
460a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        pool.FindFileByName(
461a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson            'google/protobuf/unittest.proto').name)
462a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
463a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    self.assertEquals(
464a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        'google/protobuf/unittest.proto',
465a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        pool.FindFileContainingSymbol(
466a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson            prefix + 'protobuf_unittest.TestAllTypes.NestedEnum').name)
467a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
468a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  def testEnum(self):
469a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    self._TestEnum('')
470a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    self._TestEnum('.')
471a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
472a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  def testFile(self):
473a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    pool = descriptor_pool.DescriptorPool()
474a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    pool.AddFileDescriptor(unittest_pb2.DESCRIPTOR)
475a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    self.assertEquals(
476a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        'google/protobuf/unittest.proto',
477a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        pool.FindFileByName(
478a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson            'google/protobuf/unittest.proto').name)
479a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
480a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    # AddFileDescriptor is not recursive; messages and enums within files must
481a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    # be explicitly registered.
482a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    with self.assertRaises(KeyError):
483a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      pool.FindFileContainingSymbol(
484a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson          'protobuf_unittest.TestAllTypes')
485a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
486a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
487a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonTEST1_FILE = ProtoFile(
488a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    'google/protobuf/internal/descriptor_pool_test1.proto',
489a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    'google.protobuf.python.internal',
490a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    {
491a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        'DescriptorPoolTest1': MessageType({
492a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson            'NestedEnum': EnumType([('ALPHA', 1), ('BETA', 2)]),
493a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson            'NestedMessage': MessageType({
494a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson                'NestedEnum': EnumType([('EPSILON', 5), ('ZETA', 6)]),
495a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson                'DeepNestedMessage': MessageType({
496a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson                    'NestedEnum': EnumType([('ETA', 7), ('THETA', 8)]),
497a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson                }, [
498a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson                    ('nested_enum', EnumField(1, 'NestedEnum', 'ETA')),
499a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson                    ('nested_field', StringField(2, 'theta')),
500a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson                ]),
501a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson            }, [
502a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson                ('nested_enum', EnumField(1, 'NestedEnum', 'ZETA')),
503a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson                ('nested_field', StringField(2, 'beta')),
504a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson                ('deep_nested_message', MessageField(3, 'DeepNestedMessage')),
505a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson            ])
506a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        }, [
507a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson            ('nested_enum', EnumField(1, 'NestedEnum', 'BETA')),
508a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson            ('nested_message', MessageField(2, 'NestedMessage')),
509a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        ], is_extendable=True),
510a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
511a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        'DescriptorPoolTest2': MessageType({
512a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson            'NestedEnum': EnumType([('GAMMA', 3), ('DELTA', 4)]),
513a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson            'NestedMessage': MessageType({
514a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson                'NestedEnum': EnumType([('IOTA', 9), ('KAPPA', 10)]),
515a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson                'DeepNestedMessage': MessageType({
516a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson                    'NestedEnum': EnumType([('LAMBDA', 11), ('MU', 12)]),
517a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson                }, [
518a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson                    ('nested_enum', EnumField(1, 'NestedEnum', 'MU')),
519a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson                    ('nested_field', StringField(2, 'lambda')),
520a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson                ]),
521a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson            }, [
522a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson                ('nested_enum', EnumField(1, 'NestedEnum', 'IOTA')),
523a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson                ('nested_field', StringField(2, 'delta')),
524a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson                ('deep_nested_message', MessageField(3, 'DeepNestedMessage')),
525a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson            ])
526a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        }, [
527a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson            ('nested_enum', EnumField(1, 'NestedEnum', 'GAMMA')),
528a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson            ('nested_message', MessageField(2, 'NestedMessage')),
529a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        ]),
530a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    })
531a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
532a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
533a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonTEST2_FILE = ProtoFile(
534a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    'google/protobuf/internal/descriptor_pool_test2.proto',
535a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    'google.protobuf.python.internal',
536a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    {
537a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        'DescriptorPoolTest3': MessageType({
538a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson            'NestedEnum': EnumType([('NU', 13), ('XI', 14)]),
539a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson            'NestedMessage': MessageType({
540a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson                'NestedEnum': EnumType([('OMICRON', 15), ('PI', 16)]),
541a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson                'DeepNestedMessage': MessageType({
542a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson                    'NestedEnum': EnumType([('RHO', 17), ('SIGMA', 18)]),
543a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson                }, [
544a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson                    ('nested_enum', EnumField(1, 'NestedEnum', 'RHO')),
545a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson                    ('nested_field', StringField(2, 'sigma')),
546a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson                ]),
547a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson            }, [
548a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson                ('nested_enum', EnumField(1, 'NestedEnum', 'PI')),
549a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson                ('nested_field', StringField(2, 'nu')),
550a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson                ('deep_nested_message', MessageField(3, 'DeepNestedMessage')),
551a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson            ])
552a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        }, [
553a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson            ('nested_enum', EnumField(1, 'NestedEnum', 'XI')),
554a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson            ('nested_message', MessageField(2, 'NestedMessage')),
555a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        ], extensions=[
556a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson            ('descriptor_pool_test',
557a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson             ExtensionField(1001, 'DescriptorPoolTest1')),
558a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        ]),
559a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    },
560a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    dependencies=['google/protobuf/internal/descriptor_pool_test1.proto'])
561a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
562a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
563a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonif __name__ == '__main__':
564a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  basetest.main()
565