protoc 2.6.1.1 → 2.6.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (479) hide show
  1. checksums.yaml +4 -4
  2. data/ext/protoc/Makefile.in +10 -13
  3. data/ext/protoc/extconf.rb +0 -1
  4. data/ext/protoc/protobuf/CHANGES.txt +593 -0
  5. data/ext/protoc/protobuf/CONTRIBUTORS.txt +93 -0
  6. data/ext/protoc/protobuf/INSTALL.txt +237 -0
  7. data/ext/protoc/protobuf/LICENSE +33 -0
  8. data/ext/protoc/protobuf/Makefile.am +267 -0
  9. data/ext/protoc/protobuf/README.md +167 -0
  10. data/ext/protoc/protobuf/autogen.sh +41 -0
  11. data/ext/protoc/protobuf/benchmarks/ProtoBench.java +203 -0
  12. data/ext/protoc/protobuf/benchmarks/google_message1.dat +0 -0
  13. data/ext/protoc/protobuf/benchmarks/google_message2.dat +0 -0
  14. data/ext/protoc/protobuf/benchmarks/google_size.proto +136 -0
  15. data/ext/protoc/protobuf/benchmarks/google_speed.proto +136 -0
  16. data/ext/protoc/protobuf/benchmarks/readme.txt +50 -0
  17. data/ext/protoc/protobuf/configure.ac +159 -0
  18. data/ext/protoc/protobuf/editors/README.txt +5 -0
  19. data/ext/protoc/protobuf/editors/proto.vim +105 -0
  20. data/ext/protoc/protobuf/editors/protobuf-mode.el +220 -0
  21. data/ext/protoc/protobuf/examples/AddPerson.java +95 -0
  22. data/ext/protoc/protobuf/examples/ListPeople.java +50 -0
  23. data/ext/protoc/protobuf/examples/Makefile +58 -0
  24. data/ext/protoc/protobuf/examples/README.txt +29 -0
  25. data/ext/protoc/protobuf/examples/add_person.cc +95 -0
  26. data/ext/protoc/protobuf/examples/add_person.py +58 -0
  27. data/ext/protoc/protobuf/examples/addressbook.proto +30 -0
  28. data/ext/protoc/protobuf/examples/list_people.cc +68 -0
  29. data/ext/protoc/protobuf/examples/list_people.py +38 -0
  30. data/ext/protoc/protobuf/generate_descriptor_proto.sh +33 -0
  31. data/ext/protoc/protobuf/java/README.txt +96 -0
  32. data/ext/protoc/protobuf/java/pom.xml +217 -0
  33. data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/AbstractMessage.java +466 -0
  34. data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/AbstractMessageLite.java +355 -0
  35. data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/AbstractParser.java +253 -0
  36. data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/BlockingRpcChannel.java +51 -0
  37. data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/BlockingService.java +64 -0
  38. data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/BoundedByteString.java +163 -0
  39. data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/ByteString.java +1022 -0
  40. data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/CodedInputStream.java +1311 -0
  41. data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/CodedOutputStream.java +1297 -0
  42. data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/Descriptors.java +2238 -0
  43. data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/DynamicMessage.java +622 -0
  44. data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/Extension.java +96 -0
  45. data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/ExtensionRegistry.java +392 -0
  46. data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/ExtensionRegistryLite.java +185 -0
  47. data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/FieldSet.java +907 -0
  48. data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/GeneratedMessage.java +2213 -0
  49. data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/GeneratedMessageLite.java +949 -0
  50. data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/Internal.java +391 -0
  51. data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/InvalidProtocolBufferException.java +122 -0
  52. data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/LazyField.java +154 -0
  53. data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/LazyFieldLite.java +176 -0
  54. data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/LazyStringArrayList.java +367 -0
  55. data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/LazyStringList.java +163 -0
  56. data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/LiteralByteString.java +362 -0
  57. data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/Message.java +244 -0
  58. data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/MessageLite.java +320 -0
  59. data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/MessageLiteOrBuilder.java +60 -0
  60. data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/MessageOrBuilder.java +143 -0
  61. data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/MessageReflection.java +931 -0
  62. data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/Parser.java +261 -0
  63. data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/ProtocolMessageEnum.java +58 -0
  64. data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/ProtocolStringList.java +48 -0
  65. data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/RepeatedFieldBuilder.java +696 -0
  66. data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/RopeByteString.java +957 -0
  67. data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/RpcCallback.java +47 -0
  68. data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/RpcChannel.java +71 -0
  69. data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/RpcController.java +118 -0
  70. data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/RpcUtil.java +134 -0
  71. data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/Service.java +117 -0
  72. data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/ServiceException.java +52 -0
  73. data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/SingleFieldBuilder.java +241 -0
  74. data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/SmallSortedMap.java +618 -0
  75. data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/TextFormat.java +1984 -0
  76. data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/UninitializedMessageException.java +99 -0
  77. data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/UnknownFieldSet.java +995 -0
  78. data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/UnmodifiableLazyStringList.java +205 -0
  79. data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/Utf8.java +349 -0
  80. data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/WireFormat.java +163 -0
  81. data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/AbstractMessageTest.java +527 -0
  82. data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/BoundedByteStringTest.java +68 -0
  83. data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/ByteStringTest.java +759 -0
  84. data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/CheckUtf8Test.java +141 -0
  85. data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/CodedInputStreamTest.java +769 -0
  86. data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/CodedOutputStreamTest.java +401 -0
  87. data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/DeprecatedFieldTest.java +80 -0
  88. data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/DescriptorsTest.java +735 -0
  89. data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/DynamicMessageTest.java +326 -0
  90. data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/ForceFieldBuildersPreRun.java +48 -0
  91. data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/GeneratedMessageTest.java +1515 -0
  92. data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/IsValidUtf8Test.java +180 -0
  93. data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/IsValidUtf8TestUtil.java +421 -0
  94. data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/LazyFieldLiteTest.java +134 -0
  95. data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/LazyFieldTest.java +121 -0
  96. data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/LazyMessageLiteTest.java +319 -0
  97. data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/LazyStringArrayListTest.java +174 -0
  98. data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/LazyStringEndToEndTest.java +143 -0
  99. data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/LiteEqualsAndHashTest.java +85 -0
  100. data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/LiteTest.java +148 -0
  101. data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/LiteralByteStringTest.java +396 -0
  102. data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/MessageTest.java +353 -0
  103. data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/NestedBuildersTest.java +185 -0
  104. data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/ParserTest.java +381 -0
  105. data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/RepeatedFieldBuilderTest.java +190 -0
  106. data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/RopeByteStringSubstringTest.java +97 -0
  107. data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/RopeByteStringTest.java +115 -0
  108. data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/ServiceTest.java +320 -0
  109. data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/SingleFieldBuilderTest.java +155 -0
  110. data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/SmallSortedMapTest.java +420 -0
  111. data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/TestBadIdentifiers.java +96 -0
  112. data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/TestUtil.java +4124 -0
  113. data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/TextFormatTest.java +994 -0
  114. data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/UnknownFieldSetTest.java +653 -0
  115. data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/UnmodifiableLazyStringListTest.java +227 -0
  116. data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/WireFormatTest.java +606 -0
  117. data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/lazy_fields_lite.proto +61 -0
  118. data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/lite_equals_and_hash.proto +55 -0
  119. data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/multiple_files_test.proto +77 -0
  120. data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/nested_builders_test.proto +53 -0
  121. data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/nested_extension.proto +46 -0
  122. data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/nested_extension_lite.proto +48 -0
  123. data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/non_nested_extension.proto +49 -0
  124. data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/non_nested_extension_lite.proto +50 -0
  125. data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/outer_class_name_test.proto +38 -0
  126. data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/outer_class_name_test2.proto +42 -0
  127. data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/outer_class_name_test3.proto +43 -0
  128. data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/test_bad_identifiers.proto +157 -0
  129. data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/test_check_utf8.proto +50 -0
  130. data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/test_check_utf8_size.proto +51 -0
  131. data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/test_custom_options.proto +43 -0
  132. data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/test_extra_interfaces.proto +60 -0
  133. data/ext/protoc/protobuf/m4/ac_system_extensions.m4 +37 -0
  134. data/ext/protoc/protobuf/m4/acx_check_suncc.m4 +75 -0
  135. data/ext/protoc/protobuf/m4/acx_pthread.m4 +397 -0
  136. data/ext/protoc/protobuf/m4/stl_hash.m4 +72 -0
  137. data/ext/protoc/protobuf/more_tests/Makefile +41 -0
  138. data/ext/protoc/protobuf/post_process_dist.sh +60 -0
  139. data/ext/protoc/protobuf/protobuf-lite.pc.in +13 -0
  140. data/ext/protoc/protobuf/protobuf.pc.in +14 -0
  141. data/ext/protoc/protobuf/python/README.txt +105 -0
  142. data/ext/protoc/protobuf/python/ez_setup.py +284 -0
  143. data/ext/protoc/protobuf/python/google/__init__.py +1 -0
  144. data/ext/protoc/protobuf/python/google/protobuf/__init__.py +0 -0
  145. data/ext/protoc/protobuf/python/google/protobuf/descriptor.py +849 -0
  146. data/ext/protoc/protobuf/python/google/protobuf/descriptor_database.py +137 -0
  147. data/ext/protoc/protobuf/python/google/protobuf/descriptor_pool.py +643 -0
  148. data/ext/protoc/protobuf/python/google/protobuf/internal/__init__.py +0 -0
  149. data/ext/protoc/protobuf/python/google/protobuf/internal/api_implementation.cc +139 -0
  150. data/ext/protoc/protobuf/python/google/protobuf/internal/api_implementation.py +89 -0
  151. data/ext/protoc/protobuf/python/google/protobuf/internal/api_implementation_default_test.py +63 -0
  152. data/ext/protoc/protobuf/python/google/protobuf/internal/containers.py +269 -0
  153. data/ext/protoc/protobuf/python/google/protobuf/internal/cpp_message.py +663 -0
  154. data/ext/protoc/protobuf/python/google/protobuf/internal/decoder.py +831 -0
  155. data/ext/protoc/protobuf/python/google/protobuf/internal/descriptor_database_test.py +63 -0
  156. data/ext/protoc/protobuf/python/google/protobuf/internal/descriptor_pool_test.py +564 -0
  157. data/ext/protoc/protobuf/python/google/protobuf/internal/descriptor_pool_test1.proto +94 -0
  158. data/ext/protoc/protobuf/python/google/protobuf/internal/descriptor_pool_test2.proto +70 -0
  159. data/ext/protoc/protobuf/python/google/protobuf/internal/descriptor_python_test.py +54 -0
  160. data/ext/protoc/protobuf/python/google/protobuf/internal/descriptor_test.py +669 -0
  161. data/ext/protoc/protobuf/python/google/protobuf/internal/encoder.py +788 -0
  162. data/ext/protoc/protobuf/python/google/protobuf/internal/enum_type_wrapper.py +89 -0
  163. data/ext/protoc/protobuf/python/google/protobuf/internal/factory_test1.proto +57 -0
  164. data/ext/protoc/protobuf/python/google/protobuf/internal/factory_test2.proto +92 -0
  165. data/ext/protoc/protobuf/python/google/protobuf/internal/generator_test.py +343 -0
  166. data/ext/protoc/protobuf/python/google/protobuf/internal/message_factory_python_test.py +54 -0
  167. data/ext/protoc/protobuf/python/google/protobuf/internal/message_factory_test.py +131 -0
  168. data/ext/protoc/protobuf/python/google/protobuf/internal/message_listener.py +78 -0
  169. data/ext/protoc/protobuf/python/google/protobuf/internal/message_python_test.py +54 -0
  170. data/ext/protoc/protobuf/python/google/protobuf/internal/message_test.py +681 -0
  171. data/ext/protoc/protobuf/python/google/protobuf/internal/missing_enum_values.proto +50 -0
  172. data/ext/protoc/protobuf/python/google/protobuf/internal/more_extensions.proto +58 -0
  173. data/ext/protoc/protobuf/python/google/protobuf/internal/more_extensions_dynamic.proto +49 -0
  174. data/ext/protoc/protobuf/python/google/protobuf/internal/more_messages.proto +51 -0
  175. data/ext/protoc/protobuf/python/google/protobuf/internal/python_message.py +1251 -0
  176. data/ext/protoc/protobuf/python/google/protobuf/internal/reflection_test.py +2934 -0
  177. data/ext/protoc/protobuf/python/google/protobuf/internal/service_reflection_test.py +136 -0
  178. data/ext/protoc/protobuf/python/google/protobuf/internal/symbol_database_test.py +120 -0
  179. data/ext/protoc/protobuf/python/google/protobuf/internal/test_bad_identifiers.proto +52 -0
  180. data/ext/protoc/protobuf/python/google/protobuf/internal/test_util.py +662 -0
  181. data/ext/protoc/protobuf/python/google/protobuf/internal/text_encoding_test.py +68 -0
  182. data/ext/protoc/protobuf/python/google/protobuf/internal/text_format_test.py +743 -0
  183. data/ext/protoc/protobuf/python/google/protobuf/internal/type_checkers.py +328 -0
  184. data/ext/protoc/protobuf/python/google/protobuf/internal/unknown_fields_test.py +231 -0
  185. data/ext/protoc/protobuf/python/google/protobuf/internal/wire_format.py +268 -0
  186. data/ext/protoc/protobuf/python/google/protobuf/internal/wire_format_test.py +253 -0
  187. data/ext/protoc/protobuf/python/google/protobuf/message.py +284 -0
  188. data/ext/protoc/protobuf/python/google/protobuf/message_factory.py +155 -0
  189. data/ext/protoc/protobuf/python/google/protobuf/pyext/README +6 -0
  190. data/ext/protoc/protobuf/python/google/protobuf/pyext/__init__.py +0 -0
  191. data/ext/protoc/protobuf/python/google/protobuf/pyext/cpp_message.py +61 -0
  192. data/ext/protoc/protobuf/python/google/protobuf/pyext/descriptor.cc +357 -0
  193. data/ext/protoc/protobuf/python/google/protobuf/pyext/descriptor.h +96 -0
  194. data/ext/protoc/protobuf/python/google/protobuf/pyext/descriptor_cpp2_test.py +58 -0
  195. data/ext/protoc/protobuf/python/google/protobuf/pyext/extension_dict.cc +338 -0
  196. data/ext/protoc/protobuf/python/google/protobuf/pyext/extension_dict.h +123 -0
  197. data/ext/protoc/protobuf/python/google/protobuf/pyext/message.cc +2561 -0
  198. data/ext/protoc/protobuf/python/google/protobuf/pyext/message.h +305 -0
  199. data/ext/protoc/protobuf/python/google/protobuf/pyext/message_factory_cpp2_test.py +56 -0
  200. data/ext/protoc/protobuf/python/google/protobuf/pyext/proto2_api_test.proto +38 -0
  201. data/ext/protoc/protobuf/python/google/protobuf/pyext/python.proto +66 -0
  202. data/ext/protoc/protobuf/python/google/protobuf/pyext/python_protobuf.h +57 -0
  203. data/ext/protoc/protobuf/python/google/protobuf/pyext/reflection_cpp2_generated_test.py +94 -0
  204. data/ext/protoc/protobuf/python/google/protobuf/pyext/repeated_composite_container.cc +763 -0
  205. data/ext/protoc/protobuf/python/google/protobuf/pyext/repeated_composite_container.h +172 -0
  206. data/ext/protoc/protobuf/python/google/protobuf/pyext/repeated_scalar_container.cc +825 -0
  207. data/ext/protoc/protobuf/python/google/protobuf/pyext/repeated_scalar_container.h +112 -0
  208. data/ext/protoc/protobuf/python/google/protobuf/pyext/scoped_pyobject_ptr.h +95 -0
  209. data/ext/protoc/protobuf/python/google/protobuf/reflection.py +205 -0
  210. data/ext/protoc/protobuf/python/google/protobuf/service.py +226 -0
  211. data/ext/protoc/protobuf/python/google/protobuf/service_reflection.py +284 -0
  212. data/ext/protoc/protobuf/python/google/protobuf/symbol_database.py +185 -0
  213. data/ext/protoc/protobuf/python/google/protobuf/text_encoding.py +110 -0
  214. data/ext/protoc/protobuf/python/google/protobuf/text_format.py +873 -0
  215. data/ext/protoc/protobuf/python/mox.py +1401 -0
  216. data/ext/protoc/protobuf/python/setup.py +201 -0
  217. data/ext/protoc/protobuf/python/stubout.py +140 -0
  218. data/ext/protoc/protobuf/src/Makefile.am +418 -0
  219. data/ext/protoc/protobuf/src/google/protobuf/SEBS +240 -0
  220. data/ext/protoc/protobuf/src/google/protobuf/compiler/code_generator.cc +84 -0
  221. data/ext/protoc/protobuf/src/google/protobuf/compiler/code_generator.h +145 -0
  222. data/ext/protoc/protobuf/src/google/protobuf/compiler/command_line_interface.cc +1603 -0
  223. data/ext/protoc/protobuf/src/google/protobuf/compiler/command_line_interface.h +378 -0
  224. data/ext/protoc/protobuf/src/google/protobuf/compiler/command_line_interface_unittest.cc +1654 -0
  225. data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_bootstrap_unittest.cc +158 -0
  226. data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_enum.cc +288 -0
  227. data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_enum.h +103 -0
  228. data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_enum_field.cc +431 -0
  229. data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_enum_field.h +122 -0
  230. data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_extension.cc +210 -0
  231. data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_extension.h +86 -0
  232. data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_field.cc +166 -0
  233. data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_field.h +185 -0
  234. data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_file.cc +665 -0
  235. data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_file.h +99 -0
  236. data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_generator.cc +125 -0
  237. data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_generator.h +72 -0
  238. data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_helpers.cc +494 -0
  239. data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_helpers.h +206 -0
  240. data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_message.cc +2645 -0
  241. data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_message.h +175 -0
  242. data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_message_field.cc +375 -0
  243. data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_message_field.h +121 -0
  244. data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_options.h +58 -0
  245. data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_plugin_unittest.cc +123 -0
  246. data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_primitive_field.cc +451 -0
  247. data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_primitive_field.h +123 -0
  248. data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_service.cc +334 -0
  249. data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_service.h +118 -0
  250. data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_string_field.cc +642 -0
  251. data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_string_field.h +127 -0
  252. data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_test_bad_identifiers.proto +132 -0
  253. data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_unittest.cc +2074 -0
  254. data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_unittest.h +51 -0
  255. data/ext/protoc/protobuf/src/google/protobuf/compiler/importer.cc +480 -0
  256. data/ext/protoc/protobuf/src/google/protobuf/compiler/importer.h +317 -0
  257. data/ext/protoc/protobuf/src/google/protobuf/compiler/importer_unittest.cc +617 -0
  258. data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_context.cc +195 -0
  259. data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_context.h +95 -0
  260. data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_doc_comment.cc +233 -0
  261. data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_doc_comment.h +69 -0
  262. data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_doc_comment_unittest.cc +67 -0
  263. data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_enum.cc +333 -0
  264. data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_enum.h +99 -0
  265. data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_enum_field.cc +778 -0
  266. data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_enum_field.h +158 -0
  267. data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_extension.cc +207 -0
  268. data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_extension.h +109 -0
  269. data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_field.cc +213 -0
  270. data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_field.h +162 -0
  271. data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_file.cc +534 -0
  272. data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_file.h +115 -0
  273. data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_generator.cc +158 -0
  274. data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_generator.h +72 -0
  275. data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_generator_factory.cc +77 -0
  276. data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_generator_factory.h +101 -0
  277. data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_helpers.cc +737 -0
  278. data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_helpers.h +322 -0
  279. data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_lazy_message_field.cc +826 -0
  280. data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_lazy_message_field.h +121 -0
  281. data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_message.cc +1666 -0
  282. data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_message.h +140 -0
  283. data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_message_field.cc +1343 -0
  284. data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_message_field.h +173 -0
  285. data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_name_resolver.cc +266 -0
  286. data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_name_resolver.h +124 -0
  287. data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_plugin_unittest.cc +124 -0
  288. data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_primitive_field.cc +877 -0
  289. data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_primitive_field.h +160 -0
  290. data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_service.cc +473 -0
  291. data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_service.h +135 -0
  292. data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_shared_code_generator.cc +201 -0
  293. data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_shared_code_generator.h +90 -0
  294. data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_string_field.cc +1056 -0
  295. data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_string_field.h +160 -0
  296. data/ext/protoc/protobuf/src/google/protobuf/compiler/main.cc +61 -0
  297. data/ext/protoc/protobuf/src/google/protobuf/compiler/mock_code_generator.cc +240 -0
  298. data/ext/protoc/protobuf/src/google/protobuf/compiler/mock_code_generator.h +117 -0
  299. data/ext/protoc/protobuf/src/google/protobuf/compiler/package_info.h +64 -0
  300. data/ext/protoc/protobuf/src/google/protobuf/compiler/parser.cc +1750 -0
  301. data/ext/protoc/protobuf/src/google/protobuf/compiler/parser.h +522 -0
  302. data/ext/protoc/protobuf/src/google/protobuf/compiler/parser_unittest.cc +2612 -0
  303. data/ext/protoc/protobuf/src/google/protobuf/compiler/plugin.cc +163 -0
  304. data/ext/protoc/protobuf/src/google/protobuf/compiler/plugin.h +72 -0
  305. data/ext/protoc/protobuf/src/google/protobuf/compiler/plugin.pb.cc +1148 -0
  306. data/ext/protoc/protobuf/src/google/protobuf/compiler/plugin.pb.h +897 -0
  307. data/ext/protoc/protobuf/src/google/protobuf/compiler/plugin.proto +147 -0
  308. data/ext/protoc/protobuf/src/google/protobuf/compiler/python/python_generator.cc +1262 -0
  309. data/ext/protoc/protobuf/src/google/protobuf/compiler/python/python_generator.h +166 -0
  310. data/ext/protoc/protobuf/src/google/protobuf/compiler/python/python_plugin_unittest.cc +118 -0
  311. data/ext/protoc/protobuf/src/google/protobuf/compiler/subprocess.cc +463 -0
  312. data/ext/protoc/protobuf/src/google/protobuf/compiler/subprocess.h +108 -0
  313. data/ext/protoc/protobuf/src/google/protobuf/compiler/test_plugin.cc +51 -0
  314. data/ext/protoc/protobuf/src/google/protobuf/compiler/zip_output_unittest.sh +91 -0
  315. data/ext/protoc/protobuf/src/google/protobuf/compiler/zip_writer.cc +218 -0
  316. data/ext/protoc/protobuf/src/google/protobuf/compiler/zip_writer.h +93 -0
  317. data/ext/protoc/protobuf/src/google/protobuf/descriptor.cc +5420 -0
  318. data/ext/protoc/protobuf/src/google/protobuf/descriptor.h +1691 -0
  319. data/ext/protoc/protobuf/src/google/protobuf/descriptor.pb.cc +9135 -0
  320. data/ext/protoc/protobuf/src/google/protobuf/descriptor.pb.h +6761 -0
  321. data/ext/protoc/protobuf/src/google/protobuf/descriptor.proto +687 -0
  322. data/ext/protoc/protobuf/src/google/protobuf/descriptor_database.cc +543 -0
  323. data/ext/protoc/protobuf/src/google/protobuf/descriptor_database.h +369 -0
  324. data/ext/protoc/protobuf/src/google/protobuf/descriptor_database_unittest.cc +748 -0
  325. data/ext/protoc/protobuf/src/google/protobuf/descriptor_pb2_test.py +54 -0
  326. data/ext/protoc/protobuf/src/google/protobuf/descriptor_unittest.cc +5501 -0
  327. data/ext/protoc/protobuf/src/google/protobuf/dynamic_message.cc +764 -0
  328. data/ext/protoc/protobuf/src/google/protobuf/dynamic_message.h +148 -0
  329. data/ext/protoc/protobuf/src/google/protobuf/dynamic_message_unittest.cc +230 -0
  330. data/ext/protoc/protobuf/src/google/protobuf/extension_set.cc +1663 -0
  331. data/ext/protoc/protobuf/src/google/protobuf/extension_set.h +1234 -0
  332. data/ext/protoc/protobuf/src/google/protobuf/extension_set_heavy.cc +734 -0
  333. data/ext/protoc/protobuf/src/google/protobuf/extension_set_unittest.cc +1095 -0
  334. data/ext/protoc/protobuf/src/google/protobuf/generated_enum_reflection.h +91 -0
  335. data/ext/protoc/protobuf/src/google/protobuf/generated_message_reflection.cc +1683 -0
  336. data/ext/protoc/protobuf/src/google/protobuf/generated_message_reflection.h +504 -0
  337. data/ext/protoc/protobuf/src/google/protobuf/generated_message_reflection_unittest.cc +795 -0
  338. data/ext/protoc/protobuf/src/google/protobuf/generated_message_util.cc +65 -0
  339. data/ext/protoc/protobuf/src/google/protobuf/generated_message_util.h +113 -0
  340. data/ext/protoc/protobuf/src/google/protobuf/io/coded_stream.cc +914 -0
  341. data/ext/protoc/protobuf/src/google/protobuf/io/coded_stream.h +1220 -0
  342. data/ext/protoc/protobuf/src/google/protobuf/io/coded_stream_inl.h +69 -0
  343. data/ext/protoc/protobuf/src/google/protobuf/io/coded_stream_unittest.cc +1378 -0
  344. data/ext/protoc/protobuf/src/google/protobuf/io/gzip_stream.cc +326 -0
  345. data/ext/protoc/protobuf/src/google/protobuf/io/gzip_stream.h +209 -0
  346. data/ext/protoc/protobuf/src/google/protobuf/io/gzip_stream_unittest.sh +44 -0
  347. data/ext/protoc/protobuf/src/google/protobuf/io/package_info.h +54 -0
  348. data/ext/protoc/protobuf/src/google/protobuf/io/printer.cc +198 -0
  349. data/ext/protoc/protobuf/src/google/protobuf/io/printer.h +136 -0
  350. data/ext/protoc/protobuf/src/google/protobuf/io/printer_unittest.cc +285 -0
  351. data/ext/protoc/protobuf/src/google/protobuf/io/strtod.cc +113 -0
  352. data/ext/protoc/protobuf/src/google/protobuf/io/strtod.h +50 -0
  353. data/ext/protoc/protobuf/src/google/protobuf/io/tokenizer.cc +1127 -0
  354. data/ext/protoc/protobuf/src/google/protobuf/io/tokenizer.h +402 -0
  355. data/ext/protoc/protobuf/src/google/protobuf/io/tokenizer_unittest.cc +999 -0
  356. data/ext/protoc/protobuf/src/google/protobuf/io/zero_copy_stream.cc +57 -0
  357. data/ext/protoc/protobuf/src/google/protobuf/io/zero_copy_stream.h +248 -0
  358. data/ext/protoc/protobuf/src/google/protobuf/io/zero_copy_stream_impl.cc +473 -0
  359. data/ext/protoc/protobuf/src/google/protobuf/io/zero_copy_stream_impl.h +358 -0
  360. data/ext/protoc/protobuf/src/google/protobuf/io/zero_copy_stream_impl_lite.cc +405 -0
  361. data/ext/protoc/protobuf/src/google/protobuf/io/zero_copy_stream_impl_lite.h +354 -0
  362. data/ext/protoc/protobuf/src/google/protobuf/io/zero_copy_stream_unittest.cc +965 -0
  363. data/ext/protoc/protobuf/src/google/protobuf/lite_unittest.cc +350 -0
  364. data/ext/protoc/protobuf/src/google/protobuf/message.cc +358 -0
  365. data/ext/protoc/protobuf/src/google/protobuf/message.h +866 -0
  366. data/ext/protoc/protobuf/src/google/protobuf/message_lite.cc +335 -0
  367. data/ext/protoc/protobuf/src/google/protobuf/message_lite.h +247 -0
  368. data/ext/protoc/protobuf/src/google/protobuf/message_unittest.cc +427 -0
  369. data/ext/protoc/protobuf/src/google/protobuf/package_info.h +64 -0
  370. data/ext/protoc/protobuf/src/google/protobuf/reflection_ops.cc +269 -0
  371. data/ext/protoc/protobuf/src/google/protobuf/reflection_ops.h +81 -0
  372. data/ext/protoc/protobuf/src/google/protobuf/reflection_ops_unittest.cc +475 -0
  373. data/ext/protoc/protobuf/src/google/protobuf/repeated_field.cc +87 -0
  374. data/ext/protoc/protobuf/src/google/protobuf/repeated_field.h +1603 -0
  375. data/ext/protoc/protobuf/src/google/protobuf/repeated_field_reflection_unittest.cc +195 -0
  376. data/ext/protoc/protobuf/src/google/protobuf/repeated_field_unittest.cc +1442 -0
  377. data/ext/protoc/protobuf/src/google/protobuf/service.cc +46 -0
  378. data/ext/protoc/protobuf/src/google/protobuf/service.h +291 -0
  379. data/ext/protoc/protobuf/src/google/protobuf/stubs/atomicops.h +227 -0
  380. data/ext/protoc/protobuf/src/google/protobuf/stubs/atomicops_internals_arm64_gcc.h +325 -0
  381. data/ext/protoc/protobuf/src/google/protobuf/stubs/atomicops_internals_arm_gcc.h +151 -0
  382. data/ext/protoc/protobuf/src/google/protobuf/stubs/atomicops_internals_arm_qnx.h +146 -0
  383. data/ext/protoc/protobuf/src/google/protobuf/stubs/atomicops_internals_atomicword_compat.h +122 -0
  384. data/ext/protoc/protobuf/src/google/protobuf/stubs/atomicops_internals_generic_gcc.h +137 -0
  385. data/ext/protoc/protobuf/src/google/protobuf/stubs/atomicops_internals_macosx.h +225 -0
  386. data/ext/protoc/protobuf/src/google/protobuf/stubs/atomicops_internals_mips_gcc.h +313 -0
  387. data/ext/protoc/protobuf/src/google/protobuf/stubs/atomicops_internals_pnacl.h +73 -0
  388. data/ext/protoc/protobuf/src/google/protobuf/stubs/atomicops_internals_solaris.h +188 -0
  389. data/ext/protoc/protobuf/src/google/protobuf/stubs/atomicops_internals_tsan.h +219 -0
  390. data/ext/protoc/protobuf/src/google/protobuf/stubs/atomicops_internals_x86_gcc.cc +137 -0
  391. data/ext/protoc/protobuf/src/google/protobuf/stubs/atomicops_internals_x86_gcc.h +293 -0
  392. data/ext/protoc/protobuf/src/google/protobuf/stubs/atomicops_internals_x86_msvc.cc +112 -0
  393. data/ext/protoc/protobuf/src/google/protobuf/stubs/atomicops_internals_x86_msvc.h +150 -0
  394. data/ext/protoc/protobuf/src/google/protobuf/stubs/common.cc +395 -0
  395. data/ext/protoc/protobuf/src/google/protobuf/stubs/common.h +1226 -0
  396. data/ext/protoc/protobuf/src/google/protobuf/stubs/common_unittest.cc +357 -0
  397. data/ext/protoc/protobuf/src/google/protobuf/stubs/hash.h +232 -0
  398. data/ext/protoc/protobuf/src/google/protobuf/stubs/map_util.h +771 -0
  399. data/ext/protoc/protobuf/src/google/protobuf/stubs/once.cc +99 -0
  400. data/ext/protoc/protobuf/src/google/protobuf/stubs/once.h +166 -0
  401. data/ext/protoc/protobuf/src/google/protobuf/stubs/once_unittest.cc +253 -0
  402. data/ext/protoc/protobuf/src/google/protobuf/stubs/platform_macros.h +103 -0
  403. data/ext/protoc/protobuf/src/google/protobuf/stubs/shared_ptr.h +470 -0
  404. data/ext/protoc/protobuf/src/google/protobuf/stubs/stl_util.h +121 -0
  405. data/ext/protoc/protobuf/src/google/protobuf/stubs/stringprintf.cc +175 -0
  406. data/ext/protoc/protobuf/src/google/protobuf/stubs/stringprintf.h +76 -0
  407. data/ext/protoc/protobuf/src/google/protobuf/stubs/stringprintf_unittest.cc +152 -0
  408. data/ext/protoc/protobuf/src/google/protobuf/stubs/structurally_valid.cc +536 -0
  409. data/ext/protoc/protobuf/src/google/protobuf/stubs/structurally_valid_unittest.cc +40 -0
  410. data/ext/protoc/protobuf/src/google/protobuf/stubs/strutil.cc +1279 -0
  411. data/ext/protoc/protobuf/src/google/protobuf/stubs/strutil.h +562 -0
  412. data/ext/protoc/protobuf/src/google/protobuf/stubs/strutil_unittest.cc +73 -0
  413. data/ext/protoc/protobuf/src/google/protobuf/stubs/substitute.cc +134 -0
  414. data/ext/protoc/protobuf/src/google/protobuf/stubs/substitute.h +170 -0
  415. data/ext/protoc/protobuf/src/google/protobuf/stubs/template_util.h +138 -0
  416. data/ext/protoc/protobuf/src/google/protobuf/stubs/template_util_unittest.cc +130 -0
  417. data/ext/protoc/protobuf/src/google/protobuf/stubs/type_traits.h +336 -0
  418. data/ext/protoc/protobuf/src/google/protobuf/stubs/type_traits_unittest.cc +628 -0
  419. data/ext/protoc/protobuf/src/google/protobuf/test_util.cc +3345 -0
  420. data/ext/protoc/protobuf/src/google/protobuf/test_util.h +215 -0
  421. data/ext/protoc/protobuf/src/google/protobuf/test_util_lite.cc +1585 -0
  422. data/ext/protoc/protobuf/src/google/protobuf/test_util_lite.h +101 -0
  423. data/ext/protoc/protobuf/src/google/protobuf/testdata/bad_utf8_string +1 -0
  424. data/ext/protoc/protobuf/src/google/protobuf/testdata/golden_message +0 -0
  425. data/ext/protoc/protobuf/src/google/protobuf/testdata/golden_message_oneof_implemented +0 -0
  426. data/ext/protoc/protobuf/src/google/protobuf/testdata/golden_packed_fields_message +0 -0
  427. data/ext/protoc/protobuf/src/google/protobuf/testdata/text_format_unittest_data.txt +134 -0
  428. data/ext/protoc/protobuf/src/google/protobuf/testdata/text_format_unittest_data_oneof_implemented.txt +129 -0
  429. data/ext/protoc/protobuf/src/google/protobuf/testdata/text_format_unittest_data_pointy.txt +134 -0
  430. data/ext/protoc/protobuf/src/google/protobuf/testdata/text_format_unittest_data_pointy_oneof.txt +129 -0
  431. data/ext/protoc/protobuf/src/google/protobuf/testdata/text_format_unittest_extensions_data.txt +134 -0
  432. data/ext/protoc/protobuf/src/google/protobuf/testdata/text_format_unittest_extensions_data_pointy.txt +134 -0
  433. data/ext/protoc/protobuf/src/google/protobuf/testing/file.cc +194 -0
  434. data/ext/protoc/protobuf/src/google/protobuf/testing/file.h +97 -0
  435. data/ext/protoc/protobuf/src/google/protobuf/testing/googletest.cc +255 -0
  436. data/ext/protoc/protobuf/src/google/protobuf/testing/googletest.h +102 -0
  437. data/ext/protoc/protobuf/src/google/protobuf/testing/zcgunzip.cc +73 -0
  438. data/ext/protoc/protobuf/src/google/protobuf/testing/zcgzip.cc +79 -0
  439. data/ext/protoc/protobuf/src/google/protobuf/text_format.cc +1746 -0
  440. data/ext/protoc/protobuf/src/google/protobuf/text_format.h +473 -0
  441. data/ext/protoc/protobuf/src/google/protobuf/text_format_unittest.cc +1479 -0
  442. data/ext/protoc/protobuf/src/google/protobuf/unittest.proto +861 -0
  443. data/ext/protoc/protobuf/src/google/protobuf/unittest_custom_options.proto +393 -0
  444. data/ext/protoc/protobuf/src/google/protobuf/unittest_embed_optimize_for.proto +50 -0
  445. data/ext/protoc/protobuf/src/google/protobuf/unittest_empty.proto +37 -0
  446. data/ext/protoc/protobuf/src/google/protobuf/unittest_enormous_descriptor.proto +1046 -0
  447. data/ext/protoc/protobuf/src/google/protobuf/unittest_import.proto +64 -0
  448. data/ext/protoc/protobuf/src/google/protobuf/unittest_import_lite.proto +51 -0
  449. data/ext/protoc/protobuf/src/google/protobuf/unittest_import_public.proto +40 -0
  450. data/ext/protoc/protobuf/src/google/protobuf/unittest_import_public_lite.proto +42 -0
  451. data/ext/protoc/protobuf/src/google/protobuf/unittest_lite.proto +384 -0
  452. data/ext/protoc/protobuf/src/google/protobuf/unittest_lite_imports_nonlite.proto +43 -0
  453. data/ext/protoc/protobuf/src/google/protobuf/unittest_mset.proto +83 -0
  454. data/ext/protoc/protobuf/src/google/protobuf/unittest_no_generic_services.proto +53 -0
  455. data/ext/protoc/protobuf/src/google/protobuf/unittest_optimize_for.proto +66 -0
  456. data/ext/protoc/protobuf/src/google/protobuf/unknown_field_set.cc +265 -0
  457. data/ext/protoc/protobuf/src/google/protobuf/unknown_field_set.h +318 -0
  458. data/ext/protoc/protobuf/src/google/protobuf/unknown_field_set_unittest.cc +599 -0
  459. data/ext/protoc/protobuf/src/google/protobuf/wire_format.cc +1101 -0
  460. data/ext/protoc/protobuf/src/google/protobuf/wire_format.h +336 -0
  461. data/ext/protoc/protobuf/src/google/protobuf/wire_format_lite.cc +471 -0
  462. data/ext/protoc/protobuf/src/google/protobuf/wire_format_lite.h +661 -0
  463. data/ext/protoc/protobuf/src/google/protobuf/wire_format_lite_inl.h +860 -0
  464. data/ext/protoc/protobuf/src/google/protobuf/wire_format_unittest.cc +1120 -0
  465. data/ext/protoc/protobuf/src/solaris/libstdc++.la +51 -0
  466. data/ext/protoc/protobuf/vsprojects/config.h +29 -0
  467. data/ext/protoc/protobuf/vsprojects/convert2008to2005.sh +20 -0
  468. data/ext/protoc/protobuf/vsprojects/extract_includes.bat +50 -0
  469. data/ext/protoc/protobuf/vsprojects/libprotobuf-lite.vcproj +302 -0
  470. data/ext/protoc/protobuf/vsprojects/libprotobuf.vcproj +470 -0
  471. data/ext/protoc/protobuf/vsprojects/libprotoc.vcproj +466 -0
  472. data/ext/protoc/protobuf/vsprojects/lite-test.vcproj +305 -0
  473. data/ext/protoc/protobuf/vsprojects/protobuf.sln +92 -0
  474. data/ext/protoc/protobuf/vsprojects/protoc.vcproj +192 -0
  475. data/ext/protoc/protobuf/vsprojects/readme.txt +114 -0
  476. data/ext/protoc/protobuf/vsprojects/test_plugin.vcproj +209 -0
  477. data/ext/protoc/protobuf/vsprojects/tests.vcproj +681 -0
  478. data/lib/protoc/version.rb +1 -1
  479. metadata +480 -3
