protoc 2.6.1.1 → 2.6.1.2

Sign up to get free protection for your applications and to get access to all the features.
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()