descriptor_test.py 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679
  1. #! /usr/bin/python
  2. #
  3. # Protocol Buffers - Google's data interchange format
  4. # Copyright 2008 Google Inc. All rights reserved.
  5. # https://developers.google.com/protocol-buffers/
  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. """Unittest for google.protobuf.internal.descriptor."""
  33. __author__ = 'robinson@google.com (Will Robinson)'
  34. from google.apputils import basetest
  35. from google.protobuf import unittest_custom_options_pb2
  36. from google.protobuf import unittest_import_pb2
  37. from google.protobuf import unittest_pb2
  38. from google.protobuf import descriptor_pb2
  39. from google.protobuf import descriptor
  40. from google.protobuf import text_format
  41. TEST_EMPTY_MESSAGE_DESCRIPTOR_ASCII = """
  42. name: 'TestEmptyMessage'
  43. """
  44. class DescriptorTest(basetest.TestCase):
  45. def setUp(self):
  46. self.my_file = descriptor.FileDescriptor(
  47. name='some/filename/some.proto',
  48. package='protobuf_unittest'
  49. )
  50. self.my_enum = descriptor.EnumDescriptor(
  51. name='ForeignEnum',
  52. full_name='protobuf_unittest.ForeignEnum',
  53. filename=None,
  54. file=self.my_file,
  55. values=[
  56. descriptor.EnumValueDescriptor(name='FOREIGN_FOO', index=0, number=4),
  57. descriptor.EnumValueDescriptor(name='FOREIGN_BAR', index=1, number=5),
  58. descriptor.EnumValueDescriptor(name='FOREIGN_BAZ', index=2, number=6),
  59. ])
  60. self.my_message = descriptor.Descriptor(
  61. name='NestedMessage',
  62. full_name='protobuf_unittest.TestAllTypes.NestedMessage',
  63. filename=None,
  64. file=self.my_file,
  65. containing_type=None,
  66. fields=[
  67. descriptor.FieldDescriptor(
  68. name='bb',
  69. full_name='protobuf_unittest.TestAllTypes.NestedMessage.bb',
  70. index=0, number=1,
  71. type=5, cpp_type=1, label=1,
  72. has_default_value=False, default_value=0,
  73. message_type=None, enum_type=None, containing_type=None,
  74. is_extension=False, extension_scope=None),
  75. ],
  76. nested_types=[],
  77. enum_types=[
  78. self.my_enum,
  79. ],
  80. extensions=[])
  81. self.my_method = descriptor.MethodDescriptor(
  82. name='Bar',
  83. full_name='protobuf_unittest.TestService.Bar',
  84. index=0,
  85. containing_service=None,
  86. input_type=None,
  87. output_type=None)
  88. self.my_service = descriptor.ServiceDescriptor(
  89. name='TestServiceWithOptions',
  90. full_name='protobuf_unittest.TestServiceWithOptions',
  91. file=self.my_file,
  92. index=0,
  93. methods=[
  94. self.my_method
  95. ])
  96. def testEnumValueName(self):
  97. self.assertEqual(self.my_message.EnumValueName('ForeignEnum', 4),
  98. 'FOREIGN_FOO')
  99. self.assertEqual(
  100. self.my_message.enum_types_by_name[
  101. 'ForeignEnum'].values_by_number[4].name,
  102. self.my_message.EnumValueName('ForeignEnum', 4))
  103. def testEnumFixups(self):
  104. self.assertEqual(self.my_enum, self.my_enum.values[0].type)
  105. def testContainingTypeFixups(self):
  106. self.assertEqual(self.my_message, self.my_message.fields[0].containing_type)
  107. self.assertEqual(self.my_message, self.my_enum.containing_type)
  108. def testContainingServiceFixups(self):
  109. self.assertEqual(self.my_service, self.my_method.containing_service)
  110. def testGetOptions(self):
  111. self.assertEqual(self.my_enum.GetOptions(),
  112. descriptor_pb2.EnumOptions())
  113. self.assertEqual(self.my_enum.values[0].GetOptions(),
  114. descriptor_pb2.EnumValueOptions())
  115. self.assertEqual(self.my_message.GetOptions(),
  116. descriptor_pb2.MessageOptions())
  117. self.assertEqual(self.my_message.fields[0].GetOptions(),
  118. descriptor_pb2.FieldOptions())
  119. self.assertEqual(self.my_method.GetOptions(),
  120. descriptor_pb2.MethodOptions())
  121. self.assertEqual(self.my_service.GetOptions(),
  122. descriptor_pb2.ServiceOptions())
  123. def testSimpleCustomOptions(self):
  124. file_descriptor = unittest_custom_options_pb2.DESCRIPTOR
  125. message_descriptor =\
  126. unittest_custom_options_pb2.TestMessageWithCustomOptions.DESCRIPTOR
  127. field_descriptor = message_descriptor.fields_by_name["field1"]
  128. enum_descriptor = message_descriptor.enum_types_by_name["AnEnum"]
  129. enum_value_descriptor =\
  130. message_descriptor.enum_values_by_name["ANENUM_VAL2"]
  131. service_descriptor =\
  132. unittest_custom_options_pb2.TestServiceWithCustomOptions.DESCRIPTOR
  133. method_descriptor = service_descriptor.FindMethodByName("Foo")
  134. file_options = file_descriptor.GetOptions()
  135. file_opt1 = unittest_custom_options_pb2.file_opt1
  136. self.assertEqual(9876543210, file_options.Extensions[file_opt1])
  137. message_options = message_descriptor.GetOptions()
  138. message_opt1 = unittest_custom_options_pb2.message_opt1
  139. self.assertEqual(-56, message_options.Extensions[message_opt1])
  140. field_options = field_descriptor.GetOptions()
  141. field_opt1 = unittest_custom_options_pb2.field_opt1
  142. self.assertEqual(8765432109, field_options.Extensions[field_opt1])
  143. field_opt2 = unittest_custom_options_pb2.field_opt2
  144. self.assertEqual(42, field_options.Extensions[field_opt2])
  145. enum_options = enum_descriptor.GetOptions()
  146. enum_opt1 = unittest_custom_options_pb2.enum_opt1
  147. self.assertEqual(-789, enum_options.Extensions[enum_opt1])
  148. enum_value_options = enum_value_descriptor.GetOptions()
  149. enum_value_opt1 = unittest_custom_options_pb2.enum_value_opt1
  150. self.assertEqual(123, enum_value_options.Extensions[enum_value_opt1])
  151. service_options = service_descriptor.GetOptions()
  152. service_opt1 = unittest_custom_options_pb2.service_opt1
  153. self.assertEqual(-9876543210, service_options.Extensions[service_opt1])
  154. method_options = method_descriptor.GetOptions()
  155. method_opt1 = unittest_custom_options_pb2.method_opt1
  156. self.assertEqual(unittest_custom_options_pb2.METHODOPT1_VAL2,
  157. method_options.Extensions[method_opt1])
  158. def testDifferentCustomOptionTypes(self):
  159. kint32min = -2**31
  160. kint64min = -2**63
  161. kint32max = 2**31 - 1
  162. kint64max = 2**63 - 1
  163. kuint32max = 2**32 - 1
  164. kuint64max = 2**64 - 1
  165. message_descriptor =\
  166. unittest_custom_options_pb2.CustomOptionMinIntegerValues.DESCRIPTOR
  167. message_options = message_descriptor.GetOptions()
  168. self.assertEqual(False, message_options.Extensions[
  169. unittest_custom_options_pb2.bool_opt])
  170. self.assertEqual(kint32min, message_options.Extensions[
  171. unittest_custom_options_pb2.int32_opt])
  172. self.assertEqual(kint64min, message_options.Extensions[
  173. unittest_custom_options_pb2.int64_opt])
  174. self.assertEqual(0, message_options.Extensions[
  175. unittest_custom_options_pb2.uint32_opt])
  176. self.assertEqual(0, message_options.Extensions[
  177. unittest_custom_options_pb2.uint64_opt])
  178. self.assertEqual(kint32min, message_options.Extensions[
  179. unittest_custom_options_pb2.sint32_opt])
  180. self.assertEqual(kint64min, message_options.Extensions[
  181. unittest_custom_options_pb2.sint64_opt])
  182. self.assertEqual(0, message_options.Extensions[
  183. unittest_custom_options_pb2.fixed32_opt])
  184. self.assertEqual(0, message_options.Extensions[
  185. unittest_custom_options_pb2.fixed64_opt])
  186. self.assertEqual(kint32min, message_options.Extensions[
  187. unittest_custom_options_pb2.sfixed32_opt])
  188. self.assertEqual(kint64min, message_options.Extensions[
  189. unittest_custom_options_pb2.sfixed64_opt])
  190. message_descriptor =\
  191. unittest_custom_options_pb2.CustomOptionMaxIntegerValues.DESCRIPTOR
  192. message_options = message_descriptor.GetOptions()
  193. self.assertEqual(True, message_options.Extensions[
  194. unittest_custom_options_pb2.bool_opt])
  195. self.assertEqual(kint32max, message_options.Extensions[
  196. unittest_custom_options_pb2.int32_opt])
  197. self.assertEqual(kint64max, message_options.Extensions[
  198. unittest_custom_options_pb2.int64_opt])
  199. self.assertEqual(kuint32max, message_options.Extensions[
  200. unittest_custom_options_pb2.uint32_opt])
  201. self.assertEqual(kuint64max, message_options.Extensions[
  202. unittest_custom_options_pb2.uint64_opt])
  203. self.assertEqual(kint32max, message_options.Extensions[
  204. unittest_custom_options_pb2.sint32_opt])
  205. self.assertEqual(kint64max, message_options.Extensions[
  206. unittest_custom_options_pb2.sint64_opt])
  207. self.assertEqual(kuint32max, message_options.Extensions[
  208. unittest_custom_options_pb2.fixed32_opt])
  209. self.assertEqual(kuint64max, message_options.Extensions[
  210. unittest_custom_options_pb2.fixed64_opt])
  211. self.assertEqual(kint32max, message_options.Extensions[
  212. unittest_custom_options_pb2.sfixed32_opt])
  213. self.assertEqual(kint64max, message_options.Extensions[
  214. unittest_custom_options_pb2.sfixed64_opt])
  215. message_descriptor =\
  216. unittest_custom_options_pb2.CustomOptionOtherValues.DESCRIPTOR
  217. message_options = message_descriptor.GetOptions()
  218. self.assertEqual(-100, message_options.Extensions[
  219. unittest_custom_options_pb2.int32_opt])
  220. self.assertAlmostEqual(12.3456789, message_options.Extensions[
  221. unittest_custom_options_pb2.float_opt], 6)
  222. self.assertAlmostEqual(1.234567890123456789, message_options.Extensions[
  223. unittest_custom_options_pb2.double_opt])
  224. self.assertEqual("Hello, \"World\"", message_options.Extensions[
  225. unittest_custom_options_pb2.string_opt])
  226. self.assertEqual(b"Hello\0World", message_options.Extensions[
  227. unittest_custom_options_pb2.bytes_opt])
  228. dummy_enum = unittest_custom_options_pb2.DummyMessageContainingEnum
  229. self.assertEqual(
  230. dummy_enum.TEST_OPTION_ENUM_TYPE2,
  231. message_options.Extensions[unittest_custom_options_pb2.enum_opt])
  232. message_descriptor =\
  233. unittest_custom_options_pb2.SettingRealsFromPositiveInts.DESCRIPTOR
  234. message_options = message_descriptor.GetOptions()
  235. self.assertAlmostEqual(12, message_options.Extensions[
  236. unittest_custom_options_pb2.float_opt], 6)
  237. self.assertAlmostEqual(154, message_options.Extensions[
  238. unittest_custom_options_pb2.double_opt])
  239. message_descriptor =\
  240. unittest_custom_options_pb2.SettingRealsFromNegativeInts.DESCRIPTOR
  241. message_options = message_descriptor.GetOptions()
  242. self.assertAlmostEqual(-12, message_options.Extensions[
  243. unittest_custom_options_pb2.float_opt], 6)
  244. self.assertAlmostEqual(-154, message_options.Extensions[
  245. unittest_custom_options_pb2.double_opt])
  246. def testComplexExtensionOptions(self):
  247. descriptor =\
  248. unittest_custom_options_pb2.VariousComplexOptions.DESCRIPTOR
  249. options = descriptor.GetOptions()
  250. self.assertEqual(42, options.Extensions[
  251. unittest_custom_options_pb2.complex_opt1].foo)
  252. self.assertEqual(324, options.Extensions[
  253. unittest_custom_options_pb2.complex_opt1].Extensions[
  254. unittest_custom_options_pb2.quux])
  255. self.assertEqual(876, options.Extensions[
  256. unittest_custom_options_pb2.complex_opt1].Extensions[
  257. unittest_custom_options_pb2.corge].qux)
  258. self.assertEqual(987, options.Extensions[
  259. unittest_custom_options_pb2.complex_opt2].baz)
  260. self.assertEqual(654, options.Extensions[
  261. unittest_custom_options_pb2.complex_opt2].Extensions[
  262. unittest_custom_options_pb2.grault])
  263. self.assertEqual(743, options.Extensions[
  264. unittest_custom_options_pb2.complex_opt2].bar.foo)
  265. self.assertEqual(1999, options.Extensions[
  266. unittest_custom_options_pb2.complex_opt2].bar.Extensions[
  267. unittest_custom_options_pb2.quux])
  268. self.assertEqual(2008, options.Extensions[
  269. unittest_custom_options_pb2.complex_opt2].bar.Extensions[
  270. unittest_custom_options_pb2.corge].qux)
  271. self.assertEqual(741, options.Extensions[
  272. unittest_custom_options_pb2.complex_opt2].Extensions[
  273. unittest_custom_options_pb2.garply].foo)
  274. self.assertEqual(1998, options.Extensions[
  275. unittest_custom_options_pb2.complex_opt2].Extensions[
  276. unittest_custom_options_pb2.garply].Extensions[
  277. unittest_custom_options_pb2.quux])
  278. self.assertEqual(2121, options.Extensions[
  279. unittest_custom_options_pb2.complex_opt2].Extensions[
  280. unittest_custom_options_pb2.garply].Extensions[
  281. unittest_custom_options_pb2.corge].qux)
  282. self.assertEqual(1971, options.Extensions[
  283. unittest_custom_options_pb2.ComplexOptionType2
  284. .ComplexOptionType4.complex_opt4].waldo)
  285. self.assertEqual(321, options.Extensions[
  286. unittest_custom_options_pb2.complex_opt2].fred.waldo)
  287. self.assertEqual(9, options.Extensions[
  288. unittest_custom_options_pb2.complex_opt3].qux)
  289. self.assertEqual(22, options.Extensions[
  290. unittest_custom_options_pb2.complex_opt3].complexoptiontype5.plugh)
  291. self.assertEqual(24, options.Extensions[
  292. unittest_custom_options_pb2.complexopt6].xyzzy)
  293. # Check that aggregate options were parsed and saved correctly in
  294. # the appropriate descriptors.
  295. def testAggregateOptions(self):
  296. file_descriptor = unittest_custom_options_pb2.DESCRIPTOR
  297. message_descriptor =\
  298. unittest_custom_options_pb2.AggregateMessage.DESCRIPTOR
  299. field_descriptor = message_descriptor.fields_by_name["fieldname"]
  300. enum_descriptor = unittest_custom_options_pb2.AggregateEnum.DESCRIPTOR
  301. enum_value_descriptor = enum_descriptor.values_by_name["VALUE"]
  302. service_descriptor =\
  303. unittest_custom_options_pb2.AggregateService.DESCRIPTOR
  304. method_descriptor = service_descriptor.FindMethodByName("Method")
  305. # Tests for the different types of data embedded in fileopt
  306. file_options = file_descriptor.GetOptions().Extensions[
  307. unittest_custom_options_pb2.fileopt]
  308. self.assertEqual(100, file_options.i)
  309. self.assertEqual("FileAnnotation", file_options.s)
  310. self.assertEqual("NestedFileAnnotation", file_options.sub.s)
  311. self.assertEqual("FileExtensionAnnotation", file_options.file.Extensions[
  312. unittest_custom_options_pb2.fileopt].s)
  313. self.assertEqual("EmbeddedMessageSetElement", file_options.mset.Extensions[
  314. unittest_custom_options_pb2.AggregateMessageSetElement
  315. .message_set_extension].s)
  316. # Simple tests for all the other types of annotations
  317. self.assertEqual(
  318. "MessageAnnotation",
  319. message_descriptor.GetOptions().Extensions[
  320. unittest_custom_options_pb2.msgopt].s)
  321. self.assertEqual(
  322. "FieldAnnotation",
  323. field_descriptor.GetOptions().Extensions[
  324. unittest_custom_options_pb2.fieldopt].s)
  325. self.assertEqual(
  326. "EnumAnnotation",
  327. enum_descriptor.GetOptions().Extensions[
  328. unittest_custom_options_pb2.enumopt].s)
  329. self.assertEqual(
  330. "EnumValueAnnotation",
  331. enum_value_descriptor.GetOptions().Extensions[
  332. unittest_custom_options_pb2.enumvalopt].s)
  333. self.assertEqual(
  334. "ServiceAnnotation",
  335. service_descriptor.GetOptions().Extensions[
  336. unittest_custom_options_pb2.serviceopt].s)
  337. self.assertEqual(
  338. "MethodAnnotation",
  339. method_descriptor.GetOptions().Extensions[
  340. unittest_custom_options_pb2.methodopt].s)
  341. def testNestedOptions(self):
  342. nested_message =\
  343. unittest_custom_options_pb2.NestedOptionType.NestedMessage.DESCRIPTOR
  344. self.assertEqual(1001, nested_message.GetOptions().Extensions[
  345. unittest_custom_options_pb2.message_opt1])
  346. nested_field = nested_message.fields_by_name["nested_field"]
  347. self.assertEqual(1002, nested_field.GetOptions().Extensions[
  348. unittest_custom_options_pb2.field_opt1])
  349. outer_message =\
  350. unittest_custom_options_pb2.NestedOptionType.DESCRIPTOR
  351. nested_enum = outer_message.enum_types_by_name["NestedEnum"]
  352. self.assertEqual(1003, nested_enum.GetOptions().Extensions[
  353. unittest_custom_options_pb2.enum_opt1])
  354. nested_enum_value = outer_message.enum_values_by_name["NESTED_ENUM_VALUE"]
  355. self.assertEqual(1004, nested_enum_value.GetOptions().Extensions[
  356. unittest_custom_options_pb2.enum_value_opt1])
  357. nested_extension = outer_message.extensions_by_name["nested_extension"]
  358. self.assertEqual(1005, nested_extension.GetOptions().Extensions[
  359. unittest_custom_options_pb2.field_opt2])
  360. def testFileDescriptorReferences(self):
  361. self.assertEqual(self.my_enum.file, self.my_file)
  362. self.assertEqual(self.my_message.file, self.my_file)
  363. def testFileDescriptor(self):
  364. self.assertEqual(self.my_file.name, 'some/filename/some.proto')
  365. self.assertEqual(self.my_file.package, 'protobuf_unittest')
  366. class DescriptorCopyToProtoTest(basetest.TestCase):
  367. """Tests for CopyTo functions of Descriptor."""
  368. def _AssertProtoEqual(self, actual_proto, expected_class, expected_ascii):
  369. expected_proto = expected_class()
  370. text_format.Merge(expected_ascii, expected_proto)
  371. self.assertEqual(
  372. actual_proto, expected_proto,
  373. 'Not equal,\nActual:\n%s\nExpected:\n%s\n'
  374. % (str(actual_proto), str(expected_proto)))
  375. def _InternalTestCopyToProto(self, desc, expected_proto_class,
  376. expected_proto_ascii):
  377. actual = expected_proto_class()
  378. desc.CopyToProto(actual)
  379. self._AssertProtoEqual(
  380. actual, expected_proto_class, expected_proto_ascii)
  381. def testCopyToProto_EmptyMessage(self):
  382. self._InternalTestCopyToProto(
  383. unittest_pb2.TestEmptyMessage.DESCRIPTOR,
  384. descriptor_pb2.DescriptorProto,
  385. TEST_EMPTY_MESSAGE_DESCRIPTOR_ASCII)
  386. def testCopyToProto_NestedMessage(self):
  387. TEST_NESTED_MESSAGE_ASCII = """
  388. name: 'NestedMessage'
  389. field: <
  390. name: 'bb'
  391. number: 1
  392. label: 1 # Optional
  393. type: 5 # TYPE_INT32
  394. >
  395. """
  396. self._InternalTestCopyToProto(
  397. unittest_pb2.TestAllTypes.NestedMessage.DESCRIPTOR,
  398. descriptor_pb2.DescriptorProto,
  399. TEST_NESTED_MESSAGE_ASCII)
  400. def testCopyToProto_ForeignNestedMessage(self):
  401. TEST_FOREIGN_NESTED_ASCII = """
  402. name: 'TestForeignNested'
  403. field: <
  404. name: 'foreign_nested'
  405. number: 1
  406. label: 1 # Optional
  407. type: 11 # TYPE_MESSAGE
  408. type_name: '.protobuf_unittest.TestAllTypes.NestedMessage'
  409. >
  410. """
  411. self._InternalTestCopyToProto(
  412. unittest_pb2.TestForeignNested.DESCRIPTOR,
  413. descriptor_pb2.DescriptorProto,
  414. TEST_FOREIGN_NESTED_ASCII)
  415. def testCopyToProto_ForeignEnum(self):
  416. TEST_FOREIGN_ENUM_ASCII = """
  417. name: 'ForeignEnum'
  418. value: <
  419. name: 'FOREIGN_FOO'
  420. number: 4
  421. >
  422. value: <
  423. name: 'FOREIGN_BAR'
  424. number: 5
  425. >
  426. value: <
  427. name: 'FOREIGN_BAZ'
  428. number: 6
  429. >
  430. """
  431. self._InternalTestCopyToProto(
  432. unittest_pb2._FOREIGNENUM,
  433. descriptor_pb2.EnumDescriptorProto,
  434. TEST_FOREIGN_ENUM_ASCII)
  435. def testCopyToProto_Options(self):
  436. TEST_DEPRECATED_FIELDS_ASCII = """
  437. name: 'TestDeprecatedFields'
  438. field: <
  439. name: 'deprecated_int32'
  440. number: 1
  441. label: 1 # Optional
  442. type: 5 # TYPE_INT32
  443. options: <
  444. deprecated: true
  445. >
  446. >
  447. """
  448. self._InternalTestCopyToProto(
  449. unittest_pb2.TestDeprecatedFields.DESCRIPTOR,
  450. descriptor_pb2.DescriptorProto,
  451. TEST_DEPRECATED_FIELDS_ASCII)
  452. def testCopyToProto_AllExtensions(self):
  453. TEST_EMPTY_MESSAGE_WITH_EXTENSIONS_ASCII = """
  454. name: 'TestEmptyMessageWithExtensions'
  455. extension_range: <
  456. start: 1
  457. end: 536870912
  458. >
  459. """
  460. self._InternalTestCopyToProto(
  461. unittest_pb2.TestEmptyMessageWithExtensions.DESCRIPTOR,
  462. descriptor_pb2.DescriptorProto,
  463. TEST_EMPTY_MESSAGE_WITH_EXTENSIONS_ASCII)
  464. def testCopyToProto_SeveralExtensions(self):
  465. TEST_MESSAGE_WITH_SEVERAL_EXTENSIONS_ASCII = """
  466. name: 'TestMultipleExtensionRanges'
  467. extension_range: <
  468. start: 42
  469. end: 43
  470. >
  471. extension_range: <
  472. start: 4143
  473. end: 4244
  474. >
  475. extension_range: <
  476. start: 65536
  477. end: 536870912
  478. >
  479. """
  480. self._InternalTestCopyToProto(
  481. unittest_pb2.TestMultipleExtensionRanges.DESCRIPTOR,
  482. descriptor_pb2.DescriptorProto,
  483. TEST_MESSAGE_WITH_SEVERAL_EXTENSIONS_ASCII)
  484. # Disable this test so we can make changes to the proto file.
  485. # TODO(xiaofeng): Enable this test after cl/55530659 is submitted.
  486. #
  487. # def testCopyToProto_FileDescriptor(self):
  488. # UNITTEST_IMPORT_FILE_DESCRIPTOR_ASCII = ("""
  489. # name: 'google/protobuf/unittest_import.proto'
  490. # package: 'protobuf_unittest_import'
  491. # dependency: 'google/protobuf/unittest_import_public.proto'
  492. # message_type: <
  493. # name: 'ImportMessage'
  494. # field: <
  495. # name: 'd'
  496. # number: 1
  497. # label: 1 # Optional
  498. # type: 5 # TYPE_INT32
  499. # >
  500. # >
  501. # """ +
  502. # """enum_type: <
  503. # name: 'ImportEnum'
  504. # value: <
  505. # name: 'IMPORT_FOO'
  506. # number: 7
  507. # >
  508. # value: <
  509. # name: 'IMPORT_BAR'
  510. # number: 8
  511. # >
  512. # value: <
  513. # name: 'IMPORT_BAZ'
  514. # number: 9
  515. # >
  516. # >
  517. # options: <
  518. # java_package: 'com.google.protobuf.test'
  519. # optimize_for: 1 # SPEED
  520. # >
  521. # public_dependency: 0
  522. # """)
  523. # self._InternalTestCopyToProto(
  524. # unittest_import_pb2.DESCRIPTOR,
  525. # descriptor_pb2.FileDescriptorProto,
  526. # UNITTEST_IMPORT_FILE_DESCRIPTOR_ASCII)
  527. def testCopyToProto_ServiceDescriptor(self):
  528. TEST_SERVICE_ASCII = """
  529. name: 'TestService'
  530. method: <
  531. name: 'Foo'
  532. input_type: '.protobuf_unittest.FooRequest'
  533. output_type: '.protobuf_unittest.FooResponse'
  534. >
  535. method: <
  536. name: 'Bar'
  537. input_type: '.protobuf_unittest.BarRequest'
  538. output_type: '.protobuf_unittest.BarResponse'
  539. >
  540. """
  541. self._InternalTestCopyToProto(
  542. unittest_pb2.TestService.DESCRIPTOR,
  543. descriptor_pb2.ServiceDescriptorProto,
  544. TEST_SERVICE_ASCII)
  545. class MakeDescriptorTest(basetest.TestCase):
  546. def testMakeDescriptorWithNestedFields(self):
  547. file_descriptor_proto = descriptor_pb2.FileDescriptorProto()
  548. file_descriptor_proto.name = 'Foo2'
  549. message_type = file_descriptor_proto.message_type.add()
  550. message_type.name = file_descriptor_proto.name
  551. nested_type = message_type.nested_type.add()
  552. nested_type.name = 'Sub'
  553. enum_type = nested_type.enum_type.add()
  554. enum_type.name = 'FOO'
  555. enum_type_val = enum_type.value.add()
  556. enum_type_val.name = 'BAR'
  557. enum_type_val.number = 3
  558. field = message_type.field.add()
  559. field.number = 1
  560. field.name = 'uint64_field'
  561. field.label = descriptor.FieldDescriptor.LABEL_REQUIRED
  562. field.type = descriptor.FieldDescriptor.TYPE_UINT64
  563. field = message_type.field.add()
  564. field.number = 2
  565. field.name = 'nested_message_field'
  566. field.label = descriptor.FieldDescriptor.LABEL_REQUIRED
  567. field.type = descriptor.FieldDescriptor.TYPE_MESSAGE
  568. field.type_name = 'Sub'
  569. enum_field = nested_type.field.add()
  570. enum_field.number = 2
  571. enum_field.name = 'bar_field'
  572. enum_field.label = descriptor.FieldDescriptor.LABEL_REQUIRED
  573. enum_field.type = descriptor.FieldDescriptor.TYPE_ENUM
  574. enum_field.type_name = 'Foo2.Sub.FOO'
  575. result = descriptor.MakeDescriptor(message_type)
  576. self.assertEqual(result.fields[0].cpp_type,
  577. descriptor.FieldDescriptor.CPPTYPE_UINT64)
  578. self.assertEqual(result.fields[1].cpp_type,
  579. descriptor.FieldDescriptor.CPPTYPE_MESSAGE)
  580. self.assertEqual(result.fields[1].message_type.containing_type,
  581. result)
  582. self.assertEqual(result.nested_types[0].fields[0].full_name,
  583. 'Foo2.Sub.bar_field')
  584. self.assertEqual(result.nested_types[0].fields[0].enum_type,
  585. result.nested_types[0].enum_types[0])
  586. def testMakeDescriptorWithUnsignedIntField(self):
  587. file_descriptor_proto = descriptor_pb2.FileDescriptorProto()
  588. file_descriptor_proto.name = 'Foo'
  589. message_type = file_descriptor_proto.message_type.add()
  590. message_type.name = file_descriptor_proto.name
  591. enum_type = message_type.enum_type.add()
  592. enum_type.name = 'FOO'
  593. enum_type_val = enum_type.value.add()
  594. enum_type_val.name = 'BAR'
  595. enum_type_val.number = 3
  596. field = message_type.field.add()
  597. field.number = 1
  598. field.name = 'uint64_field'
  599. field.label = descriptor.FieldDescriptor.LABEL_REQUIRED
  600. field.type = descriptor.FieldDescriptor.TYPE_UINT64
  601. enum_field = message_type.field.add()
  602. enum_field.number = 2
  603. enum_field.name = 'bar_field'
  604. enum_field.label = descriptor.FieldDescriptor.LABEL_REQUIRED
  605. enum_field.type = descriptor.FieldDescriptor.TYPE_ENUM
  606. enum_field.type_name = 'Foo.FOO'
  607. result = descriptor.MakeDescriptor(message_type)
  608. self.assertEqual(result.fields[0].cpp_type,
  609. descriptor.FieldDescriptor.CPPTYPE_UINT64)
  610. def testMakeDescriptorWithOptions(self):
  611. descriptor_proto = descriptor_pb2.DescriptorProto()
  612. aggregate_message = unittest_custom_options_pb2.AggregateMessage
  613. aggregate_message.DESCRIPTOR.CopyToProto(descriptor_proto)
  614. reformed_descriptor = descriptor.MakeDescriptor(descriptor_proto)
  615. options = reformed_descriptor.GetOptions()
  616. self.assertEquals(101,
  617. options.Extensions[unittest_custom_options_pb2.msgopt].i)
  618. if __name__ == '__main__':
  619. basetest.main()