@@ -0,0 +1,2934 @@
1
+ #! /usr/bin/python
2
+ # -*- coding: utf-8 -*-
3
+ #
4
+ # Protocol Buffers - Google's data interchange format
5
+ # Copyright 2008 Google Inc. All rights reserved.
6
+ # https://developers.google.com/protocol-buffers/
7
+ #
8
+ # Redistribution and use in source and binary forms, with or without
9
+ # modification, are permitted provided that the following conditions are
10
+ # met:
11
+ #
12
+ # * Redistributions of source code must retain the above copyright
13
+ # notice, this list of conditions and the following disclaimer.
14
+ # * Redistributions in binary form must reproduce the above
15
+ # copyright notice, this list of conditions and the following disclaimer
16
+ # in the documentation and/or other materials provided with the
17
+ # distribution.
18
+ # * Neither the name of Google Inc. nor the names of its
19
+ # contributors may be used to endorse or promote products derived from
20
+ # this software without specific prior written permission.
21
+ #
22
+ # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
23
+ # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
24
+ # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
25
+ # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
26
+ # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
27
+ # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
28
+ # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
29
+ # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
30
+ # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
31
+ # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
32
+ # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
33
+
34
+ """Unittest for reflection.py, which also indirectly tests the output of the
35
+ pure-Python protocol compiler.
36
+ """
37
+
38
+ __author__ = 'robinson@google.com (Will Robinson)'
39
+
40
+ import copy
41
+ import gc
42
+ import operator
43
+ import struct
44
+
45
+ from google.apputils import basetest
46
+ from google.protobuf import unittest_import_pb2
47
+ from google.protobuf import unittest_mset_pb2
48
+ from google.protobuf import unittest_pb2
49
+ from google.protobuf import descriptor_pb2
50
+ from google.protobuf import descriptor
51
+ from google.protobuf import message
52
+ from google.protobuf import reflection
53
+ from google.protobuf import text_format
54
+ from google.protobuf.internal import api_implementation
55
+ from google.protobuf.internal import more_extensions_pb2
56
+ from google.protobuf.internal import more_messages_pb2
57
+ from google.protobuf.internal import wire_format
58
+ from google.protobuf.internal import test_util
59
+ from google.protobuf.internal import decoder
60
+
61
+
62
+ class _MiniDecoder(object):
63
+ """Decodes a stream of values from a string.
64
+
65
+ Once upon a time we actually had a class called decoder.Decoder. Then we
66
+ got rid of it during a redesign that made decoding much, much faster overall.
67
+ But a couple tests in this file used it to check that the serialized form of
68
+ a message was correct. So, this class implements just the methods that were
69
+ used by said tests, so that we don't have to rewrite the tests.
70
+ """
71
+
72
+ def __init__(self, bytes):
73
+ self._bytes = bytes
74
+ self._pos = 0
75
+
76
+ def ReadVarint(self):
77
+ result, self._pos = decoder._DecodeVarint(self._bytes, self._pos)
78
+ return result
79
+
80
+ ReadInt32 = ReadVarint
81
+ ReadInt64 = ReadVarint
82
+ ReadUInt32 = ReadVarint
83
+ ReadUInt64 = ReadVarint
84
+
85
+ def ReadSInt64(self):
86
+ return wire_format.ZigZagDecode(self.ReadVarint())
87
+
88
+ ReadSInt32 = ReadSInt64
89
+
90
+ def ReadFieldNumberAndWireType(self):
91
+ return wire_format.UnpackTag(self.ReadVarint())
92
+
93
+ def ReadFloat(self):
94
+ result = struct.unpack("<f", self._bytes[self._pos:self._pos+4])[0]
95
+ self._pos += 4
96
+ return result
97
+
98
+ def ReadDouble(self):
99
+ result = struct.unpack("<d", self._bytes[self._pos:self._pos+8])[0]
100
+ self._pos += 8
101
+ return result
102
+
103
+ def EndOfStream(self):
104
+ return self._pos == len(self._bytes)
105
+
106
+
107
+ class ReflectionTest(basetest.TestCase):
108
+
109
+ def assertListsEqual(self, values, others):
110
+ self.assertEqual(len(values), len(others))
111
+ for i in range(len(values)):
112
+ self.assertEqual(values[i], others[i])
113
+
114
+ def testScalarConstructor(self):
115
+ # Constructor with only scalar types should succeed.
116
+ proto = unittest_pb2.TestAllTypes(
117
+ optional_int32=24,
118
+ optional_double=54.321,
119
+ optional_string='optional_string')
120
+
121
+ self.assertEqual(24, proto.optional_int32)
122
+ self.assertEqual(54.321, proto.optional_double)
123
+ self.assertEqual('optional_string', proto.optional_string)
124
+
125
+ def testRepeatedScalarConstructor(self):
126
+ # Constructor with only repeated scalar types should succeed.
127
+ proto = unittest_pb2.TestAllTypes(
128
+ repeated_int32=[1, 2, 3, 4],
129
+ repeated_double=[1.23, 54.321],
130
+ repeated_bool=[True, False, False],
131
+ repeated_string=["optional_string"])
132
+
133
+ self.assertEquals([1, 2, 3, 4], list(proto.repeated_int32))
134
+ self.assertEquals([1.23, 54.321], list(proto.repeated_double))
135
+ self.assertEquals([True, False, False], list(proto.repeated_bool))
136
+ self.assertEquals(["optional_string"], list(proto.repeated_string))
137
+
138
+ def testRepeatedCompositeConstructor(self):
139
+ # Constructor with only repeated composite types should succeed.
140
+ proto = unittest_pb2.TestAllTypes(
141
+ repeated_nested_message=[
142
+ unittest_pb2.TestAllTypes.NestedMessage(
143
+ bb=unittest_pb2.TestAllTypes.FOO),
144
+ unittest_pb2.TestAllTypes.NestedMessage(
145
+ bb=unittest_pb2.TestAllTypes.BAR)],
146
+ repeated_foreign_message=[
147
+ unittest_pb2.ForeignMessage(c=-43),
148
+ unittest_pb2.ForeignMessage(c=45324),
149
+ unittest_pb2.ForeignMessage(c=12)],
150
+ repeatedgroup=[
151
+ unittest_pb2.TestAllTypes.RepeatedGroup(),
152
+ unittest_pb2.TestAllTypes.RepeatedGroup(a=1),
153
+ unittest_pb2.TestAllTypes.RepeatedGroup(a=2)])
154
+
155
+ self.assertEquals(
156
+ [unittest_pb2.TestAllTypes.NestedMessage(
157
+ bb=unittest_pb2.TestAllTypes.FOO),
158
+ unittest_pb2.TestAllTypes.NestedMessage(
159
+ bb=unittest_pb2.TestAllTypes.BAR)],
160
+ list(proto.repeated_nested_message))
161
+ self.assertEquals(
162
+ [unittest_pb2.ForeignMessage(c=-43),
163
+ unittest_pb2.ForeignMessage(c=45324),
164
+ unittest_pb2.ForeignMessage(c=12)],
165
+ list(proto.repeated_foreign_message))
166
+ self.assertEquals(
167
+ [unittest_pb2.TestAllTypes.RepeatedGroup(),
168
+ unittest_pb2.TestAllTypes.RepeatedGroup(a=1),
169
+ unittest_pb2.TestAllTypes.RepeatedGroup(a=2)],
170
+ list(proto.repeatedgroup))
171
+
172
+ def testMixedConstructor(self):
173
+ # Constructor with only mixed types should succeed.
174
+ proto = unittest_pb2.TestAllTypes(
175
+ optional_int32=24,
176
+ optional_string='optional_string',
177
+ repeated_double=[1.23, 54.321],
178
+ repeated_bool=[True, False, False],
179
+ repeated_nested_message=[
180
+ unittest_pb2.TestAllTypes.NestedMessage(
181
+ bb=unittest_pb2.TestAllTypes.FOO),
182
+ unittest_pb2.TestAllTypes.NestedMessage(
183
+ bb=unittest_pb2.TestAllTypes.BAR)],
184
+ repeated_foreign_message=[
185
+ unittest_pb2.ForeignMessage(c=-43),
186
+ unittest_pb2.ForeignMessage(c=45324),
187
+ unittest_pb2.ForeignMessage(c=12)])
188
+
189
+ self.assertEqual(24, proto.optional_int32)
190
+ self.assertEqual('optional_string', proto.optional_string)
191
+ self.assertEquals([1.23, 54.321], list(proto.repeated_double))
192
+ self.assertEquals([True, False, False], list(proto.repeated_bool))
193
+ self.assertEquals(
194
+ [unittest_pb2.TestAllTypes.NestedMessage(
195
+ bb=unittest_pb2.TestAllTypes.FOO),
196
+ unittest_pb2.TestAllTypes.NestedMessage(
197
+ bb=unittest_pb2.TestAllTypes.BAR)],
198
+ list(proto.repeated_nested_message))
199
+ self.assertEquals(
200
+ [unittest_pb2.ForeignMessage(c=-43),
201
+ unittest_pb2.ForeignMessage(c=45324),
202
+ unittest_pb2.ForeignMessage(c=12)],
203
+ list(proto.repeated_foreign_message))
204
+
205
+ def testConstructorTypeError(self):
206
+ self.assertRaises(
207
+ TypeError, unittest_pb2.TestAllTypes, optional_int32="foo")
208
+ self.assertRaises(
209
+ TypeError, unittest_pb2.TestAllTypes, optional_string=1234)
210
+ self.assertRaises(
211
+ TypeError, unittest_pb2.TestAllTypes, optional_nested_message=1234)
212
+ self.assertRaises(
213
+ TypeError, unittest_pb2.TestAllTypes, repeated_int32=1234)
214
+ self.assertRaises(
215
+ TypeError, unittest_pb2.TestAllTypes, repeated_int32=["foo"])
216
+ self.assertRaises(
217
+ TypeError, unittest_pb2.TestAllTypes, repeated_string=1234)
218
+ self.assertRaises(
219
+ TypeError, unittest_pb2.TestAllTypes, repeated_string=[1234])
220
+ self.assertRaises(
221
+ TypeError, unittest_pb2.TestAllTypes, repeated_nested_message=1234)
222
+ self.assertRaises(
223
+ TypeError, unittest_pb2.TestAllTypes, repeated_nested_message=[1234])
224
+
225
+ def testConstructorInvalidatesCachedByteSize(self):
226
+ message = unittest_pb2.TestAllTypes(optional_int32 = 12)
227
+ self.assertEquals(2, message.ByteSize())
228
+
229
+ message = unittest_pb2.TestAllTypes(
230
+ optional_nested_message = unittest_pb2.TestAllTypes.NestedMessage())
231
+ self.assertEquals(3, message.ByteSize())
232
+
233
+ message = unittest_pb2.TestAllTypes(repeated_int32 = [12])
234
+ self.assertEquals(3, message.ByteSize())
235
+
236
+ message = unittest_pb2.TestAllTypes(
237
+ repeated_nested_message = [unittest_pb2.TestAllTypes.NestedMessage()])
238
+ self.assertEquals(3, message.ByteSize())
239
+
240
+ def testSimpleHasBits(self):
241
+ # Test a scalar.
242
+ proto = unittest_pb2.TestAllTypes()
243
+ self.assertTrue(not proto.HasField('optional_int32'))
244
+ self.assertEqual(0, proto.optional_int32)
245
+ # HasField() shouldn't be true if all we've done is
246
+ # read the default value.
247
+ self.assertTrue(not proto.HasField('optional_int32'))
248
+ proto.optional_int32 = 1
249
+ # Setting a value however *should* set the "has" bit.
250
+ self.assertTrue(proto.HasField('optional_int32'))
251
+ proto.ClearField('optional_int32')
252
+ # And clearing that value should unset the "has" bit.
253
+ self.assertTrue(not proto.HasField('optional_int32'))
254
+
255
+ def testHasBitsWithSinglyNestedScalar(self):
256
+ # Helper used to test foreign messages and groups.
257
+ #
258
+ # composite_field_name should be the name of a non-repeated
259
+ # composite (i.e., foreign or group) field in TestAllTypes,
260
+ # and scalar_field_name should be the name of an integer-valued
261
+ # scalar field within that composite.
262
+ #
263
+ # I never thought I'd miss C++ macros and templates so much. :(
264
+ # This helper is semantically just:
265
+ #
266
+ # assert proto.composite_field.scalar_field == 0
267
+ # assert not proto.composite_field.HasField('scalar_field')
268
+ # assert not proto.HasField('composite_field')
269
+ #
270
+ # proto.composite_field.scalar_field = 10
271
+ # old_composite_field = proto.composite_field
272
+ #
273
+ # assert proto.composite_field.scalar_field == 10
274
+ # assert proto.composite_field.HasField('scalar_field')
275
+ # assert proto.HasField('composite_field')
276
+ #
277
+ # proto.ClearField('composite_field')
278
+ #
279
+ # assert not proto.composite_field.HasField('scalar_field')
280
+ # assert not proto.HasField('composite_field')
281
+ # assert proto.composite_field.scalar_field == 0
282
+ #
283
+ # # Now ensure that ClearField('composite_field') disconnected
284
+ # # the old field object from the object tree...
285
+ # assert old_composite_field is not proto.composite_field
286
+ # old_composite_field.scalar_field = 20
287
+ # assert not proto.composite_field.HasField('scalar_field')
288
+ # assert not proto.HasField('composite_field')
289
+ def TestCompositeHasBits(composite_field_name, scalar_field_name):
290
+ proto = unittest_pb2.TestAllTypes()
291
+ # First, check that we can get the scalar value, and see that it's the
292
+ # default (0), but that proto.HasField('omposite') and
293
+ # proto.composite.HasField('scalar') will still return False.
294
+ composite_field = getattr(proto, composite_field_name)
295
+ original_scalar_value = getattr(composite_field, scalar_field_name)
296
+ self.assertEqual(0, original_scalar_value)
297
+ # Assert that the composite object does not "have" the scalar.
298
+ self.assertTrue(not composite_field.HasField(scalar_field_name))
299
+ # Assert that proto does not "have" the composite field.
300
+ self.assertTrue(not proto.HasField(composite_field_name))
301
+
302
+ # Now set the scalar within the composite field. Ensure that the setting
303
+ # is reflected, and that proto.HasField('composite') and
304
+ # proto.composite.HasField('scalar') now both return True.
305
+ new_val = 20
306
+ setattr(composite_field, scalar_field_name, new_val)
307
+ self.assertEqual(new_val, getattr(composite_field, scalar_field_name))
308
+ # Hold on to a reference to the current composite_field object.
309
+ old_composite_field = composite_field
310
+ # Assert that the has methods now return true.
311
+ self.assertTrue(composite_field.HasField(scalar_field_name))
312
+ self.assertTrue(proto.HasField(composite_field_name))
313
+
314
+ # Now call the clear method...
315
+ proto.ClearField(composite_field_name)
316
+
317
+ # ...and ensure that the "has" bits are all back to False...
318
+ composite_field = getattr(proto, composite_field_name)
319
+ self.assertTrue(not composite_field.HasField(scalar_field_name))
320
+ self.assertTrue(not proto.HasField(composite_field_name))
321
+ # ...and ensure that the scalar field has returned to its default.
322
+ self.assertEqual(0, getattr(composite_field, scalar_field_name))
323
+
324
+ self.assertTrue(old_composite_field is not composite_field)
325
+ setattr(old_composite_field, scalar_field_name, new_val)
326
+ self.assertTrue(not composite_field.HasField(scalar_field_name))
327
+ self.assertTrue(not proto.HasField(composite_field_name))
328
+ self.assertEqual(0, getattr(composite_field, scalar_field_name))
329
+
330
+ # Test simple, single-level nesting when we set a scalar.
331
+ TestCompositeHasBits('optionalgroup', 'a')
332
+ TestCompositeHasBits('optional_nested_message', 'bb')
333
+ TestCompositeHasBits('optional_foreign_message', 'c')
334
+ TestCompositeHasBits('optional_import_message', 'd')
335
+
336
+ def testReferencesToNestedMessage(self):
337
+ proto = unittest_pb2.TestAllTypes()
338
+ nested = proto.optional_nested_message
339
+ del proto
340
+ # A previous version had a bug where this would raise an exception when
341
+ # hitting a now-dead weak reference.
342
+ nested.bb = 23
343
+
344
+ def testDisconnectingNestedMessageBeforeSettingField(self):
345
+ proto = unittest_pb2.TestAllTypes()
346
+ nested = proto.optional_nested_message
347
+ proto.ClearField('optional_nested_message') # Should disconnect from parent
348
+ self.assertTrue(nested is not proto.optional_nested_message)
349
+ nested.bb = 23
350
+ self.assertTrue(not proto.HasField('optional_nested_message'))
351
+ self.assertEqual(0, proto.optional_nested_message.bb)
352
+
353
+ def testGetDefaultMessageAfterDisconnectingDefaultMessage(self):
354
+ proto = unittest_pb2.TestAllTypes()
355
+ nested = proto.optional_nested_message
356
+ proto.ClearField('optional_nested_message')
357
+ del proto
358
+ del nested
359
+ # Force a garbage collect so that the underlying CMessages are freed along
360
+ # with the Messages they point to. This is to make sure we're not deleting
361
+ # default message instances.
362
+ gc.collect()
363
+ proto = unittest_pb2.TestAllTypes()
364
+ nested = proto.optional_nested_message
365
+
366
+ def testDisconnectingNestedMessageAfterSettingField(self):
367
+ proto = unittest_pb2.TestAllTypes()
368
+ nested = proto.optional_nested_message
369
+ nested.bb = 5
370
+ self.assertTrue(proto.HasField('optional_nested_message'))
371
+ proto.ClearField('optional_nested_message') # Should disconnect from parent
372
+ self.assertEqual(5, nested.bb)
373
+ self.assertEqual(0, proto.optional_nested_message.bb)
374
+ self.assertTrue(nested is not proto.optional_nested_message)
375
+ nested.bb = 23
376
+ self.assertTrue(not proto.HasField('optional_nested_message'))
377
+ self.assertEqual(0, proto.optional_nested_message.bb)
378
+
379
+ def testDisconnectingNestedMessageBeforeGettingField(self):
380
+ proto = unittest_pb2.TestAllTypes()
381
+ self.assertTrue(not proto.HasField('optional_nested_message'))
382
+ proto.ClearField('optional_nested_message')
383
+ self.assertTrue(not proto.HasField('optional_nested_message'))
384
+
385
+ def testDisconnectingNestedMessageAfterMerge(self):
386
+ # This test exercises the code path that does not use ReleaseMessage().
387
+ # The underlying fear is that if we use ReleaseMessage() incorrectly,
388
+ # we will have memory leaks. It's hard to check that that doesn't happen,
389
+ # but at least we can exercise that code path to make sure it works.
390
+ proto1 = unittest_pb2.TestAllTypes()
391
+ proto2 = unittest_pb2.TestAllTypes()
392
+ proto2.optional_nested_message.bb = 5
393
+ proto1.MergeFrom(proto2)
394
+ self.assertTrue(proto1.HasField('optional_nested_message'))
395
+ proto1.ClearField('optional_nested_message')
396
+ self.assertTrue(not proto1.HasField('optional_nested_message'))
397
+
398
+ def testDisconnectingLazyNestedMessage(self):
399
+ # This test exercises releasing a nested message that is lazy. This test
400
+ # only exercises real code in the C++ implementation as Python does not
401
+ # support lazy parsing, but the current C++ implementation results in
402
+ # memory corruption and a crash.
403
+ if api_implementation.Type() != 'python':
404
+ return
405
+ proto = unittest_pb2.TestAllTypes()
406
+ proto.optional_lazy_message.bb = 5
407
+ proto.ClearField('optional_lazy_message')
408
+ del proto
409
+ gc.collect()
410
+
411
+ def testHasBitsWhenModifyingRepeatedFields(self):
412
+ # Test nesting when we add an element to a repeated field in a submessage.
413
+ proto = unittest_pb2.TestNestedMessageHasBits()
414
+ proto.optional_nested_message.nestedmessage_repeated_int32.append(5)
415
+ self.assertEqual(
416
+ [5], proto.optional_nested_message.nestedmessage_repeated_int32)
417
+ self.assertTrue(proto.HasField('optional_nested_message'))
418
+
419
+ # Do the same test, but with a repeated composite field within the
420
+ # submessage.
421
+ proto.ClearField('optional_nested_message')
422
+ self.assertTrue(not proto.HasField('optional_nested_message'))
423
+ proto.optional_nested_message.nestedmessage_repeated_foreignmessage.add()
424
+ self.assertTrue(proto.HasField('optional_nested_message'))
425
+
426
+ def testHasBitsForManyLevelsOfNesting(self):
427
+ # Test nesting many levels deep.
428
+ recursive_proto = unittest_pb2.TestMutualRecursionA()
429
+ self.assertTrue(not recursive_proto.HasField('bb'))
430
+ self.assertEqual(0, recursive_proto.bb.a.bb.a.bb.optional_int32)
431
+ self.assertTrue(not recursive_proto.HasField('bb'))
432
+ recursive_proto.bb.a.bb.a.bb.optional_int32 = 5
433
+ self.assertEqual(5, recursive_proto.bb.a.bb.a.bb.optional_int32)
434
+ self.assertTrue(recursive_proto.HasField('bb'))
435
+ self.assertTrue(recursive_proto.bb.HasField('a'))
436
+ self.assertTrue(recursive_proto.bb.a.HasField('bb'))
437
+ self.assertTrue(recursive_proto.bb.a.bb.HasField('a'))
438
+ self.assertTrue(recursive_proto.bb.a.bb.a.HasField('bb'))
439
+ self.assertTrue(not recursive_proto.bb.a.bb.a.bb.HasField('a'))
440
+ self.assertTrue(recursive_proto.bb.a.bb.a.bb.HasField('optional_int32'))
441
+
442
+ def testSingularListFields(self):
443
+ proto = unittest_pb2.TestAllTypes()
444
+ proto.optional_fixed32 = 1
445
+ proto.optional_int32 = 5
446
+ proto.optional_string = 'foo'
447
+ # Access sub-message but don't set it yet.
448
+ nested_message = proto.optional_nested_message
449
+ self.assertEqual(
450
+ [ (proto.DESCRIPTOR.fields_by_name['optional_int32' ], 5),
451
+ (proto.DESCRIPTOR.fields_by_name['optional_fixed32'], 1),
452
+ (proto.DESCRIPTOR.fields_by_name['optional_string' ], 'foo') ],
453
+ proto.ListFields())
454
+
455
+ proto.optional_nested_message.bb = 123
456
+ self.assertEqual(
457
+ [ (proto.DESCRIPTOR.fields_by_name['optional_int32' ], 5),
458
+ (proto.DESCRIPTOR.fields_by_name['optional_fixed32'], 1),
459
+ (proto.DESCRIPTOR.fields_by_name['optional_string' ], 'foo'),
460
+ (proto.DESCRIPTOR.fields_by_name['optional_nested_message' ],
461
+ nested_message) ],
462
+ proto.ListFields())
463
+
464
+ def testRepeatedListFields(self):
465
+ proto = unittest_pb2.TestAllTypes()
466
+ proto.repeated_fixed32.append(1)
467
+ proto.repeated_int32.append(5)
468
+ proto.repeated_int32.append(11)
469
+ proto.repeated_string.extend(['foo', 'bar'])
470
+ proto.repeated_string.extend([])
471
+ proto.repeated_string.append('baz')
472
+ proto.repeated_string.extend(str(x) for x in xrange(2))
473
+ proto.optional_int32 = 21
474
+ proto.repeated_bool # Access but don't set anything; should not be listed.
475
+ self.assertEqual(
476
+ [ (proto.DESCRIPTOR.fields_by_name['optional_int32' ], 21),
477
+ (proto.DESCRIPTOR.fields_by_name['repeated_int32' ], [5, 11]),
478
+ (proto.DESCRIPTOR.fields_by_name['repeated_fixed32'], [1]),
479
+ (proto.DESCRIPTOR.fields_by_name['repeated_string' ],
480
+ ['foo', 'bar', 'baz', '0', '1']) ],
481
+ proto.ListFields())
482
+
483
+ def testSingularListExtensions(self):
484
+ proto = unittest_pb2.TestAllExtensions()
485
+ proto.Extensions[unittest_pb2.optional_fixed32_extension] = 1
486
+ proto.Extensions[unittest_pb2.optional_int32_extension ] = 5
487
+ proto.Extensions[unittest_pb2.optional_string_extension ] = 'foo'
488
+ self.assertEqual(
489
+ [ (unittest_pb2.optional_int32_extension , 5),
490
+ (unittest_pb2.optional_fixed32_extension, 1),
491
+ (unittest_pb2.optional_string_extension , 'foo') ],
492
+ proto.ListFields())
493
+
494
+ def testRepeatedListExtensions(self):
495
+ proto = unittest_pb2.TestAllExtensions()
496
+ proto.Extensions[unittest_pb2.repeated_fixed32_extension].append(1)
497
+ proto.Extensions[unittest_pb2.repeated_int32_extension ].append(5)
498
+ proto.Extensions[unittest_pb2.repeated_int32_extension ].append(11)
499
+ proto.Extensions[unittest_pb2.repeated_string_extension ].append('foo')
500
+ proto.Extensions[unittest_pb2.repeated_string_extension ].append('bar')
501
+ proto.Extensions[unittest_pb2.repeated_string_extension ].append('baz')
502
+ proto.Extensions[unittest_pb2.optional_int32_extension ] = 21
503
+ self.assertEqual(
504
+ [ (unittest_pb2.optional_int32_extension , 21),
505
+ (unittest_pb2.repeated_int32_extension , [5, 11]),
506
+ (unittest_pb2.repeated_fixed32_extension, [1]),
507
+ (unittest_pb2.repeated_string_extension , ['foo', 'bar', 'baz']) ],
508
+ proto.ListFields())
509
+
510
+ def testListFieldsAndExtensions(self):
511
+ proto = unittest_pb2.TestFieldOrderings()
512
+ test_util.SetAllFieldsAndExtensions(proto)
513
+ unittest_pb2.my_extension_int
514
+ self.assertEqual(
515
+ [ (proto.DESCRIPTOR.fields_by_name['my_int' ], 1),
516
+ (unittest_pb2.my_extension_int , 23),
517
+ (proto.DESCRIPTOR.fields_by_name['my_string'], 'foo'),
518
+ (unittest_pb2.my_extension_string , 'bar'),
519
+ (proto.DESCRIPTOR.fields_by_name['my_float' ], 1.0) ],
520
+ proto.ListFields())
521
+
522
+ def testDefaultValues(self):
523
+ proto = unittest_pb2.TestAllTypes()
524
+ self.assertEqual(0, proto.optional_int32)
525
+ self.assertEqual(0, proto.optional_int64)
526
+ self.assertEqual(0, proto.optional_uint32)
527
+ self.assertEqual(0, proto.optional_uint64)
528
+ self.assertEqual(0, proto.optional_sint32)
529
+ self.assertEqual(0, proto.optional_sint64)
530
+ self.assertEqual(0, proto.optional_fixed32)
531
+ self.assertEqual(0, proto.optional_fixed64)
532
+ self.assertEqual(0, proto.optional_sfixed32)
533
+ self.assertEqual(0, proto.optional_sfixed64)
534
+ self.assertEqual(0.0, proto.optional_float)
535
+ self.assertEqual(0.0, proto.optional_double)
536
+ self.assertEqual(False, proto.optional_bool)
537
+ self.assertEqual('', proto.optional_string)
538
+ self.assertEqual(b'', proto.optional_bytes)
539
+
540
+ self.assertEqual(41, proto.default_int32)
541
+ self.assertEqual(42, proto.default_int64)
542
+ self.assertEqual(43, proto.default_uint32)
543
+ self.assertEqual(44, proto.default_uint64)
544
+ self.assertEqual(-45, proto.default_sint32)
545
+ self.assertEqual(46, proto.default_sint64)
546
+ self.assertEqual(47, proto.default_fixed32)
547
+ self.assertEqual(48, proto.default_fixed64)
548
+ self.assertEqual(49, proto.default_sfixed32)
549
+ self.assertEqual(-50, proto.default_sfixed64)
550
+ self.assertEqual(51.5, proto.default_float)
551
+ self.assertEqual(52e3, proto.default_double)
552
+ self.assertEqual(True, proto.default_bool)
553
+ self.assertEqual('hello', proto.default_string)
554
+ self.assertEqual(b'world', proto.default_bytes)
555
+ self.assertEqual(unittest_pb2.TestAllTypes.BAR, proto.default_nested_enum)
556
+ self.assertEqual(unittest_pb2.FOREIGN_BAR, proto.default_foreign_enum)
557
+ self.assertEqual(unittest_import_pb2.IMPORT_BAR,
558
+ proto.default_import_enum)
559
+
560
+ proto = unittest_pb2.TestExtremeDefaultValues()
561
+ self.assertEqual(u'\u1234', proto.utf8_string)
562
+
563
+ def testHasFieldWithUnknownFieldName(self):
564
+ proto = unittest_pb2.TestAllTypes()
565
+ self.assertRaises(ValueError, proto.HasField, 'nonexistent_field')
566
+
567
+ def testClearFieldWithUnknownFieldName(self):
568
+ proto = unittest_pb2.TestAllTypes()
569
+ self.assertRaises(ValueError, proto.ClearField, 'nonexistent_field')
570
+
571
+ def testClearRemovesChildren(self):
572
+ # Make sure there aren't any implementation bugs that are only partially
573
+ # clearing the message (which can happen in the more complex C++
574
+ # implementation which has parallel message lists).
575
+ proto = unittest_pb2.TestRequiredForeign()
576
+ for i in range(10):
577
+ proto.repeated_message.add()
578
+ proto2 = unittest_pb2.TestRequiredForeign()
579
+ proto.CopyFrom(proto2)
580
+ self.assertRaises(IndexError, lambda: proto.repeated_message[5])
581
+
582
+ def testDisallowedAssignments(self):
583
+ # It's illegal to assign values directly to repeated fields
584
+ # or to nonrepeated composite fields. Ensure that this fails.
585
+ proto = unittest_pb2.TestAllTypes()
586
+ # Repeated fields.
587
+ self.assertRaises(AttributeError, setattr, proto, 'repeated_int32', 10)
588
+ # Lists shouldn't work, either.
589
+ self.assertRaises(AttributeError, setattr, proto, 'repeated_int32', [10])
590
+ # Composite fields.
591
+ self.assertRaises(AttributeError, setattr, proto,
592
+ 'optional_nested_message', 23)
593
+ # Assignment to a repeated nested message field without specifying
594
+ # the index in the array of nested messages.
595
+ self.assertRaises(AttributeError, setattr, proto.repeated_nested_message,
596
+ 'bb', 34)
597
+ # Assignment to an attribute of a repeated field.
598
+ self.assertRaises(AttributeError, setattr, proto.repeated_float,
599
+ 'some_attribute', 34)
600
+ # proto.nonexistent_field = 23 should fail as well.
601
+ self.assertRaises(AttributeError, setattr, proto, 'nonexistent_field', 23)
602
+
603
+ def testSingleScalarTypeSafety(self):
604
+ proto = unittest_pb2.TestAllTypes()
605
+ self.assertRaises(TypeError, setattr, proto, 'optional_int32', 1.1)
606
+ self.assertRaises(TypeError, setattr, proto, 'optional_int32', 'foo')
607
+ self.assertRaises(TypeError, setattr, proto, 'optional_string', 10)
608
+ self.assertRaises(TypeError, setattr, proto, 'optional_bytes', 10)
609
+
610
+ def testIntegerTypes(self):
611
+ def TestGetAndDeserialize(field_name, value, expected_type):
612
+ proto = unittest_pb2.TestAllTypes()
613
+ setattr(proto, field_name, value)
614
+ self.assertTrue(isinstance(getattr(proto, field_name), expected_type))
615
+ proto2 = unittest_pb2.TestAllTypes()
616
+ proto2.ParseFromString(proto.SerializeToString())
617
+ self.assertTrue(isinstance(getattr(proto2, field_name), expected_type))
618
+
619
+ TestGetAndDeserialize('optional_int32', 1, int)
620
+ TestGetAndDeserialize('optional_int32', 1 << 30, int)
621
+ TestGetAndDeserialize('optional_uint32', 1 << 30, int)
622
+ if struct.calcsize('L') == 4:
623
+ # Python only has signed ints, so 32-bit python can't fit an uint32
624
+ # in an int.
625
+ TestGetAndDeserialize('optional_uint32', 1 << 31, long)
626
+ else:
627
+ # 64-bit python can fit uint32 inside an int
628
+ TestGetAndDeserialize('optional_uint32', 1 << 31, int)
629
+ TestGetAndDeserialize('optional_int64', 1 << 30, long)
630
+ TestGetAndDeserialize('optional_int64', 1 << 60, long)
631
+ TestGetAndDeserialize('optional_uint64', 1 << 30, long)
632
+ TestGetAndDeserialize('optional_uint64', 1 << 60, long)
633
+
634
+ def testSingleScalarBoundsChecking(self):
635
+ def TestMinAndMaxIntegers(field_name, expected_min, expected_max):
636
+ pb = unittest_pb2.TestAllTypes()
637
+ setattr(pb, field_name, expected_min)
638
+ self.assertEqual(expected_min, getattr(pb, field_name))
639
+ setattr(pb, field_name, expected_max)
640
+ self.assertEqual(expected_max, getattr(pb, field_name))
641
+ self.assertRaises(ValueError, setattr, pb, field_name, expected_min - 1)
642
+ self.assertRaises(ValueError, setattr, pb, field_name, expected_max + 1)
643
+
644
+ TestMinAndMaxIntegers('optional_int32', -(1 << 31), (1 << 31) - 1)
645
+ TestMinAndMaxIntegers('optional_uint32', 0, 0xffffffff)
646
+ TestMinAndMaxIntegers('optional_int64', -(1 << 63), (1 << 63) - 1)
647
+ TestMinAndMaxIntegers('optional_uint64', 0, 0xffffffffffffffff)
648
+
649
+ pb = unittest_pb2.TestAllTypes()
650
+ pb.optional_nested_enum = 1
651
+ self.assertEqual(1, pb.optional_nested_enum)
652
+
653
+ def testRepeatedScalarTypeSafety(self):
654
+ proto = unittest_pb2.TestAllTypes()
655
+ self.assertRaises(TypeError, proto.repeated_int32.append, 1.1)
656
+ self.assertRaises(TypeError, proto.repeated_int32.append, 'foo')
657
+ self.assertRaises(TypeError, proto.repeated_string, 10)
658
+ self.assertRaises(TypeError, proto.repeated_bytes, 10)
659
+
660
+ proto.repeated_int32.append(10)
661
+ proto.repeated_int32[0] = 23
662
+ self.assertRaises(IndexError, proto.repeated_int32.__setitem__, 500, 23)
663
+ self.assertRaises(TypeError, proto.repeated_int32.__setitem__, 0, 'abc')
664
+
665
+ # Repeated enums tests.
666
+ #proto.repeated_nested_enum.append(0)
667
+
668
+ def testSingleScalarGettersAndSetters(self):
669
+ proto = unittest_pb2.TestAllTypes()
670
+ self.assertEqual(0, proto.optional_int32)
671
+ proto.optional_int32 = 1
672
+ self.assertEqual(1, proto.optional_int32)
673
+
674
+ proto.optional_uint64 = 0xffffffffffff
675
+ self.assertEqual(0xffffffffffff, proto.optional_uint64)
676
+ proto.optional_uint64 = 0xffffffffffffffff
677
+ self.assertEqual(0xffffffffffffffff, proto.optional_uint64)
678
+ # TODO(robinson): Test all other scalar field types.
679
+
680
+ def testSingleScalarClearField(self):
681
+ proto = unittest_pb2.TestAllTypes()
682
+ # Should be allowed to clear something that's not there (a no-op).
683
+ proto.ClearField('optional_int32')
684
+ proto.optional_int32 = 1
685
+ self.assertTrue(proto.HasField('optional_int32'))
686
+ proto.ClearField('optional_int32')
687
+ self.assertEqual(0, proto.optional_int32)
688
+ self.assertTrue(not proto.HasField('optional_int32'))
689
+ # TODO(robinson): Test all other scalar field types.
690
+
691
+ def testEnums(self):
692
+ proto = unittest_pb2.TestAllTypes()
693
+ self.assertEqual(1, proto.FOO)
694
+ self.assertEqual(1, unittest_pb2.TestAllTypes.FOO)
695
+ self.assertEqual(2, proto.BAR)
696
+ self.assertEqual(2, unittest_pb2.TestAllTypes.BAR)
697
+ self.assertEqual(3, proto.BAZ)
698
+ self.assertEqual(3, unittest_pb2.TestAllTypes.BAZ)
699
+
700
+ def testEnum_Name(self):
701
+ self.assertEqual('FOREIGN_FOO',
702
+ unittest_pb2.ForeignEnum.Name(unittest_pb2.FOREIGN_FOO))
703
+ self.assertEqual('FOREIGN_BAR',
704
+ unittest_pb2.ForeignEnum.Name(unittest_pb2.FOREIGN_BAR))
705
+ self.assertEqual('FOREIGN_BAZ',
706
+ unittest_pb2.ForeignEnum.Name(unittest_pb2.FOREIGN_BAZ))
707
+ self.assertRaises(ValueError,
708
+ unittest_pb2.ForeignEnum.Name, 11312)
709
+
710
+ proto = unittest_pb2.TestAllTypes()
711
+ self.assertEqual('FOO',
712
+ proto.NestedEnum.Name(proto.FOO))
713
+ self.assertEqual('FOO',
714
+ unittest_pb2.TestAllTypes.NestedEnum.Name(proto.FOO))
715
+ self.assertEqual('BAR',
716
+ proto.NestedEnum.Name(proto.BAR))
717
+ self.assertEqual('BAR',
718
+ unittest_pb2.TestAllTypes.NestedEnum.Name(proto.BAR))
719
+ self.assertEqual('BAZ',
720
+ proto.NestedEnum.Name(proto.BAZ))
721
+ self.assertEqual('BAZ',
722
+ unittest_pb2.TestAllTypes.NestedEnum.Name(proto.BAZ))
723
+ self.assertRaises(ValueError,
724
+ proto.NestedEnum.Name, 11312)
725
+ self.assertRaises(ValueError,
726
+ unittest_pb2.TestAllTypes.NestedEnum.Name, 11312)
727
+
728
+ def testEnum_Value(self):
729
+ self.assertEqual(unittest_pb2.FOREIGN_FOO,
730
+ unittest_pb2.ForeignEnum.Value('FOREIGN_FOO'))
731
+ self.assertEqual(unittest_pb2.FOREIGN_BAR,
732
+ unittest_pb2.ForeignEnum.Value('FOREIGN_BAR'))
733
+ self.assertEqual(unittest_pb2.FOREIGN_BAZ,
734
+ unittest_pb2.ForeignEnum.Value('FOREIGN_BAZ'))
735
+ self.assertRaises(ValueError,
736
+ unittest_pb2.ForeignEnum.Value, 'FO')
737
+
738
+ proto = unittest_pb2.TestAllTypes()
739
+ self.assertEqual(proto.FOO,
740
+ proto.NestedEnum.Value('FOO'))
741
+ self.assertEqual(proto.FOO,
742
+ unittest_pb2.TestAllTypes.NestedEnum.Value('FOO'))
743
+ self.assertEqual(proto.BAR,
744
+ proto.NestedEnum.Value('BAR'))
745
+ self.assertEqual(proto.BAR,
746
+ unittest_pb2.TestAllTypes.NestedEnum.Value('BAR'))
747
+ self.assertEqual(proto.BAZ,
748
+ proto.NestedEnum.Value('BAZ'))
749
+ self.assertEqual(proto.BAZ,
750
+ unittest_pb2.TestAllTypes.NestedEnum.Value('BAZ'))
751
+ self.assertRaises(ValueError,
752
+ proto.NestedEnum.Value, 'Foo')
753
+ self.assertRaises(ValueError,
754
+ unittest_pb2.TestAllTypes.NestedEnum.Value, 'Foo')
755
+
756
+ def testEnum_KeysAndValues(self):
757
+ self.assertEqual(['FOREIGN_FOO', 'FOREIGN_BAR', 'FOREIGN_BAZ'],
758
+ unittest_pb2.ForeignEnum.keys())
759
+ self.assertEqual([4, 5, 6],
760
+ unittest_pb2.ForeignEnum.values())
761
+ self.assertEqual([('FOREIGN_FOO', 4), ('FOREIGN_BAR', 5),
762
+ ('FOREIGN_BAZ', 6)],
763
+ unittest_pb2.ForeignEnum.items())
764
+
765
+ proto = unittest_pb2.TestAllTypes()
766
+ self.assertEqual(['FOO', 'BAR', 'BAZ', 'NEG'], proto.NestedEnum.keys())
767
+ self.assertEqual([1, 2, 3, -1], proto.NestedEnum.values())
768
+ self.assertEqual([('FOO', 1), ('BAR', 2), ('BAZ', 3), ('NEG', -1)],
769
+ proto.NestedEnum.items())
770
+
771
+ def testRepeatedScalars(self):
772
+ proto = unittest_pb2.TestAllTypes()
773
+
774
+ self.assertTrue(not proto.repeated_int32)
775
+ self.assertEqual(0, len(proto.repeated_int32))
776
+ proto.repeated_int32.append(5)
777
+ proto.repeated_int32.append(10)
778
+ proto.repeated_int32.append(15)
779
+ self.assertTrue(proto.repeated_int32)
780
+ self.assertEqual(3, len(proto.repeated_int32))
781
+
782
+ self.assertEqual([5, 10, 15], proto.repeated_int32)
783
+
784
+ # Test single retrieval.
785
+ self.assertEqual(5, proto.repeated_int32[0])
786
+ self.assertEqual(15, proto.repeated_int32[-1])
787
+ # Test out-of-bounds indices.
788
+ self.assertRaises(IndexError, proto.repeated_int32.__getitem__, 1234)
789
+ self.assertRaises(IndexError, proto.repeated_int32.__getitem__, -1234)
790
+ # Test incorrect types passed to __getitem__.
791
+ self.assertRaises(TypeError, proto.repeated_int32.__getitem__, 'foo')
792
+ self.assertRaises(TypeError, proto.repeated_int32.__getitem__, None)
793
+
794
+ # Test single assignment.
795
+ proto.repeated_int32[1] = 20
796
+ self.assertEqual([5, 20, 15], proto.repeated_int32)
797
+
798
+ # Test insertion.
799
+ proto.repeated_int32.insert(1, 25)
800
+ self.assertEqual([5, 25, 20, 15], proto.repeated_int32)
801
+
802
+ # Test slice retrieval.
803
+ proto.repeated_int32.append(30)
804
+ self.assertEqual([25, 20, 15], proto.repeated_int32[1:4])
805
+ self.assertEqual([5, 25, 20, 15, 30], proto.repeated_int32[:])
806
+
807
+ # Test slice assignment with an iterator
808
+ proto.repeated_int32[1:4] = (i for i in xrange(3))
809
+ self.assertEqual([5, 0, 1, 2, 30], proto.repeated_int32)
810
+
811
+ # Test slice assignment.
812
+ proto.repeated_int32[1:4] = [35, 40, 45]
813
+ self.assertEqual([5, 35, 40, 45, 30], proto.repeated_int32)
814
+
815
+ # Test that we can use the field as an iterator.
816
+ result = []
817
+ for i in proto.repeated_int32:
818
+ result.append(i)
819
+ self.assertEqual([5, 35, 40, 45, 30], result)
820
+
821
+ # Test single deletion.
822
+ del proto.repeated_int32[2]
823
+ self.assertEqual([5, 35, 45, 30], proto.repeated_int32)
824
+
825
+ # Test slice deletion.
826
+ del proto.repeated_int32[2:]
827
+ self.assertEqual([5, 35], proto.repeated_int32)
828
+
829
+ # Test extending.
830
+ proto.repeated_int32.extend([3, 13])
831
+ self.assertEqual([5, 35, 3, 13], proto.repeated_int32)
832
+
833
+ # Test clearing.
834
+ proto.ClearField('repeated_int32')
835
+ self.assertTrue(not proto.repeated_int32)
836
+ self.assertEqual(0, len(proto.repeated_int32))
837
+
838
+ proto.repeated_int32.append(1)
839
+ self.assertEqual(1, proto.repeated_int32[-1])
840
+ # Test assignment to a negative index.
841
+ proto.repeated_int32[-1] = 2
842
+ self.assertEqual(2, proto.repeated_int32[-1])
843
+
844
+ # Test deletion at negative indices.
845
+ proto.repeated_int32[:] = [0, 1, 2, 3]
846
+ del proto.repeated_int32[-1]
847
+ self.assertEqual([0, 1, 2], proto.repeated_int32)
848
+
849
+ del proto.repeated_int32[-2]
850
+ self.assertEqual([0, 2], proto.repeated_int32)
851
+
852
+ self.assertRaises(IndexError, proto.repeated_int32.__delitem__, -3)
853
+ self.assertRaises(IndexError, proto.repeated_int32.__delitem__, 300)
854
+
855
+ del proto.repeated_int32[-2:-1]
856
+ self.assertEqual([2], proto.repeated_int32)
857
+
858
+ del proto.repeated_int32[100:10000]
859
+ self.assertEqual([2], proto.repeated_int32)
860
+
861
+ def testRepeatedScalarsRemove(self):
862
+ proto = unittest_pb2.TestAllTypes()
863
+
864
+ self.assertTrue(not proto.repeated_int32)
865
+ self.assertEqual(0, len(proto.repeated_int32))
866
+ proto.repeated_int32.append(5)
867
+ proto.repeated_int32.append(10)
868
+ proto.repeated_int32.append(5)
869
+ proto.repeated_int32.append(5)
870
+
871
+ self.assertEqual(4, len(proto.repeated_int32))
872
+ proto.repeated_int32.remove(5)
873
+ self.assertEqual(3, len(proto.repeated_int32))
874
+ self.assertEqual(10, proto.repeated_int32[0])
875
+ self.assertEqual(5, proto.repeated_int32[1])
876
+ self.assertEqual(5, proto.repeated_int32[2])
877
+
878
+ proto.repeated_int32.remove(5)
879
+ self.assertEqual(2, len(proto.repeated_int32))
880
+ self.assertEqual(10, proto.repeated_int32[0])
881
+ self.assertEqual(5, proto.repeated_int32[1])
882
+
883
+ proto.repeated_int32.remove(10)
884
+ self.assertEqual(1, len(proto.repeated_int32))
885
+ self.assertEqual(5, proto.repeated_int32[0])
886
+
887
+ # Remove a non-existent element.
888
+ self.assertRaises(ValueError, proto.repeated_int32.remove, 123)
889
+
890
+ def testRepeatedComposites(self):
891
+ proto = unittest_pb2.TestAllTypes()
892
+ self.assertTrue(not proto.repeated_nested_message)
893
+ self.assertEqual(0, len(proto.repeated_nested_message))
894
+ m0 = proto.repeated_nested_message.add()
895
+ m1 = proto.repeated_nested_message.add()
896
+ self.assertTrue(proto.repeated_nested_message)
897
+ self.assertEqual(2, len(proto.repeated_nested_message))
898
+ self.assertListsEqual([m0, m1], proto.repeated_nested_message)
899
+ self.assertTrue(isinstance(m0, unittest_pb2.TestAllTypes.NestedMessage))
900
+
901
+ # Test out-of-bounds indices.
902
+ self.assertRaises(IndexError, proto.repeated_nested_message.__getitem__,
903
+ 1234)
904
+ self.assertRaises(IndexError, proto.repeated_nested_message.__getitem__,
905
+ -1234)
906
+
907
+ # Test incorrect types passed to __getitem__.
908
+ self.assertRaises(TypeError, proto.repeated_nested_message.__getitem__,
909
+ 'foo')
910
+ self.assertRaises(TypeError, proto.repeated_nested_message.__getitem__,
911
+ None)
912
+
913
+ # Test slice retrieval.
914
+ m2 = proto.repeated_nested_message.add()
915
+ m3 = proto.repeated_nested_message.add()
916
+ m4 = proto.repeated_nested_message.add()
917
+ self.assertListsEqual(
918
+ [m1, m2, m3], proto.repeated_nested_message[1:4])
919
+ self.assertListsEqual(
920
+ [m0, m1, m2, m3, m4], proto.repeated_nested_message[:])
921
+ self.assertListsEqual(
922
+ [m0, m1], proto.repeated_nested_message[:2])
923
+ self.assertListsEqual(
924
+ [m2, m3, m4], proto.repeated_nested_message[2:])
925
+ self.assertEqual(
926
+ m0, proto.repeated_nested_message[0])
927
+ self.assertListsEqual(
928
+ [m0], proto.repeated_nested_message[:1])
929
+
930
+ # Test that we can use the field as an iterator.
931
+ result = []
932
+ for i in proto.repeated_nested_message:
933
+ result.append(i)
934
+ self.assertListsEqual([m0, m1, m2, m3, m4], result)
935
+
936
+ # Test single deletion.
937
+ del proto.repeated_nested_message[2]
938
+ self.assertListsEqual([m0, m1, m3, m4], proto.repeated_nested_message)
939
+
940
+ # Test slice deletion.
941
+ del proto.repeated_nested_message[2:]
942
+ self.assertListsEqual([m0, m1], proto.repeated_nested_message)
943
+
944
+ # Test extending.
945
+ n1 = unittest_pb2.TestAllTypes.NestedMessage(bb=1)
946
+ n2 = unittest_pb2.TestAllTypes.NestedMessage(bb=2)
947
+ proto.repeated_nested_message.extend([n1,n2])
948
+ self.assertEqual(4, len(proto.repeated_nested_message))
949
+ self.assertEqual(n1, proto.repeated_nested_message[2])
950
+ self.assertEqual(n2, proto.repeated_nested_message[3])
951
+
952
+ # Test clearing.
953
+ proto.ClearField('repeated_nested_message')
954
+ self.assertTrue(not proto.repeated_nested_message)
955
+ self.assertEqual(0, len(proto.repeated_nested_message))
956
+
957
+ # Test constructing an element while adding it.
958
+ proto.repeated_nested_message.add(bb=23)
959
+ self.assertEqual(1, len(proto.repeated_nested_message))
960
+ self.assertEqual(23, proto.repeated_nested_message[0].bb)
961
+
962
+ def testRepeatedCompositeRemove(self):
963
+ proto = unittest_pb2.TestAllTypes()
964
+
965
+ self.assertEqual(0, len(proto.repeated_nested_message))
966
+ m0 = proto.repeated_nested_message.add()
967
+ # Need to set some differentiating variable so m0 != m1 != m2:
968
+ m0.bb = len(proto.repeated_nested_message)
969
+ m1 = proto.repeated_nested_message.add()
970
+ m1.bb = len(proto.repeated_nested_message)
971
+ self.assertTrue(m0 != m1)
972
+ m2 = proto.repeated_nested_message.add()
973
+ m2.bb = len(proto.repeated_nested_message)
974
+ self.assertListsEqual([m0, m1, m2], proto.repeated_nested_message)
975
+
976
+ self.assertEqual(3, len(proto.repeated_nested_message))
977
+ proto.repeated_nested_message.remove(m0)
978
+ self.assertEqual(2, len(proto.repeated_nested_message))
979
+ self.assertEqual(m1, proto.repeated_nested_message[0])
980
+ self.assertEqual(m2, proto.repeated_nested_message[1])
981
+
982
+ # Removing m0 again or removing None should raise error
983
+ self.assertRaises(ValueError, proto.repeated_nested_message.remove, m0)
984
+ self.assertRaises(ValueError, proto.repeated_nested_message.remove, None)
985
+ self.assertEqual(2, len(proto.repeated_nested_message))
986
+
987
+ proto.repeated_nested_message.remove(m2)
988
+ self.assertEqual(1, len(proto.repeated_nested_message))
989
+ self.assertEqual(m1, proto.repeated_nested_message[0])
990
+
991
+ def testHandWrittenReflection(self):
992
+ # Hand written extensions are only supported by the pure-Python
993
+ # implementation of the API.
994
+ if api_implementation.Type() != 'python':
995
+ return
996
+
997
+ FieldDescriptor = descriptor.FieldDescriptor
998
+ foo_field_descriptor = FieldDescriptor(
999
+ name='foo_field', full_name='MyProto.foo_field',
1000
+ index=0, number=1, type=FieldDescriptor.TYPE_INT64,
1001
+ cpp_type=FieldDescriptor.CPPTYPE_INT64,
1002
+ label=FieldDescriptor.LABEL_OPTIONAL, default_value=0,
1003
+ containing_type=None, message_type=None, enum_type=None,
1004
+ is_extension=False, extension_scope=None,
1005
+ options=descriptor_pb2.FieldOptions())
1006
+ mydescriptor = descriptor.Descriptor(
1007
+ name='MyProto', full_name='MyProto', filename='ignored',
1008
+ containing_type=None, nested_types=[], enum_types=[],
1009
+ fields=[foo_field_descriptor], extensions=[],
1010
+ options=descriptor_pb2.MessageOptions())
1011
+ class MyProtoClass(message.Message):
1012
+ DESCRIPTOR = mydescriptor
1013
+ __metaclass__ = reflection.GeneratedProtocolMessageType
1014
+ myproto_instance = MyProtoClass()
1015
+ self.assertEqual(0, myproto_instance.foo_field)
1016
+ self.assertTrue(not myproto_instance.HasField('foo_field'))
1017
+ myproto_instance.foo_field = 23
1018
+ self.assertEqual(23, myproto_instance.foo_field)
1019
+ self.assertTrue(myproto_instance.HasField('foo_field'))
1020
+
1021
+ def testDescriptorProtoSupport(self):
1022
+ # Hand written descriptors/reflection are only supported by the pure-Python
1023
+ # implementation of the API.
1024
+ if api_implementation.Type() != 'python':
1025
+ return
1026
+
1027
+ def AddDescriptorField(proto, field_name, field_type):
1028
+ AddDescriptorField.field_index += 1
1029
+ new_field = proto.field.add()
1030
+ new_field.name = field_name
1031
+ new_field.type = field_type
1032
+ new_field.number = AddDescriptorField.field_index
1033
+ new_field.label = descriptor_pb2.FieldDescriptorProto.LABEL_OPTIONAL
1034
+
1035
+ AddDescriptorField.field_index = 0
1036
+
1037
+ desc_proto = descriptor_pb2.DescriptorProto()
1038
+ desc_proto.name = 'Car'
1039
+ fdp = descriptor_pb2.FieldDescriptorProto
1040
+ AddDescriptorField(desc_proto, 'name', fdp.TYPE_STRING)
1041
+ AddDescriptorField(desc_proto, 'year', fdp.TYPE_INT64)
1042
+ AddDescriptorField(desc_proto, 'automatic', fdp.TYPE_BOOL)
1043
+ AddDescriptorField(desc_proto, 'price', fdp.TYPE_DOUBLE)
1044
+ # Add a repeated field
1045
+ AddDescriptorField.field_index += 1
1046
+ new_field = desc_proto.field.add()
1047
+ new_field.name = 'owners'
1048
+ new_field.type = fdp.TYPE_STRING
1049
+ new_field.number = AddDescriptorField.field_index
1050
+ new_field.label = descriptor_pb2.FieldDescriptorProto.LABEL_REPEATED
1051
+
1052
+ desc = descriptor.MakeDescriptor(desc_proto)
1053
+ self.assertTrue(desc.fields_by_name.has_key('name'))
1054
+ self.assertTrue(desc.fields_by_name.has_key('year'))
1055
+ self.assertTrue(desc.fields_by_name.has_key('automatic'))
1056
+ self.assertTrue(desc.fields_by_name.has_key('price'))
1057
+ self.assertTrue(desc.fields_by_name.has_key('owners'))
1058
+
1059
+ class CarMessage(message.Message):
1060
+ __metaclass__ = reflection.GeneratedProtocolMessageType
1061
+ DESCRIPTOR = desc
1062
+
1063
+ prius = CarMessage()
1064
+ prius.name = 'prius'
1065
+ prius.year = 2010
1066
+ prius.automatic = True
1067
+ prius.price = 25134.75
1068
+ prius.owners.extend(['bob', 'susan'])
1069
+
1070
+ serialized_prius = prius.SerializeToString()
1071
+ new_prius = reflection.ParseMessage(desc, serialized_prius)
1072
+ self.assertTrue(new_prius is not prius)
1073
+ self.assertEqual(prius, new_prius)
1074
+
1075
+ # these are unnecessary assuming message equality works as advertised but
1076
+ # explicitly check to be safe since we're mucking about in metaclass foo
1077
+ self.assertEqual(prius.name, new_prius.name)
1078
+ self.assertEqual(prius.year, new_prius.year)
1079
+ self.assertEqual(prius.automatic, new_prius.automatic)
1080
+ self.assertEqual(prius.price, new_prius.price)
1081
+ self.assertEqual(prius.owners, new_prius.owners)
1082
+
1083
+ def testTopLevelExtensionsForOptionalScalar(self):
1084
+ extendee_proto = unittest_pb2.TestAllExtensions()
1085
+ extension = unittest_pb2.optional_int32_extension
1086
+ self.assertTrue(not extendee_proto.HasExtension(extension))
1087
+ self.assertEqual(0, extendee_proto.Extensions[extension])
1088
+ # As with normal scalar fields, just doing a read doesn't actually set the
1089
+ # "has" bit.
1090
+ self.assertTrue(not extendee_proto.HasExtension(extension))
1091
+ # Actually set the thing.
1092
+ extendee_proto.Extensions[extension] = 23
1093
+ self.assertEqual(23, extendee_proto.Extensions[extension])
1094
+ self.assertTrue(extendee_proto.HasExtension(extension))
1095
+ # Ensure that clearing works as well.
1096
+ extendee_proto.ClearExtension(extension)
1097
+ self.assertEqual(0, extendee_proto.Extensions[extension])
1098
+ self.assertTrue(not extendee_proto.HasExtension(extension))
1099
+
1100
+ def testTopLevelExtensionsForRepeatedScalar(self):
1101
+ extendee_proto = unittest_pb2.TestAllExtensions()
1102
+ extension = unittest_pb2.repeated_string_extension
1103
+ self.assertEqual(0, len(extendee_proto.Extensions[extension]))
1104
+ extendee_proto.Extensions[extension].append('foo')
1105
+ self.assertEqual(['foo'], extendee_proto.Extensions[extension])
1106
+ string_list = extendee_proto.Extensions[extension]
1107
+ extendee_proto.ClearExtension(extension)
1108
+ self.assertEqual(0, len(extendee_proto.Extensions[extension]))
1109
+ self.assertTrue(string_list is not extendee_proto.Extensions[extension])
1110
+ # Shouldn't be allowed to do Extensions[extension] = 'a'
1111
+ self.assertRaises(TypeError, operator.setitem, extendee_proto.Extensions,
1112
+ extension, 'a')
1113
+
1114
+ def testTopLevelExtensionsForOptionalMessage(self):
1115
+ extendee_proto = unittest_pb2.TestAllExtensions()
1116
+ extension = unittest_pb2.optional_foreign_message_extension
1117
+ self.assertTrue(not extendee_proto.HasExtension(extension))
1118
+ self.assertEqual(0, extendee_proto.Extensions[extension].c)
1119
+ # As with normal (non-extension) fields, merely reading from the
1120
+ # thing shouldn't set the "has" bit.
1121
+ self.assertTrue(not extendee_proto.HasExtension(extension))
1122
+ extendee_proto.Extensions[extension].c = 23
1123
+ self.assertEqual(23, extendee_proto.Extensions[extension].c)
1124
+ self.assertTrue(extendee_proto.HasExtension(extension))
1125
+ # Save a reference here.
1126
+ foreign_message = extendee_proto.Extensions[extension]
1127
+ extendee_proto.ClearExtension(extension)
1128
+ self.assertTrue(foreign_message is not extendee_proto.Extensions[extension])
1129
+ # Setting a field on foreign_message now shouldn't set
1130
+ # any "has" bits on extendee_proto.
1131
+ foreign_message.c = 42
1132
+ self.assertEqual(42, foreign_message.c)
1133
+ self.assertTrue(foreign_message.HasField('c'))
1134
+ self.assertTrue(not extendee_proto.HasExtension(extension))
1135
+ # Shouldn't be allowed to do Extensions[extension] = 'a'
1136
+ self.assertRaises(TypeError, operator.setitem, extendee_proto.Extensions,
1137
+ extension, 'a')
1138
+
1139
+ def testTopLevelExtensionsForRepeatedMessage(self):
1140
+ extendee_proto = unittest_pb2.TestAllExtensions()
1141
+ extension = unittest_pb2.repeatedgroup_extension
1142
+ self.assertEqual(0, len(extendee_proto.Extensions[extension]))
1143
+ group = extendee_proto.Extensions[extension].add()
1144
+ group.a = 23
1145
+ self.assertEqual(23, extendee_proto.Extensions[extension][0].a)
1146
+ group.a = 42
1147
+ self.assertEqual(42, extendee_proto.Extensions[extension][0].a)
1148
+ group_list = extendee_proto.Extensions[extension]
1149
+ extendee_proto.ClearExtension(extension)
1150
+ self.assertEqual(0, len(extendee_proto.Extensions[extension]))
1151
+ self.assertTrue(group_list is not extendee_proto.Extensions[extension])
1152
+ # Shouldn't be allowed to do Extensions[extension] = 'a'
1153
+ self.assertRaises(TypeError, operator.setitem, extendee_proto.Extensions,
1154
+ extension, 'a')
1155
+
1156
+ def testNestedExtensions(self):
1157
+ extendee_proto = unittest_pb2.TestAllExtensions()
1158
+ extension = unittest_pb2.TestRequired.single
1159
+
1160
+ # We just test the non-repeated case.
1161
+ self.assertTrue(not extendee_proto.HasExtension(extension))
1162
+ required = extendee_proto.Extensions[extension]
1163
+ self.assertEqual(0, required.a)
1164
+ self.assertTrue(not extendee_proto.HasExtension(extension))
1165
+ required.a = 23
1166
+ self.assertEqual(23, extendee_proto.Extensions[extension].a)
1167
+ self.assertTrue(extendee_proto.HasExtension(extension))
1168
+ extendee_proto.ClearExtension(extension)
1169
+ self.assertTrue(required is not extendee_proto.Extensions[extension])
1170
+ self.assertTrue(not extendee_proto.HasExtension(extension))
1171
+
1172
+ def testRegisteredExtensions(self):
1173
+ self.assertTrue('protobuf_unittest.optional_int32_extension' in
1174
+ unittest_pb2.TestAllExtensions._extensions_by_name)
1175
+ self.assertTrue(1 in unittest_pb2.TestAllExtensions._extensions_by_number)
1176
+ # Make sure extensions haven't been registered into types that shouldn't
1177
+ # have any.
1178
+ self.assertEquals(0, len(unittest_pb2.TestAllTypes._extensions_by_name))
1179
+
1180
+ # If message A directly contains message B, and
1181
+ # a.HasField('b') is currently False, then mutating any
1182
+ # extension in B should change a.HasField('b') to True
1183
+ # (and so on up the object tree).
1184
+ def testHasBitsForAncestorsOfExtendedMessage(self):
1185
+ # Optional scalar extension.
1186
+ toplevel = more_extensions_pb2.TopLevelMessage()
1187
+ self.assertTrue(not toplevel.HasField('submessage'))
1188
+ self.assertEqual(0, toplevel.submessage.Extensions[
1189
+ more_extensions_pb2.optional_int_extension])
1190
+ self.assertTrue(not toplevel.HasField('submessage'))
1191
+ toplevel.submessage.Extensions[
1192
+ more_extensions_pb2.optional_int_extension] = 23
1193
+ self.assertEqual(23, toplevel.submessage.Extensions[
1194
+ more_extensions_pb2.optional_int_extension])
1195
+ self.assertTrue(toplevel.HasField('submessage'))
1196
+
1197
+ # Repeated scalar extension.
1198
+ toplevel = more_extensions_pb2.TopLevelMessage()
1199
+ self.assertTrue(not toplevel.HasField('submessage'))
1200
+ self.assertEqual([], toplevel.submessage.Extensions[
1201
+ more_extensions_pb2.repeated_int_extension])
1202
+ self.assertTrue(not toplevel.HasField('submessage'))
1203
+ toplevel.submessage.Extensions[
1204
+ more_extensions_pb2.repeated_int_extension].append(23)
1205
+ self.assertEqual([23], toplevel.submessage.Extensions[
1206
+ more_extensions_pb2.repeated_int_extension])
1207
+ self.assertTrue(toplevel.HasField('submessage'))
1208
+
1209
+ # Optional message extension.
1210
+ toplevel = more_extensions_pb2.TopLevelMessage()
1211
+ self.assertTrue(not toplevel.HasField('submessage'))
1212
+ self.assertEqual(0, toplevel.submessage.Extensions[
1213
+ more_extensions_pb2.optional_message_extension].foreign_message_int)
1214
+ self.assertTrue(not toplevel.HasField('submessage'))
1215
+ toplevel.submessage.Extensions[
1216
+ more_extensions_pb2.optional_message_extension].foreign_message_int = 23
1217
+ self.assertEqual(23, toplevel.submessage.Extensions[
1218
+ more_extensions_pb2.optional_message_extension].foreign_message_int)
1219
+ self.assertTrue(toplevel.HasField('submessage'))
1220
+
1221
+ # Repeated message extension.
1222
+ toplevel = more_extensions_pb2.TopLevelMessage()
1223
+ self.assertTrue(not toplevel.HasField('submessage'))
1224
+ self.assertEqual(0, len(toplevel.submessage.Extensions[
1225
+ more_extensions_pb2.repeated_message_extension]))
1226
+ self.assertTrue(not toplevel.HasField('submessage'))
1227
+ foreign = toplevel.submessage.Extensions[
1228
+ more_extensions_pb2.repeated_message_extension].add()
1229
+ self.assertEqual(foreign, toplevel.submessage.Extensions[
1230
+ more_extensions_pb2.repeated_message_extension][0])
1231
+ self.assertTrue(toplevel.HasField('submessage'))
1232
+
1233
+ def testDisconnectionAfterClearingEmptyMessage(self):
1234
+ toplevel = more_extensions_pb2.TopLevelMessage()
1235
+ extendee_proto = toplevel.submessage
1236
+ extension = more_extensions_pb2.optional_message_extension
1237
+ extension_proto = extendee_proto.Extensions[extension]
1238
+ extendee_proto.ClearExtension(extension)
1239
+ extension_proto.foreign_message_int = 23
1240
+
1241
+ self.assertTrue(extension_proto is not extendee_proto.Extensions[extension])
1242
+
1243
+ def testExtensionFailureModes(self):
1244
+ extendee_proto = unittest_pb2.TestAllExtensions()
1245
+
1246
+ # Try non-extension-handle arguments to HasExtension,
1247
+ # ClearExtension(), and Extensions[]...
1248
+ self.assertRaises(KeyError, extendee_proto.HasExtension, 1234)
1249
+ self.assertRaises(KeyError, extendee_proto.ClearExtension, 1234)
1250
+ self.assertRaises(KeyError, extendee_proto.Extensions.__getitem__, 1234)
1251
+ self.assertRaises(KeyError, extendee_proto.Extensions.__setitem__, 1234, 5)
1252
+
1253
+ # Try something that *is* an extension handle, just not for
1254
+ # this message...
1255
+ unknown_handle = more_extensions_pb2.optional_int_extension
1256
+ self.assertRaises(KeyError, extendee_proto.HasExtension,
1257
+ unknown_handle)
1258
+ self.assertRaises(KeyError, extendee_proto.ClearExtension,
1259
+ unknown_handle)
1260
+ self.assertRaises(KeyError, extendee_proto.Extensions.__getitem__,
1261
+ unknown_handle)
1262
+ self.assertRaises(KeyError, extendee_proto.Extensions.__setitem__,
1263
+ unknown_handle, 5)
1264
+
1265
+ # Try call HasExtension() with a valid handle, but for a
1266
+ # *repeated* field. (Just as with non-extension repeated
1267
+ # fields, Has*() isn't supported for extension repeated fields).
1268
+ self.assertRaises(KeyError, extendee_proto.HasExtension,
1269
+ unittest_pb2.repeated_string_extension)
1270
+
1271
+ def testStaticParseFrom(self):
1272
+ proto1 = unittest_pb2.TestAllTypes()
1273
+ test_util.SetAllFields(proto1)
1274
+
1275
+ string1 = proto1.SerializeToString()
1276
+ proto2 = unittest_pb2.TestAllTypes.FromString(string1)
1277
+
1278
+ # Messages should be equal.
1279
+ self.assertEqual(proto2, proto1)
1280
+
1281
+ def testMergeFromSingularField(self):
1282
+ # Test merge with just a singular field.
1283
+ proto1 = unittest_pb2.TestAllTypes()
1284
+ proto1.optional_int32 = 1
1285
+
1286
+ proto2 = unittest_pb2.TestAllTypes()
1287
+ # This shouldn't get overwritten.
1288
+ proto2.optional_string = 'value'
1289
+
1290
+ proto2.MergeFrom(proto1)
1291
+ self.assertEqual(1, proto2.optional_int32)
1292
+ self.assertEqual('value', proto2.optional_string)
1293
+
1294
+ def testMergeFromRepeatedField(self):
1295
+ # Test merge with just a repeated field.
1296
+ proto1 = unittest_pb2.TestAllTypes()
1297
+ proto1.repeated_int32.append(1)
1298
+ proto1.repeated_int32.append(2)
1299
+
1300
+ proto2 = unittest_pb2.TestAllTypes()
1301
+ proto2.repeated_int32.append(0)
1302
+ proto2.MergeFrom(proto1)
1303
+
1304
+ self.assertEqual(0, proto2.repeated_int32[0])
1305
+ self.assertEqual(1, proto2.repeated_int32[1])
1306
+ self.assertEqual(2, proto2.repeated_int32[2])
1307
+
1308
+ def testMergeFromOptionalGroup(self):
1309
+ # Test merge with an optional group.
1310
+ proto1 = unittest_pb2.TestAllTypes()
1311
+ proto1.optionalgroup.a = 12
1312
+ proto2 = unittest_pb2.TestAllTypes()
1313
+ proto2.MergeFrom(proto1)
1314
+ self.assertEqual(12, proto2.optionalgroup.a)
1315
+
1316
+ def testMergeFromRepeatedNestedMessage(self):
1317
+ # Test merge with a repeated nested message.
1318
+ proto1 = unittest_pb2.TestAllTypes()
1319
+ m = proto1.repeated_nested_message.add()
1320
+ m.bb = 123
1321
+ m = proto1.repeated_nested_message.add()
1322
+ m.bb = 321
1323
+
1324
+ proto2 = unittest_pb2.TestAllTypes()
1325
+ m = proto2.repeated_nested_message.add()
1326
+ m.bb = 999
1327
+ proto2.MergeFrom(proto1)
1328
+ self.assertEqual(999, proto2.repeated_nested_message[0].bb)
1329
+ self.assertEqual(123, proto2.repeated_nested_message[1].bb)
1330
+ self.assertEqual(321, proto2.repeated_nested_message[2].bb)
1331
+
1332
+ proto3 = unittest_pb2.TestAllTypes()
1333
+ proto3.repeated_nested_message.MergeFrom(proto2.repeated_nested_message)
1334
+ self.assertEqual(999, proto3.repeated_nested_message[0].bb)
1335
+ self.assertEqual(123, proto3.repeated_nested_message[1].bb)
1336
+ self.assertEqual(321, proto3.repeated_nested_message[2].bb)
1337
+
1338
+ def testMergeFromAllFields(self):
1339
+ # With all fields set.
1340
+ proto1 = unittest_pb2.TestAllTypes()
1341
+ test_util.SetAllFields(proto1)
1342
+ proto2 = unittest_pb2.TestAllTypes()
1343
+ proto2.MergeFrom(proto1)
1344
+
1345
+ # Messages should be equal.
1346
+ self.assertEqual(proto2, proto1)
1347
+
1348
+ # Serialized string should be equal too.
1349
+ string1 = proto1.SerializeToString()
1350
+ string2 = proto2.SerializeToString()
1351
+ self.assertEqual(string1, string2)
1352
+
1353
+ def testMergeFromExtensionsSingular(self):
1354
+ proto1 = unittest_pb2.TestAllExtensions()
1355
+ proto1.Extensions[unittest_pb2.optional_int32_extension] = 1
1356
+
1357
+ proto2 = unittest_pb2.TestAllExtensions()
1358
+ proto2.MergeFrom(proto1)
1359
+ self.assertEqual(
1360
+ 1, proto2.Extensions[unittest_pb2.optional_int32_extension])
1361
+
1362
+ def testMergeFromExtensionsRepeated(self):
1363
+ proto1 = unittest_pb2.TestAllExtensions()
1364
+ proto1.Extensions[unittest_pb2.repeated_int32_extension].append(1)
1365
+ proto1.Extensions[unittest_pb2.repeated_int32_extension].append(2)
1366
+
1367
+ proto2 = unittest_pb2.TestAllExtensions()
1368
+ proto2.Extensions[unittest_pb2.repeated_int32_extension].append(0)
1369
+ proto2.MergeFrom(proto1)
1370
+ self.assertEqual(
1371
+ 3, len(proto2.Extensions[unittest_pb2.repeated_int32_extension]))
1372
+ self.assertEqual(
1373
+ 0, proto2.Extensions[unittest_pb2.repeated_int32_extension][0])
1374
+ self.assertEqual(
1375
+ 1, proto2.Extensions[unittest_pb2.repeated_int32_extension][1])
1376
+ self.assertEqual(
1377
+ 2, proto2.Extensions[unittest_pb2.repeated_int32_extension][2])
1378
+
1379
+ def testMergeFromExtensionsNestedMessage(self):
1380
+ proto1 = unittest_pb2.TestAllExtensions()
1381
+ ext1 = proto1.Extensions[
1382
+ unittest_pb2.repeated_nested_message_extension]
1383
+ m = ext1.add()
1384
+ m.bb = 222
1385
+ m = ext1.add()
1386
+ m.bb = 333
1387
+
1388
+ proto2 = unittest_pb2.TestAllExtensions()
1389
+ ext2 = proto2.Extensions[
1390
+ unittest_pb2.repeated_nested_message_extension]
1391
+ m = ext2.add()
1392
+ m.bb = 111
1393
+
1394
+ proto2.MergeFrom(proto1)
1395
+ ext2 = proto2.Extensions[
1396
+ unittest_pb2.repeated_nested_message_extension]
1397
+ self.assertEqual(3, len(ext2))
1398
+ self.assertEqual(111, ext2[0].bb)
1399
+ self.assertEqual(222, ext2[1].bb)
1400
+ self.assertEqual(333, ext2[2].bb)
1401
+
1402
+ def testMergeFromBug(self):
1403
+ message1 = unittest_pb2.TestAllTypes()
1404
+ message2 = unittest_pb2.TestAllTypes()
1405
+
1406
+ # Cause optional_nested_message to be instantiated within message1, even
1407
+ # though it is not considered to be "present".
1408
+ message1.optional_nested_message
1409
+ self.assertFalse(message1.HasField('optional_nested_message'))
1410
+
1411
+ # Merge into message2. This should not instantiate the field is message2.
1412
+ message2.MergeFrom(message1)
1413
+ self.assertFalse(message2.HasField('optional_nested_message'))
1414
+
1415
+ def testCopyFromSingularField(self):
1416
+ # Test copy with just a singular field.
1417
+ proto1 = unittest_pb2.TestAllTypes()
1418
+ proto1.optional_int32 = 1
1419
+ proto1.optional_string = 'important-text'
1420
+
1421
+ proto2 = unittest_pb2.TestAllTypes()
1422
+ proto2.optional_string = 'value'
1423
+
1424
+ proto2.CopyFrom(proto1)
1425
+ self.assertEqual(1, proto2.optional_int32)
1426
+ self.assertEqual('important-text', proto2.optional_string)
1427
+
1428
+ def testCopyFromRepeatedField(self):
1429
+ # Test copy with a repeated field.
1430
+ proto1 = unittest_pb2.TestAllTypes()
1431
+ proto1.repeated_int32.append(1)
1432
+ proto1.repeated_int32.append(2)
1433
+
1434
+ proto2 = unittest_pb2.TestAllTypes()
1435
+ proto2.repeated_int32.append(0)
1436
+ proto2.CopyFrom(proto1)
1437
+
1438
+ self.assertEqual(1, proto2.repeated_int32[0])
1439
+ self.assertEqual(2, proto2.repeated_int32[1])
1440
+
1441
+ def testCopyFromAllFields(self):
1442
+ # With all fields set.
1443
+ proto1 = unittest_pb2.TestAllTypes()
1444
+ test_util.SetAllFields(proto1)
1445
+ proto2 = unittest_pb2.TestAllTypes()
1446
+ proto2.CopyFrom(proto1)
1447
+
1448
+ # Messages should be equal.
1449
+ self.assertEqual(proto2, proto1)
1450
+
1451
+ # Serialized string should be equal too.
1452
+ string1 = proto1.SerializeToString()
1453
+ string2 = proto2.SerializeToString()
1454
+ self.assertEqual(string1, string2)
1455
+
1456
+ def testCopyFromSelf(self):
1457
+ proto1 = unittest_pb2.TestAllTypes()
1458
+ proto1.repeated_int32.append(1)
1459
+ proto1.optional_int32 = 2
1460
+ proto1.optional_string = 'important-text'
1461
+
1462
+ proto1.CopyFrom(proto1)
1463
+ self.assertEqual(1, proto1.repeated_int32[0])
1464
+ self.assertEqual(2, proto1.optional_int32)
1465
+ self.assertEqual('important-text', proto1.optional_string)
1466
+
1467
+ def testCopyFromBadType(self):
1468
+ # The python implementation doesn't raise an exception in this
1469
+ # case. In theory it should.
1470
+ if api_implementation.Type() == 'python':
1471
+ return
1472
+ proto1 = unittest_pb2.TestAllTypes()
1473
+ proto2 = unittest_pb2.TestAllExtensions()
1474
+ self.assertRaises(TypeError, proto1.CopyFrom, proto2)
1475
+
1476
+ def testDeepCopy(self):
1477
+ proto1 = unittest_pb2.TestAllTypes()
1478
+ proto1.optional_int32 = 1
1479
+ proto2 = copy.deepcopy(proto1)
1480
+ self.assertEqual(1, proto2.optional_int32)
1481
+
1482
+ proto1.repeated_int32.append(2)
1483
+ proto1.repeated_int32.append(3)
1484
+ container = copy.deepcopy(proto1.repeated_int32)
1485
+ self.assertEqual([2, 3], container)
1486
+
1487
+ # TODO(anuraag): Implement deepcopy for repeated composite / extension dict
1488
+
1489
+ def testClear(self):
1490
+ proto = unittest_pb2.TestAllTypes()
1491
+ # C++ implementation does not support lazy fields right now so leave it
1492
+ # out for now.
1493
+ if api_implementation.Type() == 'python':
1494
+ test_util.SetAllFields(proto)
1495
+ else:
1496
+ test_util.SetAllNonLazyFields(proto)
1497
+ # Clear the message.
1498
+ proto.Clear()
1499
+ self.assertEquals(proto.ByteSize(), 0)
1500
+ empty_proto = unittest_pb2.TestAllTypes()
1501
+ self.assertEquals(proto, empty_proto)
1502
+
1503
+ # Test if extensions which were set are cleared.
1504
+ proto = unittest_pb2.TestAllExtensions()
1505
+ test_util.SetAllExtensions(proto)
1506
+ # Clear the message.
1507
+ proto.Clear()
1508
+ self.assertEquals(proto.ByteSize(), 0)
1509
+ empty_proto = unittest_pb2.TestAllExtensions()
1510
+ self.assertEquals(proto, empty_proto)
1511
+
1512
+ def testDisconnectingBeforeClear(self):
1513
+ proto = unittest_pb2.TestAllTypes()
1514
+ nested = proto.optional_nested_message
1515
+ proto.Clear()
1516
+ self.assertTrue(nested is not proto.optional_nested_message)
1517
+ nested.bb = 23
1518
+ self.assertTrue(not proto.HasField('optional_nested_message'))
1519
+ self.assertEqual(0, proto.optional_nested_message.bb)
1520
+
1521
+ proto = unittest_pb2.TestAllTypes()
1522
+ nested = proto.optional_nested_message
1523
+ nested.bb = 5
1524
+ foreign = proto.optional_foreign_message
1525
+ foreign.c = 6
1526
+
1527
+ proto.Clear()
1528
+ self.assertTrue(nested is not proto.optional_nested_message)
1529
+ self.assertTrue(foreign is not proto.optional_foreign_message)
1530
+ self.assertEqual(5, nested.bb)
1531
+ self.assertEqual(6, foreign.c)
1532
+ nested.bb = 15
1533
+ foreign.c = 16
1534
+ self.assertFalse(proto.HasField('optional_nested_message'))
1535
+ self.assertEqual(0, proto.optional_nested_message.bb)
1536
+ self.assertFalse(proto.HasField('optional_foreign_message'))
1537
+ self.assertEqual(0, proto.optional_foreign_message.c)
1538
+
1539
+ def testOneOf(self):
1540
+ proto = unittest_pb2.TestAllTypes()
1541
+ proto.oneof_uint32 = 10
1542
+ proto.oneof_nested_message.bb = 11
1543
+ self.assertEqual(11, proto.oneof_nested_message.bb)
1544
+ self.assertFalse(proto.HasField('oneof_uint32'))
1545
+ nested = proto.oneof_nested_message
1546
+ proto.oneof_string = 'abc'
1547
+ self.assertEqual('abc', proto.oneof_string)
1548
+ self.assertEqual(11, nested.bb)
1549
+ self.assertFalse(proto.HasField('oneof_nested_message'))
1550
+
1551
+ def assertInitialized(self, proto):
1552
+ self.assertTrue(proto.IsInitialized())
1553
+ # Neither method should raise an exception.
1554
+ proto.SerializeToString()
1555
+ proto.SerializePartialToString()
1556
+
1557
+ def assertNotInitialized(self, proto):
1558
+ self.assertFalse(proto.IsInitialized())
1559
+ self.assertRaises(message.EncodeError, proto.SerializeToString)
1560
+ # "Partial" serialization doesn't care if message is uninitialized.
1561
+ proto.SerializePartialToString()
1562
+
1563
+ def testIsInitialized(self):
1564
+ # Trivial cases - all optional fields and extensions.
1565
+ proto = unittest_pb2.TestAllTypes()
1566
+ self.assertInitialized(proto)
1567
+ proto = unittest_pb2.TestAllExtensions()
1568
+ self.assertInitialized(proto)
1569
+
1570
+ # The case of uninitialized required fields.
1571
+ proto = unittest_pb2.TestRequired()
1572
+ self.assertNotInitialized(proto)
1573
+ proto.a = proto.b = proto.c = 2
1574
+ self.assertInitialized(proto)
1575
+
1576
+ # The case of uninitialized submessage.
1577
+ proto = unittest_pb2.TestRequiredForeign()
1578
+ self.assertInitialized(proto)
1579
+ proto.optional_message.a = 1
1580
+ self.assertNotInitialized(proto)
1581
+ proto.optional_message.b = 0
1582
+ proto.optional_message.c = 0
1583
+ self.assertInitialized(proto)
1584
+
1585
+ # Uninitialized repeated submessage.
1586
+ message1 = proto.repeated_message.add()
1587
+ self.assertNotInitialized(proto)
1588
+ message1.a = message1.b = message1.c = 0
1589
+ self.assertInitialized(proto)
1590
+
1591
+ # Uninitialized repeated group in an extension.
1592
+ proto = unittest_pb2.TestAllExtensions()
1593
+ extension = unittest_pb2.TestRequired.multi
1594
+ message1 = proto.Extensions[extension].add()
1595
+ message2 = proto.Extensions[extension].add()
1596
+ self.assertNotInitialized(proto)
1597
+ message1.a = 1
1598
+ message1.b = 1
1599
+ message1.c = 1
1600
+ self.assertNotInitialized(proto)
1601
+ message2.a = 2
1602
+ message2.b = 2
1603
+ message2.c = 2
1604
+ self.assertInitialized(proto)
1605
+
1606
+ # Uninitialized nonrepeated message in an extension.
1607
+ proto = unittest_pb2.TestAllExtensions()
1608
+ extension = unittest_pb2.TestRequired.single
1609
+ proto.Extensions[extension].a = 1
1610
+ self.assertNotInitialized(proto)
1611
+ proto.Extensions[extension].b = 2
1612
+ proto.Extensions[extension].c = 3
1613
+ self.assertInitialized(proto)
1614
+
1615
+ # Try passing an errors list.
1616
+ errors = []
1617
+ proto = unittest_pb2.TestRequired()
1618
+ self.assertFalse(proto.IsInitialized(errors))
1619
+ self.assertEqual(errors, ['a', 'b', 'c'])
1620
+
1621
+ @basetest.unittest.skipIf(
1622
+ api_implementation.Type() != 'cpp' or api_implementation.Version() != 2,
1623
+ 'Errors are only available from the most recent C++ implementation.')
1624
+ def testFileDescriptorErrors(self):
1625
+ file_name = 'test_file_descriptor_errors.proto'
1626
+ package_name = 'test_file_descriptor_errors.proto'
1627
+ file_descriptor_proto = descriptor_pb2.FileDescriptorProto()
1628
+ file_descriptor_proto.name = file_name
1629
+ file_descriptor_proto.package = package_name
1630
+ m1 = file_descriptor_proto.message_type.add()
1631
+ m1.name = 'msg1'
1632
+ # Compiles the proto into the C++ descriptor pool
1633
+ descriptor.FileDescriptor(
1634
+ file_name,
1635
+ package_name,
1636
+ serialized_pb=file_descriptor_proto.SerializeToString())
1637
+ # Add a FileDescriptorProto that has duplicate symbols
1638
+ another_file_name = 'another_test_file_descriptor_errors.proto'
1639
+ file_descriptor_proto.name = another_file_name
1640
+ m2 = file_descriptor_proto.message_type.add()
1641
+ m2.name = 'msg2'
1642
+ with self.assertRaises(TypeError) as cm:
1643
+ descriptor.FileDescriptor(
1644
+ another_file_name,
1645
+ package_name,
1646
+ serialized_pb=file_descriptor_proto.SerializeToString())
1647
+ self.assertTrue(hasattr(cm, 'exception'), '%s not raised' %
1648
+ getattr(cm.expected, '__name__', cm.expected))
1649
+ self.assertIn('test_file_descriptor_errors.proto', str(cm.exception))
1650
+ # Error message will say something about this definition being a
1651
+ # duplicate, though we don't check the message exactly to avoid a
1652
+ # dependency on the C++ logging code.
1653
+ self.assertIn('test_file_descriptor_errors.msg1', str(cm.exception))
1654
+
1655
+ def testStringUTF8Encoding(self):
1656
+ proto = unittest_pb2.TestAllTypes()
1657
+
1658
+ # Assignment of a unicode object to a field of type 'bytes' is not allowed.
1659
+ self.assertRaises(TypeError,
1660
+ setattr, proto, 'optional_bytes', u'unicode object')
1661
+
1662
+ # Check that the default value is of python's 'unicode' type.
1663
+ self.assertEqual(type(proto.optional_string), unicode)
1664
+
1665
+ proto.optional_string = unicode('Testing')
1666
+ self.assertEqual(proto.optional_string, str('Testing'))
1667
+
1668
+ # Assign a value of type 'str' which can be encoded in UTF-8.
1669
+ proto.optional_string = str('Testing')
1670
+ self.assertEqual(proto.optional_string, unicode('Testing'))
1671
+
1672
+ # Try to assign a 'str' value which contains bytes that aren't 7-bit ASCII.
1673
+ self.assertRaises(ValueError,
1674
+ setattr, proto, 'optional_string', b'a\x80a')
1675
+ if str is bytes: # PY2
1676
+ # Assign a 'str' object which contains a UTF-8 encoded string.
1677
+ self.assertRaises(ValueError,
1678
+ setattr, proto, 'optional_string', 'Тест')
1679
+ else:
1680
+ proto.optional_string = 'Тест'
1681
+ # No exception thrown.
1682
+ proto.optional_string = 'abc'
1683
+
1684
+ def testStringUTF8Serialization(self):
1685
+ proto = unittest_mset_pb2.TestMessageSet()
1686
+ extension_message = unittest_mset_pb2.TestMessageSetExtension2
1687
+ extension = extension_message.message_set_extension
1688
+
1689
+ test_utf8 = u'Тест'
1690
+ test_utf8_bytes = test_utf8.encode('utf-8')
1691
+
1692
+ # 'Test' in another language, using UTF-8 charset.
1693
+ proto.Extensions[extension].str = test_utf8
1694
+
1695
+ # Serialize using the MessageSet wire format (this is specified in the
1696
+ # .proto file).
1697
+ serialized = proto.SerializeToString()
1698
+
1699
+ # Check byte size.
1700
+ self.assertEqual(proto.ByteSize(), len(serialized))
1701
+
1702
+ raw = unittest_mset_pb2.RawMessageSet()
1703
+ bytes_read = raw.MergeFromString(serialized)
1704
+ self.assertEqual(len(serialized), bytes_read)
1705
+
1706
+ message2 = unittest_mset_pb2.TestMessageSetExtension2()
1707
+
1708
+ self.assertEqual(1, len(raw.item))
1709
+ # Check that the type_id is the same as the tag ID in the .proto file.
1710
+ self.assertEqual(raw.item[0].type_id, 1547769)
1711
+
1712
+ # Check the actual bytes on the wire.
1713
+ self.assertTrue(
1714
+ raw.item[0].message.endswith(test_utf8_bytes))
1715
+ bytes_read = message2.MergeFromString(raw.item[0].message)
1716
+ self.assertEqual(len(raw.item[0].message), bytes_read)
1717
+
1718
+ self.assertEqual(type(message2.str), unicode)
1719
+ self.assertEqual(message2.str, test_utf8)
1720
+
1721
+ # The pure Python API throws an exception on MergeFromString(),
1722
+ # if any of the string fields of the message can't be UTF-8 decoded.
1723
+ # The C++ implementation of the API has no way to check that on
1724
+ # MergeFromString and thus has no way to throw the exception.
1725
+ #
1726
+ # The pure Python API always returns objects of type 'unicode' (UTF-8
1727
+ # encoded), or 'bytes' (in 7 bit ASCII).
1728
+ badbytes = raw.item[0].message.replace(
1729
+ test_utf8_bytes, len(test_utf8_bytes) * b'\xff')
1730
+
1731
+ unicode_decode_failed = False
1732
+ try:
1733
+ message2.MergeFromString(badbytes)
1734
+ except UnicodeDecodeError:
1735
+ unicode_decode_failed = True
1736
+ string_field = message2.str
1737
+ self.assertTrue(unicode_decode_failed or type(string_field) is bytes)
1738
+
1739
+ def testBytesInTextFormat(self):
1740
+ proto = unittest_pb2.TestAllTypes(optional_bytes=b'\x00\x7f\x80\xff')
1741
+ self.assertEqual(u'optional_bytes: "\\000\\177\\200\\377"\n',
1742
+ unicode(proto))
1743
+
1744
+ def testEmptyNestedMessage(self):
1745
+ proto = unittest_pb2.TestAllTypes()
1746
+ proto.optional_nested_message.MergeFrom(
1747
+ unittest_pb2.TestAllTypes.NestedMessage())
1748
+ self.assertTrue(proto.HasField('optional_nested_message'))
1749
+
1750
+ proto = unittest_pb2.TestAllTypes()
1751
+ proto.optional_nested_message.CopyFrom(
1752
+ unittest_pb2.TestAllTypes.NestedMessage())
1753
+ self.assertTrue(proto.HasField('optional_nested_message'))
1754
+
1755
+ proto = unittest_pb2.TestAllTypes()
1756
+ bytes_read = proto.optional_nested_message.MergeFromString(b'')
1757
+ self.assertEqual(0, bytes_read)
1758
+ self.assertTrue(proto.HasField('optional_nested_message'))
1759
+
1760
+ proto = unittest_pb2.TestAllTypes()
1761
+ proto.optional_nested_message.ParseFromString(b'')
1762
+ self.assertTrue(proto.HasField('optional_nested_message'))
1763
+
1764
+ serialized = proto.SerializeToString()
1765
+ proto2 = unittest_pb2.TestAllTypes()
1766
+ self.assertEqual(
1767
+ len(serialized),
1768
+ proto2.MergeFromString(serialized))
1769
+ self.assertTrue(proto2.HasField('optional_nested_message'))
1770
+
1771
+ def testSetInParent(self):
1772
+ proto = unittest_pb2.TestAllTypes()
1773
+ self.assertFalse(proto.HasField('optionalgroup'))
1774
+ proto.optionalgroup.SetInParent()
1775
+ self.assertTrue(proto.HasField('optionalgroup'))
1776
+
1777
+
1778
+ # Since we had so many tests for protocol buffer equality, we broke these out
1779
+ # into separate TestCase classes.
1780
+
1781
+
1782
+ class TestAllTypesEqualityTest(basetest.TestCase):
1783
+
1784
+ def setUp(self):
1785
+ self.first_proto = unittest_pb2.TestAllTypes()
1786
+ self.second_proto = unittest_pb2.TestAllTypes()
1787
+
1788
+ def testNotHashable(self):
1789
+ self.assertRaises(TypeError, hash, self.first_proto)
1790
+
1791
+ def testSelfEquality(self):
1792
+ self.assertEqual(self.first_proto, self.first_proto)
1793
+
1794
+ def testEmptyProtosEqual(self):
1795
+ self.assertEqual(self.first_proto, self.second_proto)
1796
+
1797
+
1798
+ class FullProtosEqualityTest(basetest.TestCase):
1799
+
1800
+ """Equality tests using completely-full protos as a starting point."""
1801
+
1802
+ def setUp(self):
1803
+ self.first_proto = unittest_pb2.TestAllTypes()
1804
+ self.second_proto = unittest_pb2.TestAllTypes()
1805
+ test_util.SetAllFields(self.first_proto)
1806
+ test_util.SetAllFields(self.second_proto)
1807
+
1808
+ def testNotHashable(self):
1809
+ self.assertRaises(TypeError, hash, self.first_proto)
1810
+
1811
+ def testNoneNotEqual(self):
1812
+ self.assertNotEqual(self.first_proto, None)
1813
+ self.assertNotEqual(None, self.second_proto)
1814
+
1815
+ def testNotEqualToOtherMessage(self):
1816
+ third_proto = unittest_pb2.TestRequired()
1817
+ self.assertNotEqual(self.first_proto, third_proto)
1818
+ self.assertNotEqual(third_proto, self.second_proto)
1819
+
1820
+ def testAllFieldsFilledEquality(self):
1821
+ self.assertEqual(self.first_proto, self.second_proto)
1822
+
1823
+ def testNonRepeatedScalar(self):
1824
+ # Nonrepeated scalar field change should cause inequality.
1825
+ self.first_proto.optional_int32 += 1
1826
+ self.assertNotEqual(self.first_proto, self.second_proto)
1827
+ # ...as should clearing a field.
1828
+ self.first_proto.ClearField('optional_int32')
1829
+ self.assertNotEqual(self.first_proto, self.second_proto)
1830
+
1831
+ def testNonRepeatedComposite(self):
1832
+ # Change a nonrepeated composite field.
1833
+ self.first_proto.optional_nested_message.bb += 1
1834
+ self.assertNotEqual(self.first_proto, self.second_proto)
1835
+ self.first_proto.optional_nested_message.bb -= 1
1836
+ self.assertEqual(self.first_proto, self.second_proto)
1837
+ # Clear a field in the nested message.
1838
+ self.first_proto.optional_nested_message.ClearField('bb')
1839
+ self.assertNotEqual(self.first_proto, self.second_proto)
1840
+ self.first_proto.optional_nested_message.bb = (
1841
+ self.second_proto.optional_nested_message.bb)
1842
+ self.assertEqual(self.first_proto, self.second_proto)
1843
+ # Remove the nested message entirely.
1844
+ self.first_proto.ClearField('optional_nested_message')
1845
+ self.assertNotEqual(self.first_proto, self.second_proto)
1846
+
1847
+ def testRepeatedScalar(self):
1848
+ # Change a repeated scalar field.
1849
+ self.first_proto.repeated_int32.append(5)
1850
+ self.assertNotEqual(self.first_proto, self.second_proto)
1851
+ self.first_proto.ClearField('repeated_int32')
1852
+ self.assertNotEqual(self.first_proto, self.second_proto)
1853
+
1854
+ def testRepeatedComposite(self):
1855
+ # Change value within a repeated composite field.
1856
+ self.first_proto.repeated_nested_message[0].bb += 1
1857
+ self.assertNotEqual(self.first_proto, self.second_proto)
1858
+ self.first_proto.repeated_nested_message[0].bb -= 1
1859
+ self.assertEqual(self.first_proto, self.second_proto)
1860
+ # Add a value to a repeated composite field.
1861
+ self.first_proto.repeated_nested_message.add()
1862
+ self.assertNotEqual(self.first_proto, self.second_proto)
1863
+ self.second_proto.repeated_nested_message.add()
1864
+ self.assertEqual(self.first_proto, self.second_proto)
1865
+
1866
+ def testNonRepeatedScalarHasBits(self):
1867
+ # Ensure that we test "has" bits as well as value for
1868
+ # nonrepeated scalar field.
1869
+ self.first_proto.ClearField('optional_int32')
1870
+ self.second_proto.optional_int32 = 0
1871
+ self.assertNotEqual(self.first_proto, self.second_proto)
1872
+
1873
+ def testNonRepeatedCompositeHasBits(self):
1874
+ # Ensure that we test "has" bits as well as value for
1875
+ # nonrepeated composite field.
1876
+ self.first_proto.ClearField('optional_nested_message')
1877
+ self.second_proto.optional_nested_message.ClearField('bb')
1878
+ self.assertNotEqual(self.first_proto, self.second_proto)
1879
+ self.first_proto.optional_nested_message.bb = 0
1880
+ self.first_proto.optional_nested_message.ClearField('bb')
1881
+ self.assertEqual(self.first_proto, self.second_proto)
1882
+
1883
+
1884
+ class ExtensionEqualityTest(basetest.TestCase):
1885
+
1886
+ def testExtensionEquality(self):
1887
+ first_proto = unittest_pb2.TestAllExtensions()
1888
+ second_proto = unittest_pb2.TestAllExtensions()
1889
+ self.assertEqual(first_proto, second_proto)
1890
+ test_util.SetAllExtensions(first_proto)
1891
+ self.assertNotEqual(first_proto, second_proto)
1892
+ test_util.SetAllExtensions(second_proto)
1893
+ self.assertEqual(first_proto, second_proto)
1894
+
1895
+ # Ensure that we check value equality.
1896
+ first_proto.Extensions[unittest_pb2.optional_int32_extension] += 1
1897
+ self.assertNotEqual(first_proto, second_proto)
1898
+ first_proto.Extensions[unittest_pb2.optional_int32_extension] -= 1
1899
+ self.assertEqual(first_proto, second_proto)
1900
+
1901
+ # Ensure that we also look at "has" bits.
1902
+ first_proto.ClearExtension(unittest_pb2.optional_int32_extension)
1903
+ second_proto.Extensions[unittest_pb2.optional_int32_extension] = 0
1904
+ self.assertNotEqual(first_proto, second_proto)
1905
+ first_proto.Extensions[unittest_pb2.optional_int32_extension] = 0
1906
+ self.assertEqual(first_proto, second_proto)
1907
+
1908
+ # Ensure that differences in cached values
1909
+ # don't matter if "has" bits are both false.
1910
+ first_proto = unittest_pb2.TestAllExtensions()
1911
+ second_proto = unittest_pb2.TestAllExtensions()
1912
+ self.assertEqual(
1913
+ 0, first_proto.Extensions[unittest_pb2.optional_int32_extension])
1914
+ self.assertEqual(first_proto, second_proto)
1915
+
1916
+
1917
+ class MutualRecursionEqualityTest(basetest.TestCase):
1918
+
1919
+ def testEqualityWithMutualRecursion(self):
1920
+ first_proto = unittest_pb2.TestMutualRecursionA()
1921
+ second_proto = unittest_pb2.TestMutualRecursionA()
1922
+ self.assertEqual(first_proto, second_proto)
1923
+ first_proto.bb.a.bb.optional_int32 = 23
1924
+ self.assertNotEqual(first_proto, second_proto)
1925
+ second_proto.bb.a.bb.optional_int32 = 23
1926
+ self.assertEqual(first_proto, second_proto)
1927
+
1928
+
1929
+ class ByteSizeTest(basetest.TestCase):
1930
+
1931
+ def setUp(self):
1932
+ self.proto = unittest_pb2.TestAllTypes()
1933
+ self.extended_proto = more_extensions_pb2.ExtendedMessage()
1934
+ self.packed_proto = unittest_pb2.TestPackedTypes()
1935
+ self.packed_extended_proto = unittest_pb2.TestPackedExtensions()
1936
+
1937
+ def Size(self):
1938
+ return self.proto.ByteSize()
1939
+
1940
+ def testEmptyMessage(self):
1941
+ self.assertEqual(0, self.proto.ByteSize())
1942
+
1943
+ def testSizedOnKwargs(self):
1944
+ # Use a separate message to ensure testing right after creation.
1945
+ proto = unittest_pb2.TestAllTypes()
1946
+ self.assertEqual(0, proto.ByteSize())
1947
+ proto_kwargs = unittest_pb2.TestAllTypes(optional_int64 = 1)
1948
+ # One byte for the tag, one to encode varint 1.
1949
+ self.assertEqual(2, proto_kwargs.ByteSize())
1950
+
1951
+ def testVarints(self):
1952
+ def Test(i, expected_varint_size):
1953
+ self.proto.Clear()
1954
+ self.proto.optional_int64 = i
1955
+ # Add one to the varint size for the tag info
1956
+ # for tag 1.
1957
+ self.assertEqual(expected_varint_size + 1, self.Size())
1958
+ Test(0, 1)
1959
+ Test(1, 1)
1960
+ for i, num_bytes in zip(range(7, 63, 7), range(1, 10000)):
1961
+ Test((1 << i) - 1, num_bytes)
1962
+ Test(-1, 10)
1963
+ Test(-2, 10)
1964
+ Test(-(1 << 63), 10)
1965
+
1966
+ def testStrings(self):
1967
+ self.proto.optional_string = ''
1968
+ # Need one byte for tag info (tag #14), and one byte for length.
1969
+ self.assertEqual(2, self.Size())
1970
+
1971
+ self.proto.optional_string = 'abc'
1972
+ # Need one byte for tag info (tag #14), and one byte for length.
1973
+ self.assertEqual(2 + len(self.proto.optional_string), self.Size())
1974
+
1975
+ self.proto.optional_string = 'x' * 128
1976
+ # Need one byte for tag info (tag #14), and TWO bytes for length.
1977
+ self.assertEqual(3 + len(self.proto.optional_string), self.Size())
1978
+
1979
+ def testOtherNumerics(self):
1980
+ self.proto.optional_fixed32 = 1234
1981
+ # One byte for tag and 4 bytes for fixed32.
1982
+ self.assertEqual(5, self.Size())
1983
+ self.proto = unittest_pb2.TestAllTypes()
1984
+
1985
+ self.proto.optional_fixed64 = 1234
1986
+ # One byte for tag and 8 bytes for fixed64.
1987
+ self.assertEqual(9, self.Size())
1988
+ self.proto = unittest_pb2.TestAllTypes()
1989
+
1990
+ self.proto.optional_float = 1.234
1991
+ # One byte for tag and 4 bytes for float.
1992
+ self.assertEqual(5, self.Size())
1993
+ self.proto = unittest_pb2.TestAllTypes()
1994
+
1995
+ self.proto.optional_double = 1.234
1996
+ # One byte for tag and 8 bytes for float.
1997
+ self.assertEqual(9, self.Size())
1998
+ self.proto = unittest_pb2.TestAllTypes()
1999
+
2000
+ self.proto.optional_sint32 = 64
2001
+ # One byte for tag and 2 bytes for zig-zag-encoded 64.
2002
+ self.assertEqual(3, self.Size())
2003
+ self.proto = unittest_pb2.TestAllTypes()
2004
+
2005
+ def testComposites(self):
2006
+ # 3 bytes.
2007
+ self.proto.optional_nested_message.bb = (1 << 14)
2008
+ # Plus one byte for bb tag.
2009
+ # Plus 1 byte for optional_nested_message serialized size.
2010
+ # Plus two bytes for optional_nested_message tag.
2011
+ self.assertEqual(3 + 1 + 1 + 2, self.Size())
2012
+
2013
+ def testGroups(self):
2014
+ # 4 bytes.
2015
+ self.proto.optionalgroup.a = (1 << 21)
2016
+ # Plus two bytes for |a| tag.
2017
+ # Plus 2 * two bytes for START_GROUP and END_GROUP tags.
2018
+ self.assertEqual(4 + 2 + 2*2, self.Size())
2019
+
2020
+ def testRepeatedScalars(self):
2021
+ self.proto.repeated_int32.append(10) # 1 byte.
2022
+ self.proto.repeated_int32.append(128) # 2 bytes.
2023
+ # Also need 2 bytes for each entry for tag.
2024
+ self.assertEqual(1 + 2 + 2*2, self.Size())
2025
+
2026
+ def testRepeatedScalarsExtend(self):
2027
+ self.proto.repeated_int32.extend([10, 128]) # 3 bytes.
2028
+ # Also need 2 bytes for each entry for tag.
2029
+ self.assertEqual(1 + 2 + 2*2, self.Size())
2030
+
2031
+ def testRepeatedScalarsRemove(self):
2032
+ self.proto.repeated_int32.append(10) # 1 byte.
2033
+ self.proto.repeated_int32.append(128) # 2 bytes.
2034
+ # Also need 2 bytes for each entry for tag.
2035
+ self.assertEqual(1 + 2 + 2*2, self.Size())
2036
+ self.proto.repeated_int32.remove(128)
2037
+ self.assertEqual(1 + 2, self.Size())
2038
+
2039
+ def testRepeatedComposites(self):
2040
+ # Empty message. 2 bytes tag plus 1 byte length.
2041
+ foreign_message_0 = self.proto.repeated_nested_message.add()
2042
+ # 2 bytes tag plus 1 byte length plus 1 byte bb tag 1 byte int.
2043
+ foreign_message_1 = self.proto.repeated_nested_message.add()
2044
+ foreign_message_1.bb = 7
2045
+ self.assertEqual(2 + 1 + 2 + 1 + 1 + 1, self.Size())
2046
+
2047
+ def testRepeatedCompositesDelete(self):
2048
+ # Empty message. 2 bytes tag plus 1 byte length.
2049
+ foreign_message_0 = self.proto.repeated_nested_message.add()
2050
+ # 2 bytes tag plus 1 byte length plus 1 byte bb tag 1 byte int.
2051
+ foreign_message_1 = self.proto.repeated_nested_message.add()
2052
+ foreign_message_1.bb = 9
2053
+ self.assertEqual(2 + 1 + 2 + 1 + 1 + 1, self.Size())
2054
+
2055
+ # 2 bytes tag plus 1 byte length plus 1 byte bb tag 1 byte int.
2056
+ del self.proto.repeated_nested_message[0]
2057
+ self.assertEqual(2 + 1 + 1 + 1, self.Size())
2058
+
2059
+ # Now add a new message.
2060
+ foreign_message_2 = self.proto.repeated_nested_message.add()
2061
+ foreign_message_2.bb = 12
2062
+
2063
+ # 2 bytes tag plus 1 byte length plus 1 byte bb tag 1 byte int.
2064
+ # 2 bytes tag plus 1 byte length plus 1 byte bb tag 1 byte int.
2065
+ self.assertEqual(2 + 1 + 1 + 1 + 2 + 1 + 1 + 1, self.Size())
2066
+
2067
+ # 2 bytes tag plus 1 byte length plus 1 byte bb tag 1 byte int.
2068
+ del self.proto.repeated_nested_message[1]
2069
+ self.assertEqual(2 + 1 + 1 + 1, self.Size())
2070
+
2071
+ del self.proto.repeated_nested_message[0]
2072
+ self.assertEqual(0, self.Size())
2073
+
2074
+ def testRepeatedGroups(self):
2075
+ # 2-byte START_GROUP plus 2-byte END_GROUP.
2076
+ group_0 = self.proto.repeatedgroup.add()
2077
+ # 2-byte START_GROUP plus 2-byte |a| tag + 1-byte |a|
2078
+ # plus 2-byte END_GROUP.
2079
+ group_1 = self.proto.repeatedgroup.add()
2080
+ group_1.a = 7
2081
+ self.assertEqual(2 + 2 + 2 + 2 + 1 + 2, self.Size())
2082
+
2083
+ def testExtensions(self):
2084
+ proto = unittest_pb2.TestAllExtensions()
2085
+ self.assertEqual(0, proto.ByteSize())
2086
+ extension = unittest_pb2.optional_int32_extension # Field #1, 1 byte.
2087
+ proto.Extensions[extension] = 23
2088
+ # 1 byte for tag, 1 byte for value.
2089
+ self.assertEqual(2, proto.ByteSize())
2090
+
2091
+ def testCacheInvalidationForNonrepeatedScalar(self):
2092
+ # Test non-extension.
2093
+ self.proto.optional_int32 = 1
2094
+ self.assertEqual(2, self.proto.ByteSize())
2095
+ self.proto.optional_int32 = 128
2096
+ self.assertEqual(3, self.proto.ByteSize())
2097
+ self.proto.ClearField('optional_int32')
2098
+ self.assertEqual(0, self.proto.ByteSize())
2099
+
2100
+ # Test within extension.
2101
+ extension = more_extensions_pb2.optional_int_extension
2102
+ self.extended_proto.Extensions[extension] = 1
2103
+ self.assertEqual(2, self.extended_proto.ByteSize())
2104
+ self.extended_proto.Extensions[extension] = 128
2105
+ self.assertEqual(3, self.extended_proto.ByteSize())
2106
+ self.extended_proto.ClearExtension(extension)
2107
+ self.assertEqual(0, self.extended_proto.ByteSize())
2108
+
2109
+ def testCacheInvalidationForRepeatedScalar(self):
2110
+ # Test non-extension.
2111
+ self.proto.repeated_int32.append(1)
2112
+ self.assertEqual(3, self.proto.ByteSize())
2113
+ self.proto.repeated_int32.append(1)
2114
+ self.assertEqual(6, self.proto.ByteSize())
2115
+ self.proto.repeated_int32[1] = 128
2116
+ self.assertEqual(7, self.proto.ByteSize())
2117
+ self.proto.ClearField('repeated_int32')
2118
+ self.assertEqual(0, self.proto.ByteSize())
2119
+
2120
+ # Test within extension.
2121
+ extension = more_extensions_pb2.repeated_int_extension
2122
+ repeated = self.extended_proto.Extensions[extension]
2123
+ repeated.append(1)
2124
+ self.assertEqual(2, self.extended_proto.ByteSize())
2125
+ repeated.append(1)
2126
+ self.assertEqual(4, self.extended_proto.ByteSize())
2127
+ repeated[1] = 128
2128
+ self.assertEqual(5, self.extended_proto.ByteSize())
2129
+ self.extended_proto.ClearExtension(extension)
2130
+ self.assertEqual(0, self.extended_proto.ByteSize())
2131
+
2132
+ def testCacheInvalidationForNonrepeatedMessage(self):
2133
+ # Test non-extension.
2134
+ self.proto.optional_foreign_message.c = 1
2135
+ self.assertEqual(5, self.proto.ByteSize())
2136
+ self.proto.optional_foreign_message.c = 128
2137
+ self.assertEqual(6, self.proto.ByteSize())
2138
+ self.proto.optional_foreign_message.ClearField('c')
2139
+ self.assertEqual(3, self.proto.ByteSize())
2140
+ self.proto.ClearField('optional_foreign_message')
2141
+ self.assertEqual(0, self.proto.ByteSize())
2142
+
2143
+ if api_implementation.Type() == 'python':
2144
+ # This is only possible in pure-Python implementation of the API.
2145
+ child = self.proto.optional_foreign_message
2146
+ self.proto.ClearField('optional_foreign_message')
2147
+ child.c = 128
2148
+ self.assertEqual(0, self.proto.ByteSize())
2149
+
2150
+ # Test within extension.
2151
+ extension = more_extensions_pb2.optional_message_extension
2152
+ child = self.extended_proto.Extensions[extension]
2153
+ self.assertEqual(0, self.extended_proto.ByteSize())
2154
+ child.foreign_message_int = 1
2155
+ self.assertEqual(4, self.extended_proto.ByteSize())
2156
+ child.foreign_message_int = 128
2157
+ self.assertEqual(5, self.extended_proto.ByteSize())
2158
+ self.extended_proto.ClearExtension(extension)
2159
+ self.assertEqual(0, self.extended_proto.ByteSize())
2160
+
2161
+ def testCacheInvalidationForRepeatedMessage(self):
2162
+ # Test non-extension.
2163
+ child0 = self.proto.repeated_foreign_message.add()
2164
+ self.assertEqual(3, self.proto.ByteSize())
2165
+ self.proto.repeated_foreign_message.add()
2166
+ self.assertEqual(6, self.proto.ByteSize())
2167
+ child0.c = 1
2168
+ self.assertEqual(8, self.proto.ByteSize())
2169
+ self.proto.ClearField('repeated_foreign_message')
2170
+ self.assertEqual(0, self.proto.ByteSize())
2171
+
2172
+ # Test within extension.
2173
+ extension = more_extensions_pb2.repeated_message_extension
2174
+ child_list = self.extended_proto.Extensions[extension]
2175
+ child0 = child_list.add()
2176
+ self.assertEqual(2, self.extended_proto.ByteSize())
2177
+ child_list.add()
2178
+ self.assertEqual(4, self.extended_proto.ByteSize())
2179
+ child0.foreign_message_int = 1
2180
+ self.assertEqual(6, self.extended_proto.ByteSize())
2181
+ child0.ClearField('foreign_message_int')
2182
+ self.assertEqual(4, self.extended_proto.ByteSize())
2183
+ self.extended_proto.ClearExtension(extension)
2184
+ self.assertEqual(0, self.extended_proto.ByteSize())
2185
+
2186
+ def testPackedRepeatedScalars(self):
2187
+ self.assertEqual(0, self.packed_proto.ByteSize())
2188
+
2189
+ self.packed_proto.packed_int32.append(10) # 1 byte.
2190
+ self.packed_proto.packed_int32.append(128) # 2 bytes.
2191
+ # The tag is 2 bytes (the field number is 90), and the varint
2192
+ # storing the length is 1 byte.
2193
+ int_size = 1 + 2 + 3
2194
+ self.assertEqual(int_size, self.packed_proto.ByteSize())
2195
+
2196
+ self.packed_proto.packed_double.append(4.2) # 8 bytes
2197
+ self.packed_proto.packed_double.append(3.25) # 8 bytes
2198
+ # 2 more tag bytes, 1 more length byte.
2199
+ double_size = 8 + 8 + 3
2200
+ self.assertEqual(int_size+double_size, self.packed_proto.ByteSize())
2201
+
2202
+ self.packed_proto.ClearField('packed_int32')
2203
+ self.assertEqual(double_size, self.packed_proto.ByteSize())
2204
+
2205
+ def testPackedExtensions(self):
2206
+ self.assertEqual(0, self.packed_extended_proto.ByteSize())
2207
+ extension = self.packed_extended_proto.Extensions[
2208
+ unittest_pb2.packed_fixed32_extension]
2209
+ extension.extend([1, 2, 3, 4]) # 16 bytes
2210
+ # Tag is 3 bytes.
2211
+ self.assertEqual(19, self.packed_extended_proto.ByteSize())
2212
+
2213
+
2214
+ # Issues to be sure to cover include:
2215
+ # * Handling of unrecognized tags ("uninterpreted_bytes").
2216
+ # * Handling of MessageSets.
2217
+ # * Consistent ordering of tags in the wire format,
2218
+ # including ordering between extensions and non-extension
2219
+ # fields.
2220
+ # * Consistent serialization of negative numbers, especially
2221
+ # negative int32s.
2222
+ # * Handling of empty submessages (with and without "has"
2223
+ # bits set).
2224
+
2225
+ class SerializationTest(basetest.TestCase):
2226
+
2227
+ def testSerializeEmtpyMessage(self):
2228
+ first_proto = unittest_pb2.TestAllTypes()
2229
+ second_proto = unittest_pb2.TestAllTypes()
2230
+ serialized = first_proto.SerializeToString()
2231
+ self.assertEqual(first_proto.ByteSize(), len(serialized))
2232
+ self.assertEqual(
2233
+ len(serialized),
2234
+ second_proto.MergeFromString(serialized))
2235
+ self.assertEqual(first_proto, second_proto)
2236
+
2237
+ def testSerializeAllFields(self):
2238
+ first_proto = unittest_pb2.TestAllTypes()
2239
+ second_proto = unittest_pb2.TestAllTypes()
2240
+ test_util.SetAllFields(first_proto)
2241
+ serialized = first_proto.SerializeToString()
2242
+ self.assertEqual(first_proto.ByteSize(), len(serialized))
2243
+ self.assertEqual(
2244
+ len(serialized),
2245
+ second_proto.MergeFromString(serialized))
2246
+ self.assertEqual(first_proto, second_proto)
2247
+
2248
+ def testSerializeAllExtensions(self):
2249
+ first_proto = unittest_pb2.TestAllExtensions()
2250
+ second_proto = unittest_pb2.TestAllExtensions()
2251
+ test_util.SetAllExtensions(first_proto)
2252
+ serialized = first_proto.SerializeToString()
2253
+ self.assertEqual(
2254
+ len(serialized),
2255
+ second_proto.MergeFromString(serialized))
2256
+ self.assertEqual(first_proto, second_proto)
2257
+
2258
+ def testSerializeWithOptionalGroup(self):
2259
+ first_proto = unittest_pb2.TestAllTypes()
2260
+ second_proto = unittest_pb2.TestAllTypes()
2261
+ first_proto.optionalgroup.a = 242
2262
+ serialized = first_proto.SerializeToString()
2263
+ self.assertEqual(
2264
+ len(serialized),
2265
+ second_proto.MergeFromString(serialized))
2266
+ self.assertEqual(first_proto, second_proto)
2267
+
2268
+ def testSerializeNegativeValues(self):
2269
+ first_proto = unittest_pb2.TestAllTypes()
2270
+
2271
+ first_proto.optional_int32 = -1
2272
+ first_proto.optional_int64 = -(2 << 40)
2273
+ first_proto.optional_sint32 = -3
2274
+ first_proto.optional_sint64 = -(4 << 40)
2275
+ first_proto.optional_sfixed32 = -5
2276
+ first_proto.optional_sfixed64 = -(6 << 40)
2277
+
2278
+ second_proto = unittest_pb2.TestAllTypes.FromString(
2279
+ first_proto.SerializeToString())
2280
+
2281
+ self.assertEqual(first_proto, second_proto)
2282
+
2283
+ def testParseTruncated(self):
2284
+ # This test is only applicable for the Python implementation of the API.
2285
+ if api_implementation.Type() != 'python':
2286
+ return
2287
+
2288
+ first_proto = unittest_pb2.TestAllTypes()
2289
+ test_util.SetAllFields(first_proto)
2290
+ serialized = first_proto.SerializeToString()
2291
+
2292
+ for truncation_point in xrange(len(serialized) + 1):
2293
+ try:
2294
+ second_proto = unittest_pb2.TestAllTypes()
2295
+ unknown_fields = unittest_pb2.TestEmptyMessage()
2296
+ pos = second_proto._InternalParse(serialized, 0, truncation_point)
2297
+ # If we didn't raise an error then we read exactly the amount expected.
2298
+ self.assertEqual(truncation_point, pos)
2299
+
2300
+ # Parsing to unknown fields should not throw if parsing to known fields
2301
+ # did not.
2302
+ try:
2303
+ pos2 = unknown_fields._InternalParse(serialized, 0, truncation_point)
2304
+ self.assertEqual(truncation_point, pos2)
2305
+ except message.DecodeError:
2306
+ self.fail('Parsing unknown fields failed when parsing known fields '
2307
+ 'did not.')
2308
+ except message.DecodeError:
2309
+ # Parsing unknown fields should also fail.
2310
+ self.assertRaises(message.DecodeError, unknown_fields._InternalParse,
2311
+ serialized, 0, truncation_point)
2312
+
2313
+ def testCanonicalSerializationOrder(self):
2314
+ proto = more_messages_pb2.OutOfOrderFields()
2315
+ # These are also their tag numbers. Even though we're setting these in
2316
+ # reverse-tag order AND they're listed in reverse tag-order in the .proto
2317
+ # file, they should nonetheless be serialized in tag order.
2318
+ proto.optional_sint32 = 5
2319
+ proto.Extensions[more_messages_pb2.optional_uint64] = 4
2320
+ proto.optional_uint32 = 3
2321
+ proto.Extensions[more_messages_pb2.optional_int64] = 2
2322
+ proto.optional_int32 = 1
2323
+ serialized = proto.SerializeToString()
2324
+ self.assertEqual(proto.ByteSize(), len(serialized))
2325
+ d = _MiniDecoder(serialized)
2326
+ ReadTag = d.ReadFieldNumberAndWireType
2327
+ self.assertEqual((1, wire_format.WIRETYPE_VARINT), ReadTag())
2328
+ self.assertEqual(1, d.ReadInt32())
2329
+ self.assertEqual((2, wire_format.WIRETYPE_VARINT), ReadTag())
2330
+ self.assertEqual(2, d.ReadInt64())
2331
+ self.assertEqual((3, wire_format.WIRETYPE_VARINT), ReadTag())
2332
+ self.assertEqual(3, d.ReadUInt32())
2333
+ self.assertEqual((4, wire_format.WIRETYPE_VARINT), ReadTag())
2334
+ self.assertEqual(4, d.ReadUInt64())
2335
+ self.assertEqual((5, wire_format.WIRETYPE_VARINT), ReadTag())
2336
+ self.assertEqual(5, d.ReadSInt32())
2337
+
2338
+ def testCanonicalSerializationOrderSameAsCpp(self):
2339
+ # Copy of the same test we use for C++.
2340
+ proto = unittest_pb2.TestFieldOrderings()
2341
+ test_util.SetAllFieldsAndExtensions(proto)
2342
+ serialized = proto.SerializeToString()
2343
+ test_util.ExpectAllFieldsAndExtensionsInOrder(serialized)
2344
+
2345
+ def testMergeFromStringWhenFieldsAlreadySet(self):
2346
+ first_proto = unittest_pb2.TestAllTypes()
2347
+ first_proto.repeated_string.append('foobar')
2348
+ first_proto.optional_int32 = 23
2349
+ first_proto.optional_nested_message.bb = 42
2350
+ serialized = first_proto.SerializeToString()
2351
+
2352
+ second_proto = unittest_pb2.TestAllTypes()
2353
+ second_proto.repeated_string.append('baz')
2354
+ second_proto.optional_int32 = 100
2355
+ second_proto.optional_nested_message.bb = 999
2356
+
2357
+ bytes_parsed = second_proto.MergeFromString(serialized)
2358
+ self.assertEqual(len(serialized), bytes_parsed)
2359
+
2360
+ # Ensure that we append to repeated fields.
2361
+ self.assertEqual(['baz', 'foobar'], list(second_proto.repeated_string))
2362
+ # Ensure that we overwrite nonrepeatd scalars.
2363
+ self.assertEqual(23, second_proto.optional_int32)
2364
+ # Ensure that we recursively call MergeFromString() on
2365
+ # submessages.
2366
+ self.assertEqual(42, second_proto.optional_nested_message.bb)
2367
+
2368
+ def testMessageSetWireFormat(self):
2369
+ proto = unittest_mset_pb2.TestMessageSet()
2370
+ extension_message1 = unittest_mset_pb2.TestMessageSetExtension1
2371
+ extension_message2 = unittest_mset_pb2.TestMessageSetExtension2
2372
+ extension1 = extension_message1.message_set_extension
2373
+ extension2 = extension_message2.message_set_extension
2374
+ proto.Extensions[extension1].i = 123
2375
+ proto.Extensions[extension2].str = 'foo'
2376
+
2377
+ # Serialize using the MessageSet wire format (this is specified in the
2378
+ # .proto file).
2379
+ serialized = proto.SerializeToString()
2380
+
2381
+ raw = unittest_mset_pb2.RawMessageSet()
2382
+ self.assertEqual(False,
2383
+ raw.DESCRIPTOR.GetOptions().message_set_wire_format)
2384
+ self.assertEqual(
2385
+ len(serialized),
2386
+ raw.MergeFromString(serialized))
2387
+ self.assertEqual(2, len(raw.item))
2388
+
2389
+ message1 = unittest_mset_pb2.TestMessageSetExtension1()
2390
+ self.assertEqual(
2391
+ len(raw.item[0].message),
2392
+ message1.MergeFromString(raw.item[0].message))
2393
+ self.assertEqual(123, message1.i)
2394
+
2395
+ message2 = unittest_mset_pb2.TestMessageSetExtension2()
2396
+ self.assertEqual(
2397
+ len(raw.item[1].message),
2398
+ message2.MergeFromString(raw.item[1].message))
2399
+ self.assertEqual('foo', message2.str)
2400
+
2401
+ # Deserialize using the MessageSet wire format.
2402
+ proto2 = unittest_mset_pb2.TestMessageSet()
2403
+ self.assertEqual(
2404
+ len(serialized),
2405
+ proto2.MergeFromString(serialized))
2406
+ self.assertEqual(123, proto2.Extensions[extension1].i)
2407
+ self.assertEqual('foo', proto2.Extensions[extension2].str)
2408
+
2409
+ # Check byte size.
2410
+ self.assertEqual(proto2.ByteSize(), len(serialized))
2411
+ self.assertEqual(proto.ByteSize(), len(serialized))
2412
+
2413
+ def testMessageSetWireFormatUnknownExtension(self):
2414
+ # Create a message using the message set wire format with an unknown
2415
+ # message.
2416
+ raw = unittest_mset_pb2.RawMessageSet()
2417
+
2418
+ # Add an item.
2419
+ item = raw.item.add()
2420
+ item.type_id = 1545008
2421
+ extension_message1 = unittest_mset_pb2.TestMessageSetExtension1
2422
+ message1 = unittest_mset_pb2.TestMessageSetExtension1()
2423
+ message1.i = 12345
2424
+ item.message = message1.SerializeToString()
2425
+
2426
+ # Add a second, unknown extension.
2427
+ item = raw.item.add()
2428
+ item.type_id = 1545009
2429
+ extension_message1 = unittest_mset_pb2.TestMessageSetExtension1
2430
+ message1 = unittest_mset_pb2.TestMessageSetExtension1()
2431
+ message1.i = 12346
2432
+ item.message = message1.SerializeToString()
2433
+
2434
+ # Add another unknown extension.
2435
+ item = raw.item.add()
2436
+ item.type_id = 1545010
2437
+ message1 = unittest_mset_pb2.TestMessageSetExtension2()
2438
+ message1.str = 'foo'
2439
+ item.message = message1.SerializeToString()
2440
+
2441
+ serialized = raw.SerializeToString()
2442
+
2443
+ # Parse message using the message set wire format.
2444
+ proto = unittest_mset_pb2.TestMessageSet()
2445
+ self.assertEqual(
2446
+ len(serialized),
2447
+ proto.MergeFromString(serialized))
2448
+
2449
+ # Check that the message parsed well.
2450
+ extension_message1 = unittest_mset_pb2.TestMessageSetExtension1
2451
+ extension1 = extension_message1.message_set_extension
2452
+ self.assertEquals(12345, proto.Extensions[extension1].i)
2453
+
2454
+ def testUnknownFields(self):
2455
+ proto = unittest_pb2.TestAllTypes()
2456
+ test_util.SetAllFields(proto)
2457
+
2458
+ serialized = proto.SerializeToString()
2459
+
2460
+ # The empty message should be parsable with all of the fields
2461
+ # unknown.
2462
+ proto2 = unittest_pb2.TestEmptyMessage()
2463
+
2464
+ # Parsing this message should succeed.
2465
+ self.assertEqual(
2466
+ len(serialized),
2467
+ proto2.MergeFromString(serialized))
2468
+
2469
+ # Now test with a int64 field set.
2470
+ proto = unittest_pb2.TestAllTypes()
2471
+ proto.optional_int64 = 0x0fffffffffffffff
2472
+ serialized = proto.SerializeToString()
2473
+ # The empty message should be parsable with all of the fields
2474
+ # unknown.
2475
+ proto2 = unittest_pb2.TestEmptyMessage()
2476
+ # Parsing this message should succeed.
2477
+ self.assertEqual(
2478
+ len(serialized),
2479
+ proto2.MergeFromString(serialized))
2480
+
2481
+ def _CheckRaises(self, exc_class, callable_obj, exception):
2482
+ """This method checks if the excpetion type and message are as expected."""
2483
+ try:
2484
+ callable_obj()
2485
+ except exc_class as ex:
2486
+ # Check if the exception message is the right one.
2487
+ self.assertEqual(exception, str(ex))
2488
+ return
2489
+ else:
2490
+ raise self.failureException('%s not raised' % str(exc_class))
2491
+
2492
+ def testSerializeUninitialized(self):
2493
+ proto = unittest_pb2.TestRequired()
2494
+ self._CheckRaises(
2495
+ message.EncodeError,
2496
+ proto.SerializeToString,
2497
+ 'Message protobuf_unittest.TestRequired is missing required fields: '
2498
+ 'a,b,c')
2499
+ # Shouldn't raise exceptions.
2500
+ partial = proto.SerializePartialToString()
2501
+
2502
+ proto2 = unittest_pb2.TestRequired()
2503
+ self.assertFalse(proto2.HasField('a'))
2504
+ # proto2 ParseFromString does not check that required fields are set.
2505
+ proto2.ParseFromString(partial)
2506
+ self.assertFalse(proto2.HasField('a'))
2507
+
2508
+ proto.a = 1
2509
+ self._CheckRaises(
2510
+ message.EncodeError,
2511
+ proto.SerializeToString,
2512
+ 'Message protobuf_unittest.TestRequired is missing required fields: b,c')
2513
+ # Shouldn't raise exceptions.
2514
+ partial = proto.SerializePartialToString()
2515
+
2516
+ proto.b = 2
2517
+ self._CheckRaises(
2518
+ message.EncodeError,
2519
+ proto.SerializeToString,
2520
+ 'Message protobuf_unittest.TestRequired is missing required fields: c')
2521
+ # Shouldn't raise exceptions.
2522
+ partial = proto.SerializePartialToString()
2523
+
2524
+ proto.c = 3
2525
+ serialized = proto.SerializeToString()
2526
+ # Shouldn't raise exceptions.
2527
+ partial = proto.SerializePartialToString()
2528
+
2529
+ proto2 = unittest_pb2.TestRequired()
2530
+ self.assertEqual(
2531
+ len(serialized),
2532
+ proto2.MergeFromString(serialized))
2533
+ self.assertEqual(1, proto2.a)
2534
+ self.assertEqual(2, proto2.b)
2535
+ self.assertEqual(3, proto2.c)
2536
+ self.assertEqual(
2537
+ len(partial),
2538
+ proto2.MergeFromString(partial))
2539
+ self.assertEqual(1, proto2.a)
2540
+ self.assertEqual(2, proto2.b)
2541
+ self.assertEqual(3, proto2.c)
2542
+
2543
+ def testSerializeUninitializedSubMessage(self):
2544
+ proto = unittest_pb2.TestRequiredForeign()
2545
+
2546
+ # Sub-message doesn't exist yet, so this succeeds.
2547
+ proto.SerializeToString()
2548
+
2549
+ proto.optional_message.a = 1
2550
+ self._CheckRaises(
2551
+ message.EncodeError,
2552
+ proto.SerializeToString,
2553
+ 'Message protobuf_unittest.TestRequiredForeign '
2554
+ 'is missing required fields: '
2555
+ 'optional_message.b,optional_message.c')
2556
+
2557
+ proto.optional_message.b = 2
2558
+ proto.optional_message.c = 3
2559
+ proto.SerializeToString()
2560
+
2561
+ proto.repeated_message.add().a = 1
2562
+ proto.repeated_message.add().b = 2
2563
+ self._CheckRaises(
2564
+ message.EncodeError,
2565
+ proto.SerializeToString,
2566
+ 'Message protobuf_unittest.TestRequiredForeign is missing required fields: '
2567
+ 'repeated_message[0].b,repeated_message[0].c,'
2568
+ 'repeated_message[1].a,repeated_message[1].c')
2569
+
2570
+ proto.repeated_message[0].b = 2
2571
+ proto.repeated_message[0].c = 3
2572
+ proto.repeated_message[1].a = 1
2573
+ proto.repeated_message[1].c = 3
2574
+ proto.SerializeToString()
2575
+
2576
+ def testSerializeAllPackedFields(self):
2577
+ first_proto = unittest_pb2.TestPackedTypes()
2578
+ second_proto = unittest_pb2.TestPackedTypes()
2579
+ test_util.SetAllPackedFields(first_proto)
2580
+ serialized = first_proto.SerializeToString()
2581
+ self.assertEqual(first_proto.ByteSize(), len(serialized))
2582
+ bytes_read = second_proto.MergeFromString(serialized)
2583
+ self.assertEqual(second_proto.ByteSize(), bytes_read)
2584
+ self.assertEqual(first_proto, second_proto)
2585
+
2586
+ def testSerializeAllPackedExtensions(self):
2587
+ first_proto = unittest_pb2.TestPackedExtensions()
2588
+ second_proto = unittest_pb2.TestPackedExtensions()
2589
+ test_util.SetAllPackedExtensions(first_proto)
2590
+ serialized = first_proto.SerializeToString()
2591
+ bytes_read = second_proto.MergeFromString(serialized)
2592
+ self.assertEqual(second_proto.ByteSize(), bytes_read)
2593
+ self.assertEqual(first_proto, second_proto)
2594
+
2595
+ def testMergePackedFromStringWhenSomeFieldsAlreadySet(self):
2596
+ first_proto = unittest_pb2.TestPackedTypes()
2597
+ first_proto.packed_int32.extend([1, 2])
2598
+ first_proto.packed_double.append(3.0)
2599
+ serialized = first_proto.SerializeToString()
2600
+
2601
+ second_proto = unittest_pb2.TestPackedTypes()
2602
+ second_proto.packed_int32.append(3)
2603
+ second_proto.packed_double.extend([1.0, 2.0])
2604
+ second_proto.packed_sint32.append(4)
2605
+
2606
+ self.assertEqual(
2607
+ len(serialized),
2608
+ second_proto.MergeFromString(serialized))
2609
+ self.assertEqual([3, 1, 2], second_proto.packed_int32)
2610
+ self.assertEqual([1.0, 2.0, 3.0], second_proto.packed_double)
2611
+ self.assertEqual([4], second_proto.packed_sint32)
2612
+
2613
+ def testPackedFieldsWireFormat(self):
2614
+ proto = unittest_pb2.TestPackedTypes()
2615
+ proto.packed_int32.extend([1, 2, 150, 3]) # 1 + 1 + 2 + 1 bytes
2616
+ proto.packed_double.extend([1.0, 1000.0]) # 8 + 8 bytes
2617
+ proto.packed_float.append(2.0) # 4 bytes, will be before double
2618
+ serialized = proto.SerializeToString()
2619
+ self.assertEqual(proto.ByteSize(), len(serialized))
2620
+ d = _MiniDecoder(serialized)
2621
+ ReadTag = d.ReadFieldNumberAndWireType
2622
+ self.assertEqual((90, wire_format.WIRETYPE_LENGTH_DELIMITED), ReadTag())
2623
+ self.assertEqual(1+1+1+2, d.ReadInt32())
2624
+ self.assertEqual(1, d.ReadInt32())
2625
+ self.assertEqual(2, d.ReadInt32())
2626
+ self.assertEqual(150, d.ReadInt32())
2627
+ self.assertEqual(3, d.ReadInt32())
2628
+ self.assertEqual((100, wire_format.WIRETYPE_LENGTH_DELIMITED), ReadTag())
2629
+ self.assertEqual(4, d.ReadInt32())
2630
+ self.assertEqual(2.0, d.ReadFloat())
2631
+ self.assertEqual((101, wire_format.WIRETYPE_LENGTH_DELIMITED), ReadTag())
2632
+ self.assertEqual(8+8, d.ReadInt32())
2633
+ self.assertEqual(1.0, d.ReadDouble())
2634
+ self.assertEqual(1000.0, d.ReadDouble())
2635
+ self.assertTrue(d.EndOfStream())
2636
+
2637
+ def testParsePackedFromUnpacked(self):
2638
+ unpacked = unittest_pb2.TestUnpackedTypes()
2639
+ test_util.SetAllUnpackedFields(unpacked)
2640
+ packed = unittest_pb2.TestPackedTypes()
2641
+ serialized = unpacked.SerializeToString()
2642
+ self.assertEqual(
2643
+ len(serialized),
2644
+ packed.MergeFromString(serialized))
2645
+ expected = unittest_pb2.TestPackedTypes()
2646
+ test_util.SetAllPackedFields(expected)
2647
+ self.assertEqual(expected, packed)
2648
+
2649
+ def testParseUnpackedFromPacked(self):
2650
+ packed = unittest_pb2.TestPackedTypes()
2651
+ test_util.SetAllPackedFields(packed)
2652
+ unpacked = unittest_pb2.TestUnpackedTypes()
2653
+ serialized = packed.SerializeToString()
2654
+ self.assertEqual(
2655
+ len(serialized),
2656
+ unpacked.MergeFromString(serialized))
2657
+ expected = unittest_pb2.TestUnpackedTypes()
2658
+ test_util.SetAllUnpackedFields(expected)
2659
+ self.assertEqual(expected, unpacked)
2660
+
2661
+ def testFieldNumbers(self):
2662
+ proto = unittest_pb2.TestAllTypes()
2663
+ self.assertEqual(unittest_pb2.TestAllTypes.NestedMessage.BB_FIELD_NUMBER, 1)
2664
+ self.assertEqual(unittest_pb2.TestAllTypes.OPTIONAL_INT32_FIELD_NUMBER, 1)
2665
+ self.assertEqual(unittest_pb2.TestAllTypes.OPTIONALGROUP_FIELD_NUMBER, 16)
2666
+ self.assertEqual(
2667
+ unittest_pb2.TestAllTypes.OPTIONAL_NESTED_MESSAGE_FIELD_NUMBER, 18)
2668
+ self.assertEqual(
2669
+ unittest_pb2.TestAllTypes.OPTIONAL_NESTED_ENUM_FIELD_NUMBER, 21)
2670
+ self.assertEqual(unittest_pb2.TestAllTypes.REPEATED_INT32_FIELD_NUMBER, 31)
2671
+ self.assertEqual(unittest_pb2.TestAllTypes.REPEATEDGROUP_FIELD_NUMBER, 46)
2672
+ self.assertEqual(
2673
+ unittest_pb2.TestAllTypes.REPEATED_NESTED_MESSAGE_FIELD_NUMBER, 48)
2674
+ self.assertEqual(
2675
+ unittest_pb2.TestAllTypes.REPEATED_NESTED_ENUM_FIELD_NUMBER, 51)
2676
+
2677
+ def testExtensionFieldNumbers(self):
2678
+ self.assertEqual(unittest_pb2.TestRequired.single.number, 1000)
2679
+ self.assertEqual(unittest_pb2.TestRequired.SINGLE_FIELD_NUMBER, 1000)
2680
+ self.assertEqual(unittest_pb2.TestRequired.multi.number, 1001)
2681
+ self.assertEqual(unittest_pb2.TestRequired.MULTI_FIELD_NUMBER, 1001)
2682
+ self.assertEqual(unittest_pb2.optional_int32_extension.number, 1)
2683
+ self.assertEqual(unittest_pb2.OPTIONAL_INT32_EXTENSION_FIELD_NUMBER, 1)
2684
+ self.assertEqual(unittest_pb2.optionalgroup_extension.number, 16)
2685
+ self.assertEqual(unittest_pb2.OPTIONALGROUP_EXTENSION_FIELD_NUMBER, 16)
2686
+ self.assertEqual(unittest_pb2.optional_nested_message_extension.number, 18)
2687
+ self.assertEqual(
2688
+ unittest_pb2.OPTIONAL_NESTED_MESSAGE_EXTENSION_FIELD_NUMBER, 18)
2689
+ self.assertEqual(unittest_pb2.optional_nested_enum_extension.number, 21)
2690
+ self.assertEqual(unittest_pb2.OPTIONAL_NESTED_ENUM_EXTENSION_FIELD_NUMBER,
2691
+ 21)
2692
+ self.assertEqual(unittest_pb2.repeated_int32_extension.number, 31)
2693
+ self.assertEqual(unittest_pb2.REPEATED_INT32_EXTENSION_FIELD_NUMBER, 31)
2694
+ self.assertEqual(unittest_pb2.repeatedgroup_extension.number, 46)
2695
+ self.assertEqual(unittest_pb2.REPEATEDGROUP_EXTENSION_FIELD_NUMBER, 46)
2696
+ self.assertEqual(unittest_pb2.repeated_nested_message_extension.number, 48)
2697
+ self.assertEqual(
2698
+ unittest_pb2.REPEATED_NESTED_MESSAGE_EXTENSION_FIELD_NUMBER, 48)
2699
+ self.assertEqual(unittest_pb2.repeated_nested_enum_extension.number, 51)
2700
+ self.assertEqual(unittest_pb2.REPEATED_NESTED_ENUM_EXTENSION_FIELD_NUMBER,
2701
+ 51)
2702
+
2703
+ def testInitKwargs(self):
2704
+ proto = unittest_pb2.TestAllTypes(
2705
+ optional_int32=1,
2706
+ optional_string='foo',
2707
+ optional_bool=True,
2708
+ optional_bytes=b'bar',
2709
+ optional_nested_message=unittest_pb2.TestAllTypes.NestedMessage(bb=1),
2710
+ optional_foreign_message=unittest_pb2.ForeignMessage(c=1),
2711
+ optional_nested_enum=unittest_pb2.TestAllTypes.FOO,
2712
+ optional_foreign_enum=unittest_pb2.FOREIGN_FOO,
2713
+ repeated_int32=[1, 2, 3])
2714
+ self.assertTrue(proto.IsInitialized())
2715
+ self.assertTrue(proto.HasField('optional_int32'))
2716
+ self.assertTrue(proto.HasField('optional_string'))
2717
+ self.assertTrue(proto.HasField('optional_bool'))
2718
+ self.assertTrue(proto.HasField('optional_bytes'))
2719
+ self.assertTrue(proto.HasField('optional_nested_message'))
2720
+ self.assertTrue(proto.HasField('optional_foreign_message'))
2721
+ self.assertTrue(proto.HasField('optional_nested_enum'))
2722
+ self.assertTrue(proto.HasField('optional_foreign_enum'))
2723
+ self.assertEqual(1, proto.optional_int32)
2724
+ self.assertEqual('foo', proto.optional_string)
2725
+ self.assertEqual(True, proto.optional_bool)
2726
+ self.assertEqual(b'bar', proto.optional_bytes)
2727
+ self.assertEqual(1, proto.optional_nested_message.bb)
2728
+ self.assertEqual(1, proto.optional_foreign_message.c)
2729
+ self.assertEqual(unittest_pb2.TestAllTypes.FOO,
2730
+ proto.optional_nested_enum)
2731
+ self.assertEqual(unittest_pb2.FOREIGN_FOO, proto.optional_foreign_enum)
2732
+ self.assertEqual([1, 2, 3], proto.repeated_int32)
2733
+
2734
+ def testInitArgsUnknownFieldName(self):
2735
+ def InitalizeEmptyMessageWithExtraKeywordArg():
2736
+ unused_proto = unittest_pb2.TestEmptyMessage(unknown='unknown')
2737
+ self._CheckRaises(ValueError,
2738
+ InitalizeEmptyMessageWithExtraKeywordArg,
2739
+ 'Protocol message has no "unknown" field.')
2740
+
2741
+ def testInitRequiredKwargs(self):
2742
+ proto = unittest_pb2.TestRequired(a=1, b=1, c=1)
2743
+ self.assertTrue(proto.IsInitialized())
2744
+ self.assertTrue(proto.HasField('a'))
2745
+ self.assertTrue(proto.HasField('b'))
2746
+ self.assertTrue(proto.HasField('c'))
2747
+ self.assertTrue(not proto.HasField('dummy2'))
2748
+ self.assertEqual(1, proto.a)
2749
+ self.assertEqual(1, proto.b)
2750
+ self.assertEqual(1, proto.c)
2751
+
2752
+ def testInitRequiredForeignKwargs(self):
2753
+ proto = unittest_pb2.TestRequiredForeign(
2754
+ optional_message=unittest_pb2.TestRequired(a=1, b=1, c=1))
2755
+ self.assertTrue(proto.IsInitialized())
2756
+ self.assertTrue(proto.HasField('optional_message'))
2757
+ self.assertTrue(proto.optional_message.IsInitialized())
2758
+ self.assertTrue(proto.optional_message.HasField('a'))
2759
+ self.assertTrue(proto.optional_message.HasField('b'))
2760
+ self.assertTrue(proto.optional_message.HasField('c'))
2761
+ self.assertTrue(not proto.optional_message.HasField('dummy2'))
2762
+ self.assertEqual(unittest_pb2.TestRequired(a=1, b=1, c=1),
2763
+ proto.optional_message)
2764
+ self.assertEqual(1, proto.optional_message.a)
2765
+ self.assertEqual(1, proto.optional_message.b)
2766
+ self.assertEqual(1, proto.optional_message.c)
2767
+
2768
+ def testInitRepeatedKwargs(self):
2769
+ proto = unittest_pb2.TestAllTypes(repeated_int32=[1, 2, 3])
2770
+ self.assertTrue(proto.IsInitialized())
2771
+ self.assertEqual(1, proto.repeated_int32[0])
2772
+ self.assertEqual(2, proto.repeated_int32[1])
2773
+ self.assertEqual(3, proto.repeated_int32[2])
2774
+
2775
+
2776
+ class OptionsTest(basetest.TestCase):
2777
+
2778
+ def testMessageOptions(self):
2779
+ proto = unittest_mset_pb2.TestMessageSet()
2780
+ self.assertEqual(True,
2781
+ proto.DESCRIPTOR.GetOptions().message_set_wire_format)
2782
+ proto = unittest_pb2.TestAllTypes()
2783
+ self.assertEqual(False,
2784
+ proto.DESCRIPTOR.GetOptions().message_set_wire_format)
2785
+
2786
+ def testPackedOptions(self):
2787
+ proto = unittest_pb2.TestAllTypes()
2788
+ proto.optional_int32 = 1
2789
+ proto.optional_double = 3.0
2790
+ for field_descriptor, _ in proto.ListFields():
2791
+ self.assertEqual(False, field_descriptor.GetOptions().packed)
2792
+
2793
+ proto = unittest_pb2.TestPackedTypes()
2794
+ proto.packed_int32.append(1)
2795
+ proto.packed_double.append(3.0)
2796
+ for field_descriptor, _ in proto.ListFields():
2797
+ self.assertEqual(True, field_descriptor.GetOptions().packed)
2798
+ self.assertEqual(reflection._FieldDescriptor.LABEL_REPEATED,
2799
+ field_descriptor.label)
2800
+
2801
+
2802
+
2803
+ class ClassAPITest(basetest.TestCase):
2804
+
2805
+ def testMakeClassWithNestedDescriptor(self):
2806
+ leaf_desc = descriptor.Descriptor('leaf', 'package.parent.child.leaf', '',
2807
+ containing_type=None, fields=[],
2808
+ nested_types=[], enum_types=[],
2809
+ extensions=[])
2810
+ child_desc = descriptor.Descriptor('child', 'package.parent.child', '',
2811
+ containing_type=None, fields=[],
2812
+ nested_types=[leaf_desc], enum_types=[],
2813
+ extensions=[])
2814
+ sibling_desc = descriptor.Descriptor('sibling', 'package.parent.sibling',
2815
+ '', containing_type=None, fields=[],
2816
+ nested_types=[], enum_types=[],
2817
+ extensions=[])
2818
+ parent_desc = descriptor.Descriptor('parent', 'package.parent', '',
2819
+ containing_type=None, fields=[],
2820
+ nested_types=[child_desc, sibling_desc],
2821
+ enum_types=[], extensions=[])
2822
+ message_class = reflection.MakeClass(parent_desc)
2823
+ self.assertIn('child', message_class.__dict__)
2824
+ self.assertIn('sibling', message_class.__dict__)
2825
+ self.assertIn('leaf', message_class.child.__dict__)
2826
+
2827
+ def _GetSerializedFileDescriptor(self, name):
2828
+ """Get a serialized representation of a test FileDescriptorProto.
2829
+
2830
+ Args:
2831
+ name: All calls to this must use a unique message name, to avoid
2832
+ collisions in the cpp descriptor pool.
2833
+ Returns:
2834
+ A string containing the serialized form of a test FileDescriptorProto.
2835
+ """
2836
+ file_descriptor_str = (
2837
+ 'message_type {'
2838
+ ' name: "' + name + '"'
2839
+ ' field {'
2840
+ ' name: "flat"'
2841
+ ' number: 1'
2842
+ ' label: LABEL_REPEATED'
2843
+ ' type: TYPE_UINT32'
2844
+ ' }'
2845
+ ' field {'
2846
+ ' name: "bar"'
2847
+ ' number: 2'
2848
+ ' label: LABEL_OPTIONAL'
2849
+ ' type: TYPE_MESSAGE'
2850
+ ' type_name: "Bar"'
2851
+ ' }'
2852
+ ' nested_type {'
2853
+ ' name: "Bar"'
2854
+ ' field {'
2855
+ ' name: "baz"'
2856
+ ' number: 3'
2857
+ ' label: LABEL_OPTIONAL'
2858
+ ' type: TYPE_MESSAGE'
2859
+ ' type_name: "Baz"'
2860
+ ' }'
2861
+ ' nested_type {'
2862
+ ' name: "Baz"'
2863
+ ' enum_type {'
2864
+ ' name: "deep_enum"'
2865
+ ' value {'
2866
+ ' name: "VALUE_A"'
2867
+ ' number: 0'
2868
+ ' }'
2869
+ ' }'
2870
+ ' field {'
2871
+ ' name: "deep"'
2872
+ ' number: 4'
2873
+ ' label: LABEL_OPTIONAL'
2874
+ ' type: TYPE_UINT32'
2875
+ ' }'
2876
+ ' }'
2877
+ ' }'
2878
+ '}')
2879
+ file_descriptor = descriptor_pb2.FileDescriptorProto()
2880
+ text_format.Merge(file_descriptor_str, file_descriptor)
2881
+ return file_descriptor.SerializeToString()
2882
+
2883
+ def testParsingFlatClassWithExplicitClassDeclaration(self):
2884
+ """Test that the generated class can parse a flat message."""
2885
+ file_descriptor = descriptor_pb2.FileDescriptorProto()
2886
+ file_descriptor.ParseFromString(self._GetSerializedFileDescriptor('A'))
2887
+ msg_descriptor = descriptor.MakeDescriptor(
2888
+ file_descriptor.message_type[0])
2889
+
2890
+ class MessageClass(message.Message):
2891
+ __metaclass__ = reflection.GeneratedProtocolMessageType
2892
+ DESCRIPTOR = msg_descriptor
2893
+ msg = MessageClass()
2894
+ msg_str = (
2895
+ 'flat: 0 '
2896
+ 'flat: 1 '
2897
+ 'flat: 2 ')
2898
+ text_format.Merge(msg_str, msg)
2899
+ self.assertEqual(msg.flat, [0, 1, 2])
2900
+
2901
+ def testParsingFlatClass(self):
2902
+ """Test that the generated class can parse a flat message."""
2903
+ file_descriptor = descriptor_pb2.FileDescriptorProto()
2904
+ file_descriptor.ParseFromString(self._GetSerializedFileDescriptor('B'))
2905
+ msg_descriptor = descriptor.MakeDescriptor(
2906
+ file_descriptor.message_type[0])
2907
+ msg_class = reflection.MakeClass(msg_descriptor)
2908
+ msg = msg_class()
2909
+ msg_str = (
2910
+ 'flat: 0 '
2911
+ 'flat: 1 '
2912
+ 'flat: 2 ')
2913
+ text_format.Merge(msg_str, msg)
2914
+ self.assertEqual(msg.flat, [0, 1, 2])
2915
+
2916
+ def testParsingNestedClass(self):
2917
+ """Test that the generated class can parse a nested message."""
2918
+ file_descriptor = descriptor_pb2.FileDescriptorProto()
2919
+ file_descriptor.ParseFromString(self._GetSerializedFileDescriptor('C'))
2920
+ msg_descriptor = descriptor.MakeDescriptor(
2921
+ file_descriptor.message_type[0])
2922
+ msg_class = reflection.MakeClass(msg_descriptor)
2923
+ msg = msg_class()
2924
+ msg_str = (
2925
+ 'bar {'
2926
+ ' baz {'
2927
+ ' deep: 4'
2928
+ ' }'
2929
+ '}')
2930
+ text_format.Merge(msg_str, msg)
2931
+ self.assertEqual(msg.bar.baz.deep, 4)
2932
+
2933
+ if __name__ == '__main__':
2934
+ basetest.main()