protoc 2.6.1.1 → 2.6.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/ext/protoc/Makefile.in +10 -13
- data/ext/protoc/extconf.rb +0 -1
- data/ext/protoc/protobuf/CHANGES.txt +593 -0
- data/ext/protoc/protobuf/CONTRIBUTORS.txt +93 -0
- data/ext/protoc/protobuf/INSTALL.txt +237 -0
- data/ext/protoc/protobuf/LICENSE +33 -0
- data/ext/protoc/protobuf/Makefile.am +267 -0
- data/ext/protoc/protobuf/README.md +167 -0
- data/ext/protoc/protobuf/autogen.sh +41 -0
- data/ext/protoc/protobuf/benchmarks/ProtoBench.java +203 -0
- data/ext/protoc/protobuf/benchmarks/google_message1.dat +0 -0
- data/ext/protoc/protobuf/benchmarks/google_message2.dat +0 -0
- data/ext/protoc/protobuf/benchmarks/google_size.proto +136 -0
- data/ext/protoc/protobuf/benchmarks/google_speed.proto +136 -0
- data/ext/protoc/protobuf/benchmarks/readme.txt +50 -0
- data/ext/protoc/protobuf/configure.ac +159 -0
- data/ext/protoc/protobuf/editors/README.txt +5 -0
- data/ext/protoc/protobuf/editors/proto.vim +105 -0
- data/ext/protoc/protobuf/editors/protobuf-mode.el +220 -0
- data/ext/protoc/protobuf/examples/AddPerson.java +95 -0
- data/ext/protoc/protobuf/examples/ListPeople.java +50 -0
- data/ext/protoc/protobuf/examples/Makefile +58 -0
- data/ext/protoc/protobuf/examples/README.txt +29 -0
- data/ext/protoc/protobuf/examples/add_person.cc +95 -0
- data/ext/protoc/protobuf/examples/add_person.py +58 -0
- data/ext/protoc/protobuf/examples/addressbook.proto +30 -0
- data/ext/protoc/protobuf/examples/list_people.cc +68 -0
- data/ext/protoc/protobuf/examples/list_people.py +38 -0
- data/ext/protoc/protobuf/generate_descriptor_proto.sh +33 -0
- data/ext/protoc/protobuf/java/README.txt +96 -0
- data/ext/protoc/protobuf/java/pom.xml +217 -0
- data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/AbstractMessage.java +466 -0
- data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/AbstractMessageLite.java +355 -0
- data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/AbstractParser.java +253 -0
- data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/BlockingRpcChannel.java +51 -0
- data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/BlockingService.java +64 -0
- data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/BoundedByteString.java +163 -0
- data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/ByteString.java +1022 -0
- data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/CodedInputStream.java +1311 -0
- data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/CodedOutputStream.java +1297 -0
- data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/Descriptors.java +2238 -0
- data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/DynamicMessage.java +622 -0
- data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/Extension.java +96 -0
- data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/ExtensionRegistry.java +392 -0
- data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/ExtensionRegistryLite.java +185 -0
- data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/FieldSet.java +907 -0
- data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/GeneratedMessage.java +2213 -0
- data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/GeneratedMessageLite.java +949 -0
- data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/Internal.java +391 -0
- data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/InvalidProtocolBufferException.java +122 -0
- data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/LazyField.java +154 -0
- data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/LazyFieldLite.java +176 -0
- data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/LazyStringArrayList.java +367 -0
- data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/LazyStringList.java +163 -0
- data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/LiteralByteString.java +362 -0
- data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/Message.java +244 -0
- data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/MessageLite.java +320 -0
- data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/MessageLiteOrBuilder.java +60 -0
- data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/MessageOrBuilder.java +143 -0
- data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/MessageReflection.java +931 -0
- data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/Parser.java +261 -0
- data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/ProtocolMessageEnum.java +58 -0
- data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/ProtocolStringList.java +48 -0
- data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/RepeatedFieldBuilder.java +696 -0
- data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/RopeByteString.java +957 -0
- data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/RpcCallback.java +47 -0
- data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/RpcChannel.java +71 -0
- data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/RpcController.java +118 -0
- data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/RpcUtil.java +134 -0
- data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/Service.java +117 -0
- data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/ServiceException.java +52 -0
- data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/SingleFieldBuilder.java +241 -0
- data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/SmallSortedMap.java +618 -0
- data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/TextFormat.java +1984 -0
- data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/UninitializedMessageException.java +99 -0
- data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/UnknownFieldSet.java +995 -0
- data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/UnmodifiableLazyStringList.java +205 -0
- data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/Utf8.java +349 -0
- data/ext/protoc/protobuf/java/src/main/java/com/google/protobuf/WireFormat.java +163 -0
- data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/AbstractMessageTest.java +527 -0
- data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/BoundedByteStringTest.java +68 -0
- data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/ByteStringTest.java +759 -0
- data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/CheckUtf8Test.java +141 -0
- data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/CodedInputStreamTest.java +769 -0
- data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/CodedOutputStreamTest.java +401 -0
- data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/DeprecatedFieldTest.java +80 -0
- data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/DescriptorsTest.java +735 -0
- data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/DynamicMessageTest.java +326 -0
- data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/ForceFieldBuildersPreRun.java +48 -0
- data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/GeneratedMessageTest.java +1515 -0
- data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/IsValidUtf8Test.java +180 -0
- data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/IsValidUtf8TestUtil.java +421 -0
- data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/LazyFieldLiteTest.java +134 -0
- data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/LazyFieldTest.java +121 -0
- data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/LazyMessageLiteTest.java +319 -0
- data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/LazyStringArrayListTest.java +174 -0
- data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/LazyStringEndToEndTest.java +143 -0
- data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/LiteEqualsAndHashTest.java +85 -0
- data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/LiteTest.java +148 -0
- data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/LiteralByteStringTest.java +396 -0
- data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/MessageTest.java +353 -0
- data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/NestedBuildersTest.java +185 -0
- data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/ParserTest.java +381 -0
- data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/RepeatedFieldBuilderTest.java +190 -0
- data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/RopeByteStringSubstringTest.java +97 -0
- data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/RopeByteStringTest.java +115 -0
- data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/ServiceTest.java +320 -0
- data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/SingleFieldBuilderTest.java +155 -0
- data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/SmallSortedMapTest.java +420 -0
- data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/TestBadIdentifiers.java +96 -0
- data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/TestUtil.java +4124 -0
- data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/TextFormatTest.java +994 -0
- data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/UnknownFieldSetTest.java +653 -0
- data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/UnmodifiableLazyStringListTest.java +227 -0
- data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/WireFormatTest.java +606 -0
- data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/lazy_fields_lite.proto +61 -0
- data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/lite_equals_and_hash.proto +55 -0
- data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/multiple_files_test.proto +77 -0
- data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/nested_builders_test.proto +53 -0
- data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/nested_extension.proto +46 -0
- data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/nested_extension_lite.proto +48 -0
- data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/non_nested_extension.proto +49 -0
- data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/non_nested_extension_lite.proto +50 -0
- data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/outer_class_name_test.proto +38 -0
- data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/outer_class_name_test2.proto +42 -0
- data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/outer_class_name_test3.proto +43 -0
- data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/test_bad_identifiers.proto +157 -0
- data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/test_check_utf8.proto +50 -0
- data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/test_check_utf8_size.proto +51 -0
- data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/test_custom_options.proto +43 -0
- data/ext/protoc/protobuf/java/src/test/java/com/google/protobuf/test_extra_interfaces.proto +60 -0
- data/ext/protoc/protobuf/m4/ac_system_extensions.m4 +37 -0
- data/ext/protoc/protobuf/m4/acx_check_suncc.m4 +75 -0
- data/ext/protoc/protobuf/m4/acx_pthread.m4 +397 -0
- data/ext/protoc/protobuf/m4/stl_hash.m4 +72 -0
- data/ext/protoc/protobuf/more_tests/Makefile +41 -0
- data/ext/protoc/protobuf/post_process_dist.sh +60 -0
- data/ext/protoc/protobuf/protobuf-lite.pc.in +13 -0
- data/ext/protoc/protobuf/protobuf.pc.in +14 -0
- data/ext/protoc/protobuf/python/README.txt +105 -0
- data/ext/protoc/protobuf/python/ez_setup.py +284 -0
- data/ext/protoc/protobuf/python/google/__init__.py +1 -0
- data/ext/protoc/protobuf/python/google/protobuf/__init__.py +0 -0
- data/ext/protoc/protobuf/python/google/protobuf/descriptor.py +849 -0
- data/ext/protoc/protobuf/python/google/protobuf/descriptor_database.py +137 -0
- data/ext/protoc/protobuf/python/google/protobuf/descriptor_pool.py +643 -0
- data/ext/protoc/protobuf/python/google/protobuf/internal/__init__.py +0 -0
- data/ext/protoc/protobuf/python/google/protobuf/internal/api_implementation.cc +139 -0
- data/ext/protoc/protobuf/python/google/protobuf/internal/api_implementation.py +89 -0
- data/ext/protoc/protobuf/python/google/protobuf/internal/api_implementation_default_test.py +63 -0
- data/ext/protoc/protobuf/python/google/protobuf/internal/containers.py +269 -0
- data/ext/protoc/protobuf/python/google/protobuf/internal/cpp_message.py +663 -0
- data/ext/protoc/protobuf/python/google/protobuf/internal/decoder.py +831 -0
- data/ext/protoc/protobuf/python/google/protobuf/internal/descriptor_database_test.py +63 -0
- data/ext/protoc/protobuf/python/google/protobuf/internal/descriptor_pool_test.py +564 -0
- data/ext/protoc/protobuf/python/google/protobuf/internal/descriptor_pool_test1.proto +94 -0
- data/ext/protoc/protobuf/python/google/protobuf/internal/descriptor_pool_test2.proto +70 -0
- data/ext/protoc/protobuf/python/google/protobuf/internal/descriptor_python_test.py +54 -0
- data/ext/protoc/protobuf/python/google/protobuf/internal/descriptor_test.py +669 -0
- data/ext/protoc/protobuf/python/google/protobuf/internal/encoder.py +788 -0
- data/ext/protoc/protobuf/python/google/protobuf/internal/enum_type_wrapper.py +89 -0
- data/ext/protoc/protobuf/python/google/protobuf/internal/factory_test1.proto +57 -0
- data/ext/protoc/protobuf/python/google/protobuf/internal/factory_test2.proto +92 -0
- data/ext/protoc/protobuf/python/google/protobuf/internal/generator_test.py +343 -0
- data/ext/protoc/protobuf/python/google/protobuf/internal/message_factory_python_test.py +54 -0
- data/ext/protoc/protobuf/python/google/protobuf/internal/message_factory_test.py +131 -0
- data/ext/protoc/protobuf/python/google/protobuf/internal/message_listener.py +78 -0
- data/ext/protoc/protobuf/python/google/protobuf/internal/message_python_test.py +54 -0
- data/ext/protoc/protobuf/python/google/protobuf/internal/message_test.py +681 -0
- data/ext/protoc/protobuf/python/google/protobuf/internal/missing_enum_values.proto +50 -0
- data/ext/protoc/protobuf/python/google/protobuf/internal/more_extensions.proto +58 -0
- data/ext/protoc/protobuf/python/google/protobuf/internal/more_extensions_dynamic.proto +49 -0
- data/ext/protoc/protobuf/python/google/protobuf/internal/more_messages.proto +51 -0
- data/ext/protoc/protobuf/python/google/protobuf/internal/python_message.py +1251 -0
- data/ext/protoc/protobuf/python/google/protobuf/internal/reflection_test.py +2934 -0
- data/ext/protoc/protobuf/python/google/protobuf/internal/service_reflection_test.py +136 -0
- data/ext/protoc/protobuf/python/google/protobuf/internal/symbol_database_test.py +120 -0
- data/ext/protoc/protobuf/python/google/protobuf/internal/test_bad_identifiers.proto +52 -0
- data/ext/protoc/protobuf/python/google/protobuf/internal/test_util.py +662 -0
- data/ext/protoc/protobuf/python/google/protobuf/internal/text_encoding_test.py +68 -0
- data/ext/protoc/protobuf/python/google/protobuf/internal/text_format_test.py +743 -0
- data/ext/protoc/protobuf/python/google/protobuf/internal/type_checkers.py +328 -0
- data/ext/protoc/protobuf/python/google/protobuf/internal/unknown_fields_test.py +231 -0
- data/ext/protoc/protobuf/python/google/protobuf/internal/wire_format.py +268 -0
- data/ext/protoc/protobuf/python/google/protobuf/internal/wire_format_test.py +253 -0
- data/ext/protoc/protobuf/python/google/protobuf/message.py +284 -0
- data/ext/protoc/protobuf/python/google/protobuf/message_factory.py +155 -0
- data/ext/protoc/protobuf/python/google/protobuf/pyext/README +6 -0
- data/ext/protoc/protobuf/python/google/protobuf/pyext/__init__.py +0 -0
- data/ext/protoc/protobuf/python/google/protobuf/pyext/cpp_message.py +61 -0
- data/ext/protoc/protobuf/python/google/protobuf/pyext/descriptor.cc +357 -0
- data/ext/protoc/protobuf/python/google/protobuf/pyext/descriptor.h +96 -0
- data/ext/protoc/protobuf/python/google/protobuf/pyext/descriptor_cpp2_test.py +58 -0
- data/ext/protoc/protobuf/python/google/protobuf/pyext/extension_dict.cc +338 -0
- data/ext/protoc/protobuf/python/google/protobuf/pyext/extension_dict.h +123 -0
- data/ext/protoc/protobuf/python/google/protobuf/pyext/message.cc +2561 -0
- data/ext/protoc/protobuf/python/google/protobuf/pyext/message.h +305 -0
- data/ext/protoc/protobuf/python/google/protobuf/pyext/message_factory_cpp2_test.py +56 -0
- data/ext/protoc/protobuf/python/google/protobuf/pyext/proto2_api_test.proto +38 -0
- data/ext/protoc/protobuf/python/google/protobuf/pyext/python.proto +66 -0
- data/ext/protoc/protobuf/python/google/protobuf/pyext/python_protobuf.h +57 -0
- data/ext/protoc/protobuf/python/google/protobuf/pyext/reflection_cpp2_generated_test.py +94 -0
- data/ext/protoc/protobuf/python/google/protobuf/pyext/repeated_composite_container.cc +763 -0
- data/ext/protoc/protobuf/python/google/protobuf/pyext/repeated_composite_container.h +172 -0
- data/ext/protoc/protobuf/python/google/protobuf/pyext/repeated_scalar_container.cc +825 -0
- data/ext/protoc/protobuf/python/google/protobuf/pyext/repeated_scalar_container.h +112 -0
- data/ext/protoc/protobuf/python/google/protobuf/pyext/scoped_pyobject_ptr.h +95 -0
- data/ext/protoc/protobuf/python/google/protobuf/reflection.py +205 -0
- data/ext/protoc/protobuf/python/google/protobuf/service.py +226 -0
- data/ext/protoc/protobuf/python/google/protobuf/service_reflection.py +284 -0
- data/ext/protoc/protobuf/python/google/protobuf/symbol_database.py +185 -0
- data/ext/protoc/protobuf/python/google/protobuf/text_encoding.py +110 -0
- data/ext/protoc/protobuf/python/google/protobuf/text_format.py +873 -0
- data/ext/protoc/protobuf/python/mox.py +1401 -0
- data/ext/protoc/protobuf/python/setup.py +201 -0
- data/ext/protoc/protobuf/python/stubout.py +140 -0
- data/ext/protoc/protobuf/src/Makefile.am +418 -0
- data/ext/protoc/protobuf/src/google/protobuf/SEBS +240 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/code_generator.cc +84 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/code_generator.h +145 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/command_line_interface.cc +1603 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/command_line_interface.h +378 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/command_line_interface_unittest.cc +1654 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_bootstrap_unittest.cc +158 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_enum.cc +288 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_enum.h +103 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_enum_field.cc +431 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_enum_field.h +122 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_extension.cc +210 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_extension.h +86 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_field.cc +166 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_field.h +185 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_file.cc +665 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_file.h +99 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_generator.cc +125 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_generator.h +72 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_helpers.cc +494 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_helpers.h +206 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_message.cc +2645 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_message.h +175 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_message_field.cc +375 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_message_field.h +121 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_options.h +58 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_plugin_unittest.cc +123 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_primitive_field.cc +451 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_primitive_field.h +123 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_service.cc +334 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_service.h +118 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_string_field.cc +642 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_string_field.h +127 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_test_bad_identifiers.proto +132 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_unittest.cc +2074 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/cpp/cpp_unittest.h +51 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/importer.cc +480 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/importer.h +317 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/importer_unittest.cc +617 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_context.cc +195 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_context.h +95 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_doc_comment.cc +233 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_doc_comment.h +69 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_doc_comment_unittest.cc +67 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_enum.cc +333 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_enum.h +99 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_enum_field.cc +778 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_enum_field.h +158 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_extension.cc +207 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_extension.h +109 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_field.cc +213 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_field.h +162 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_file.cc +534 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_file.h +115 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_generator.cc +158 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_generator.h +72 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_generator_factory.cc +77 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_generator_factory.h +101 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_helpers.cc +737 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_helpers.h +322 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_lazy_message_field.cc +826 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_lazy_message_field.h +121 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_message.cc +1666 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_message.h +140 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_message_field.cc +1343 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_message_field.h +173 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_name_resolver.cc +266 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_name_resolver.h +124 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_plugin_unittest.cc +124 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_primitive_field.cc +877 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_primitive_field.h +160 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_service.cc +473 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_service.h +135 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_shared_code_generator.cc +201 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_shared_code_generator.h +90 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_string_field.cc +1056 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/java/java_string_field.h +160 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/main.cc +61 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/mock_code_generator.cc +240 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/mock_code_generator.h +117 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/package_info.h +64 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/parser.cc +1750 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/parser.h +522 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/parser_unittest.cc +2612 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/plugin.cc +163 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/plugin.h +72 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/plugin.pb.cc +1148 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/plugin.pb.h +897 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/plugin.proto +147 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/python/python_generator.cc +1262 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/python/python_generator.h +166 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/python/python_plugin_unittest.cc +118 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/subprocess.cc +463 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/subprocess.h +108 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/test_plugin.cc +51 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/zip_output_unittest.sh +91 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/zip_writer.cc +218 -0
- data/ext/protoc/protobuf/src/google/protobuf/compiler/zip_writer.h +93 -0
- data/ext/protoc/protobuf/src/google/protobuf/descriptor.cc +5420 -0
- data/ext/protoc/protobuf/src/google/protobuf/descriptor.h +1691 -0
- data/ext/protoc/protobuf/src/google/protobuf/descriptor.pb.cc +9135 -0
- data/ext/protoc/protobuf/src/google/protobuf/descriptor.pb.h +6761 -0
- data/ext/protoc/protobuf/src/google/protobuf/descriptor.proto +687 -0
- data/ext/protoc/protobuf/src/google/protobuf/descriptor_database.cc +543 -0
- data/ext/protoc/protobuf/src/google/protobuf/descriptor_database.h +369 -0
- data/ext/protoc/protobuf/src/google/protobuf/descriptor_database_unittest.cc +748 -0
- data/ext/protoc/protobuf/src/google/protobuf/descriptor_pb2_test.py +54 -0
- data/ext/protoc/protobuf/src/google/protobuf/descriptor_unittest.cc +5501 -0
- data/ext/protoc/protobuf/src/google/protobuf/dynamic_message.cc +764 -0
- data/ext/protoc/protobuf/src/google/protobuf/dynamic_message.h +148 -0
- data/ext/protoc/protobuf/src/google/protobuf/dynamic_message_unittest.cc +230 -0
- data/ext/protoc/protobuf/src/google/protobuf/extension_set.cc +1663 -0
- data/ext/protoc/protobuf/src/google/protobuf/extension_set.h +1234 -0
- data/ext/protoc/protobuf/src/google/protobuf/extension_set_heavy.cc +734 -0
- data/ext/protoc/protobuf/src/google/protobuf/extension_set_unittest.cc +1095 -0
- data/ext/protoc/protobuf/src/google/protobuf/generated_enum_reflection.h +91 -0
- data/ext/protoc/protobuf/src/google/protobuf/generated_message_reflection.cc +1683 -0
- data/ext/protoc/protobuf/src/google/protobuf/generated_message_reflection.h +504 -0
- data/ext/protoc/protobuf/src/google/protobuf/generated_message_reflection_unittest.cc +795 -0
- data/ext/protoc/protobuf/src/google/protobuf/generated_message_util.cc +65 -0
- data/ext/protoc/protobuf/src/google/protobuf/generated_message_util.h +113 -0
- data/ext/protoc/protobuf/src/google/protobuf/io/coded_stream.cc +914 -0
- data/ext/protoc/protobuf/src/google/protobuf/io/coded_stream.h +1220 -0
- data/ext/protoc/protobuf/src/google/protobuf/io/coded_stream_inl.h +69 -0
- data/ext/protoc/protobuf/src/google/protobuf/io/coded_stream_unittest.cc +1378 -0
- data/ext/protoc/protobuf/src/google/protobuf/io/gzip_stream.cc +326 -0
- data/ext/protoc/protobuf/src/google/protobuf/io/gzip_stream.h +209 -0
- data/ext/protoc/protobuf/src/google/protobuf/io/gzip_stream_unittest.sh +44 -0
- data/ext/protoc/protobuf/src/google/protobuf/io/package_info.h +54 -0
- data/ext/protoc/protobuf/src/google/protobuf/io/printer.cc +198 -0
- data/ext/protoc/protobuf/src/google/protobuf/io/printer.h +136 -0
- data/ext/protoc/protobuf/src/google/protobuf/io/printer_unittest.cc +285 -0
- data/ext/protoc/protobuf/src/google/protobuf/io/strtod.cc +113 -0
- data/ext/protoc/protobuf/src/google/protobuf/io/strtod.h +50 -0
- data/ext/protoc/protobuf/src/google/protobuf/io/tokenizer.cc +1127 -0
- data/ext/protoc/protobuf/src/google/protobuf/io/tokenizer.h +402 -0
- data/ext/protoc/protobuf/src/google/protobuf/io/tokenizer_unittest.cc +999 -0
- data/ext/protoc/protobuf/src/google/protobuf/io/zero_copy_stream.cc +57 -0
- data/ext/protoc/protobuf/src/google/protobuf/io/zero_copy_stream.h +248 -0
- data/ext/protoc/protobuf/src/google/protobuf/io/zero_copy_stream_impl.cc +473 -0
- data/ext/protoc/protobuf/src/google/protobuf/io/zero_copy_stream_impl.h +358 -0
- data/ext/protoc/protobuf/src/google/protobuf/io/zero_copy_stream_impl_lite.cc +405 -0
- data/ext/protoc/protobuf/src/google/protobuf/io/zero_copy_stream_impl_lite.h +354 -0
- data/ext/protoc/protobuf/src/google/protobuf/io/zero_copy_stream_unittest.cc +965 -0
- data/ext/protoc/protobuf/src/google/protobuf/lite_unittest.cc +350 -0
- data/ext/protoc/protobuf/src/google/protobuf/message.cc +358 -0
- data/ext/protoc/protobuf/src/google/protobuf/message.h +866 -0
- data/ext/protoc/protobuf/src/google/protobuf/message_lite.cc +335 -0
- data/ext/protoc/protobuf/src/google/protobuf/message_lite.h +247 -0
- data/ext/protoc/protobuf/src/google/protobuf/message_unittest.cc +427 -0
- data/ext/protoc/protobuf/src/google/protobuf/package_info.h +64 -0
- data/ext/protoc/protobuf/src/google/protobuf/reflection_ops.cc +269 -0
- data/ext/protoc/protobuf/src/google/protobuf/reflection_ops.h +81 -0
- data/ext/protoc/protobuf/src/google/protobuf/reflection_ops_unittest.cc +475 -0
- data/ext/protoc/protobuf/src/google/protobuf/repeated_field.cc +87 -0
- data/ext/protoc/protobuf/src/google/protobuf/repeated_field.h +1603 -0
- data/ext/protoc/protobuf/src/google/protobuf/repeated_field_reflection_unittest.cc +195 -0
- data/ext/protoc/protobuf/src/google/protobuf/repeated_field_unittest.cc +1442 -0
- data/ext/protoc/protobuf/src/google/protobuf/service.cc +46 -0
- data/ext/protoc/protobuf/src/google/protobuf/service.h +291 -0
- data/ext/protoc/protobuf/src/google/protobuf/stubs/atomicops.h +227 -0
- data/ext/protoc/protobuf/src/google/protobuf/stubs/atomicops_internals_arm64_gcc.h +325 -0
- data/ext/protoc/protobuf/src/google/protobuf/stubs/atomicops_internals_arm_gcc.h +151 -0
- data/ext/protoc/protobuf/src/google/protobuf/stubs/atomicops_internals_arm_qnx.h +146 -0
- data/ext/protoc/protobuf/src/google/protobuf/stubs/atomicops_internals_atomicword_compat.h +122 -0
- data/ext/protoc/protobuf/src/google/protobuf/stubs/atomicops_internals_generic_gcc.h +137 -0
- data/ext/protoc/protobuf/src/google/protobuf/stubs/atomicops_internals_macosx.h +225 -0
- data/ext/protoc/protobuf/src/google/protobuf/stubs/atomicops_internals_mips_gcc.h +313 -0
- data/ext/protoc/protobuf/src/google/protobuf/stubs/atomicops_internals_pnacl.h +73 -0
- data/ext/protoc/protobuf/src/google/protobuf/stubs/atomicops_internals_solaris.h +188 -0
- data/ext/protoc/protobuf/src/google/protobuf/stubs/atomicops_internals_tsan.h +219 -0
- data/ext/protoc/protobuf/src/google/protobuf/stubs/atomicops_internals_x86_gcc.cc +137 -0
- data/ext/protoc/protobuf/src/google/protobuf/stubs/atomicops_internals_x86_gcc.h +293 -0
- data/ext/protoc/protobuf/src/google/protobuf/stubs/atomicops_internals_x86_msvc.cc +112 -0
- data/ext/protoc/protobuf/src/google/protobuf/stubs/atomicops_internals_x86_msvc.h +150 -0
- data/ext/protoc/protobuf/src/google/protobuf/stubs/common.cc +395 -0
- data/ext/protoc/protobuf/src/google/protobuf/stubs/common.h +1226 -0
- data/ext/protoc/protobuf/src/google/protobuf/stubs/common_unittest.cc +357 -0
- data/ext/protoc/protobuf/src/google/protobuf/stubs/hash.h +232 -0
- data/ext/protoc/protobuf/src/google/protobuf/stubs/map_util.h +771 -0
- data/ext/protoc/protobuf/src/google/protobuf/stubs/once.cc +99 -0
- data/ext/protoc/protobuf/src/google/protobuf/stubs/once.h +166 -0
- data/ext/protoc/protobuf/src/google/protobuf/stubs/once_unittest.cc +253 -0
- data/ext/protoc/protobuf/src/google/protobuf/stubs/platform_macros.h +103 -0
- data/ext/protoc/protobuf/src/google/protobuf/stubs/shared_ptr.h +470 -0
- data/ext/protoc/protobuf/src/google/protobuf/stubs/stl_util.h +121 -0
- data/ext/protoc/protobuf/src/google/protobuf/stubs/stringprintf.cc +175 -0
- data/ext/protoc/protobuf/src/google/protobuf/stubs/stringprintf.h +76 -0
- data/ext/protoc/protobuf/src/google/protobuf/stubs/stringprintf_unittest.cc +152 -0
- data/ext/protoc/protobuf/src/google/protobuf/stubs/structurally_valid.cc +536 -0
- data/ext/protoc/protobuf/src/google/protobuf/stubs/structurally_valid_unittest.cc +40 -0
- data/ext/protoc/protobuf/src/google/protobuf/stubs/strutil.cc +1279 -0
- data/ext/protoc/protobuf/src/google/protobuf/stubs/strutil.h +562 -0
- data/ext/protoc/protobuf/src/google/protobuf/stubs/strutil_unittest.cc +73 -0
- data/ext/protoc/protobuf/src/google/protobuf/stubs/substitute.cc +134 -0
- data/ext/protoc/protobuf/src/google/protobuf/stubs/substitute.h +170 -0
- data/ext/protoc/protobuf/src/google/protobuf/stubs/template_util.h +138 -0
- data/ext/protoc/protobuf/src/google/protobuf/stubs/template_util_unittest.cc +130 -0
- data/ext/protoc/protobuf/src/google/protobuf/stubs/type_traits.h +336 -0
- data/ext/protoc/protobuf/src/google/protobuf/stubs/type_traits_unittest.cc +628 -0
- data/ext/protoc/protobuf/src/google/protobuf/test_util.cc +3345 -0
- data/ext/protoc/protobuf/src/google/protobuf/test_util.h +215 -0
- data/ext/protoc/protobuf/src/google/protobuf/test_util_lite.cc +1585 -0
- data/ext/protoc/protobuf/src/google/protobuf/test_util_lite.h +101 -0
- data/ext/protoc/protobuf/src/google/protobuf/testdata/bad_utf8_string +1 -0
- data/ext/protoc/protobuf/src/google/protobuf/testdata/golden_message +0 -0
- data/ext/protoc/protobuf/src/google/protobuf/testdata/golden_message_oneof_implemented +0 -0
- data/ext/protoc/protobuf/src/google/protobuf/testdata/golden_packed_fields_message +0 -0
- data/ext/protoc/protobuf/src/google/protobuf/testdata/text_format_unittest_data.txt +134 -0
- data/ext/protoc/protobuf/src/google/protobuf/testdata/text_format_unittest_data_oneof_implemented.txt +129 -0
- data/ext/protoc/protobuf/src/google/protobuf/testdata/text_format_unittest_data_pointy.txt +134 -0
- data/ext/protoc/protobuf/src/google/protobuf/testdata/text_format_unittest_data_pointy_oneof.txt +129 -0
- data/ext/protoc/protobuf/src/google/protobuf/testdata/text_format_unittest_extensions_data.txt +134 -0
- data/ext/protoc/protobuf/src/google/protobuf/testdata/text_format_unittest_extensions_data_pointy.txt +134 -0
- data/ext/protoc/protobuf/src/google/protobuf/testing/file.cc +194 -0
- data/ext/protoc/protobuf/src/google/protobuf/testing/file.h +97 -0
- data/ext/protoc/protobuf/src/google/protobuf/testing/googletest.cc +255 -0
- data/ext/protoc/protobuf/src/google/protobuf/testing/googletest.h +102 -0
- data/ext/protoc/protobuf/src/google/protobuf/testing/zcgunzip.cc +73 -0
- data/ext/protoc/protobuf/src/google/protobuf/testing/zcgzip.cc +79 -0
- data/ext/protoc/protobuf/src/google/protobuf/text_format.cc +1746 -0
- data/ext/protoc/protobuf/src/google/protobuf/text_format.h +473 -0
- data/ext/protoc/protobuf/src/google/protobuf/text_format_unittest.cc +1479 -0
- data/ext/protoc/protobuf/src/google/protobuf/unittest.proto +861 -0
- data/ext/protoc/protobuf/src/google/protobuf/unittest_custom_options.proto +393 -0
- data/ext/protoc/protobuf/src/google/protobuf/unittest_embed_optimize_for.proto +50 -0
- data/ext/protoc/protobuf/src/google/protobuf/unittest_empty.proto +37 -0
- data/ext/protoc/protobuf/src/google/protobuf/unittest_enormous_descriptor.proto +1046 -0
- data/ext/protoc/protobuf/src/google/protobuf/unittest_import.proto +64 -0
- data/ext/protoc/protobuf/src/google/protobuf/unittest_import_lite.proto +51 -0
- data/ext/protoc/protobuf/src/google/protobuf/unittest_import_public.proto +40 -0
- data/ext/protoc/protobuf/src/google/protobuf/unittest_import_public_lite.proto +42 -0
- data/ext/protoc/protobuf/src/google/protobuf/unittest_lite.proto +384 -0
- data/ext/protoc/protobuf/src/google/protobuf/unittest_lite_imports_nonlite.proto +43 -0
- data/ext/protoc/protobuf/src/google/protobuf/unittest_mset.proto +83 -0
- data/ext/protoc/protobuf/src/google/protobuf/unittest_no_generic_services.proto +53 -0
- data/ext/protoc/protobuf/src/google/protobuf/unittest_optimize_for.proto +66 -0
- data/ext/protoc/protobuf/src/google/protobuf/unknown_field_set.cc +265 -0
- data/ext/protoc/protobuf/src/google/protobuf/unknown_field_set.h +318 -0
- data/ext/protoc/protobuf/src/google/protobuf/unknown_field_set_unittest.cc +599 -0
- data/ext/protoc/protobuf/src/google/protobuf/wire_format.cc +1101 -0
- data/ext/protoc/protobuf/src/google/protobuf/wire_format.h +336 -0
- data/ext/protoc/protobuf/src/google/protobuf/wire_format_lite.cc +471 -0
- data/ext/protoc/protobuf/src/google/protobuf/wire_format_lite.h +661 -0
- data/ext/protoc/protobuf/src/google/protobuf/wire_format_lite_inl.h +860 -0
- data/ext/protoc/protobuf/src/google/protobuf/wire_format_unittest.cc +1120 -0
- data/ext/protoc/protobuf/src/solaris/libstdc++.la +51 -0
- data/ext/protoc/protobuf/vsprojects/config.h +29 -0
- data/ext/protoc/protobuf/vsprojects/convert2008to2005.sh +20 -0
- data/ext/protoc/protobuf/vsprojects/extract_includes.bat +50 -0
- data/ext/protoc/protobuf/vsprojects/libprotobuf-lite.vcproj +302 -0
- data/ext/protoc/protobuf/vsprojects/libprotobuf.vcproj +470 -0
- data/ext/protoc/protobuf/vsprojects/libprotoc.vcproj +466 -0
- data/ext/protoc/protobuf/vsprojects/lite-test.vcproj +305 -0
- data/ext/protoc/protobuf/vsprojects/protobuf.sln +92 -0
- data/ext/protoc/protobuf/vsprojects/protoc.vcproj +192 -0
- data/ext/protoc/protobuf/vsprojects/readme.txt +114 -0
- data/ext/protoc/protobuf/vsprojects/test_plugin.vcproj +209 -0
- data/ext/protoc/protobuf/vsprojects/tests.vcproj +681 -0
- data/lib/protoc/version.rb +1 -1
- metadata +480 -3
|
@@ -0,0 +1,354 @@
|
|
|
1
|
+
// Protocol Buffers - Google's data interchange format
|
|
2
|
+
// Copyright 2008 Google Inc. All rights reserved.
|
|
3
|
+
// https://developers.google.com/protocol-buffers/
|
|
4
|
+
//
|
|
5
|
+
// Redistribution and use in source and binary forms, with or without
|
|
6
|
+
// modification, are permitted provided that the following conditions are
|
|
7
|
+
// met:
|
|
8
|
+
//
|
|
9
|
+
// * Redistributions of source code must retain the above copyright
|
|
10
|
+
// notice, this list of conditions and the following disclaimer.
|
|
11
|
+
// * Redistributions in binary form must reproduce the above
|
|
12
|
+
// copyright notice, this list of conditions and the following disclaimer
|
|
13
|
+
// in the documentation and/or other materials provided with the
|
|
14
|
+
// distribution.
|
|
15
|
+
// * Neither the name of Google Inc. nor the names of its
|
|
16
|
+
// contributors may be used to endorse or promote products derived from
|
|
17
|
+
// this software without specific prior written permission.
|
|
18
|
+
//
|
|
19
|
+
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
20
|
+
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
21
|
+
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
22
|
+
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
23
|
+
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
24
|
+
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
25
|
+
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
26
|
+
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
27
|
+
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
28
|
+
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
29
|
+
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
30
|
+
|
|
31
|
+
// Author: kenton@google.com (Kenton Varda)
|
|
32
|
+
// Based on original Protocol Buffers design by
|
|
33
|
+
// Sanjay Ghemawat, Jeff Dean, and others.
|
|
34
|
+
//
|
|
35
|
+
// This file contains common implementations of the interfaces defined in
|
|
36
|
+
// zero_copy_stream.h which are included in the "lite" protobuf library.
|
|
37
|
+
// These implementations cover I/O on raw arrays and strings, as well as
|
|
38
|
+
// adaptors which make it easy to implement streams based on traditional
|
|
39
|
+
// streams. Of course, many users will probably want to write their own
|
|
40
|
+
// implementations of these interfaces specific to the particular I/O
|
|
41
|
+
// abstractions they prefer to use, but these should cover the most common
|
|
42
|
+
// cases.
|
|
43
|
+
|
|
44
|
+
#ifndef GOOGLE_PROTOBUF_IO_ZERO_COPY_STREAM_IMPL_LITE_H__
|
|
45
|
+
#define GOOGLE_PROTOBUF_IO_ZERO_COPY_STREAM_IMPL_LITE_H__
|
|
46
|
+
|
|
47
|
+
#include <string>
|
|
48
|
+
#include <iosfwd>
|
|
49
|
+
#include <google/protobuf/io/zero_copy_stream.h>
|
|
50
|
+
#include <google/protobuf/stubs/common.h>
|
|
51
|
+
#include <google/protobuf/stubs/stl_util.h>
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
namespace google {
|
|
55
|
+
namespace protobuf {
|
|
56
|
+
namespace io {
|
|
57
|
+
|
|
58
|
+
// ===================================================================
|
|
59
|
+
|
|
60
|
+
// A ZeroCopyInputStream backed by an in-memory array of bytes.
|
|
61
|
+
class LIBPROTOBUF_EXPORT ArrayInputStream : public ZeroCopyInputStream {
|
|
62
|
+
public:
|
|
63
|
+
// Create an InputStream that returns the bytes pointed to by "data".
|
|
64
|
+
// "data" remains the property of the caller but must remain valid until
|
|
65
|
+
// the stream is destroyed. If a block_size is given, calls to Next()
|
|
66
|
+
// will return data blocks no larger than the given size. Otherwise, the
|
|
67
|
+
// first call to Next() returns the entire array. block_size is mainly
|
|
68
|
+
// useful for testing; in production you would probably never want to set
|
|
69
|
+
// it.
|
|
70
|
+
ArrayInputStream(const void* data, int size, int block_size = -1);
|
|
71
|
+
~ArrayInputStream();
|
|
72
|
+
|
|
73
|
+
// implements ZeroCopyInputStream ----------------------------------
|
|
74
|
+
bool Next(const void** data, int* size);
|
|
75
|
+
void BackUp(int count);
|
|
76
|
+
bool Skip(int count);
|
|
77
|
+
int64 ByteCount() const;
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
private:
|
|
81
|
+
const uint8* const data_; // The byte array.
|
|
82
|
+
const int size_; // Total size of the array.
|
|
83
|
+
const int block_size_; // How many bytes to return at a time.
|
|
84
|
+
|
|
85
|
+
int position_;
|
|
86
|
+
int last_returned_size_; // How many bytes we returned last time Next()
|
|
87
|
+
// was called (used for error checking only).
|
|
88
|
+
|
|
89
|
+
GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ArrayInputStream);
|
|
90
|
+
};
|
|
91
|
+
|
|
92
|
+
// ===================================================================
|
|
93
|
+
|
|
94
|
+
// A ZeroCopyOutputStream backed by an in-memory array of bytes.
|
|
95
|
+
class LIBPROTOBUF_EXPORT ArrayOutputStream : public ZeroCopyOutputStream {
|
|
96
|
+
public:
|
|
97
|
+
// Create an OutputStream that writes to the bytes pointed to by "data".
|
|
98
|
+
// "data" remains the property of the caller but must remain valid until
|
|
99
|
+
// the stream is destroyed. If a block_size is given, calls to Next()
|
|
100
|
+
// will return data blocks no larger than the given size. Otherwise, the
|
|
101
|
+
// first call to Next() returns the entire array. block_size is mainly
|
|
102
|
+
// useful for testing; in production you would probably never want to set
|
|
103
|
+
// it.
|
|
104
|
+
ArrayOutputStream(void* data, int size, int block_size = -1);
|
|
105
|
+
~ArrayOutputStream();
|
|
106
|
+
|
|
107
|
+
// implements ZeroCopyOutputStream ---------------------------------
|
|
108
|
+
bool Next(void** data, int* size);
|
|
109
|
+
void BackUp(int count);
|
|
110
|
+
int64 ByteCount() const;
|
|
111
|
+
|
|
112
|
+
private:
|
|
113
|
+
uint8* const data_; // The byte array.
|
|
114
|
+
const int size_; // Total size of the array.
|
|
115
|
+
const int block_size_; // How many bytes to return at a time.
|
|
116
|
+
|
|
117
|
+
int position_;
|
|
118
|
+
int last_returned_size_; // How many bytes we returned last time Next()
|
|
119
|
+
// was called (used for error checking only).
|
|
120
|
+
|
|
121
|
+
GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(ArrayOutputStream);
|
|
122
|
+
};
|
|
123
|
+
|
|
124
|
+
// ===================================================================
|
|
125
|
+
|
|
126
|
+
// A ZeroCopyOutputStream which appends bytes to a string.
|
|
127
|
+
class LIBPROTOBUF_EXPORT StringOutputStream : public ZeroCopyOutputStream {
|
|
128
|
+
public:
|
|
129
|
+
// Create a StringOutputStream which appends bytes to the given string.
|
|
130
|
+
// The string remains property of the caller, but it MUST NOT be accessed
|
|
131
|
+
// in any way until the stream is destroyed.
|
|
132
|
+
//
|
|
133
|
+
// Hint: If you call target->reserve(n) before creating the stream,
|
|
134
|
+
// the first call to Next() will return at least n bytes of buffer
|
|
135
|
+
// space.
|
|
136
|
+
explicit StringOutputStream(string* target);
|
|
137
|
+
~StringOutputStream();
|
|
138
|
+
|
|
139
|
+
// implements ZeroCopyOutputStream ---------------------------------
|
|
140
|
+
bool Next(void** data, int* size);
|
|
141
|
+
void BackUp(int count);
|
|
142
|
+
int64 ByteCount() const;
|
|
143
|
+
|
|
144
|
+
private:
|
|
145
|
+
static const int kMinimumSize = 16;
|
|
146
|
+
|
|
147
|
+
string* target_;
|
|
148
|
+
|
|
149
|
+
GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(StringOutputStream);
|
|
150
|
+
};
|
|
151
|
+
|
|
152
|
+
// Note: There is no StringInputStream. Instead, just create an
|
|
153
|
+
// ArrayInputStream as follows:
|
|
154
|
+
// ArrayInputStream input(str.data(), str.size());
|
|
155
|
+
|
|
156
|
+
// ===================================================================
|
|
157
|
+
|
|
158
|
+
// A generic traditional input stream interface.
|
|
159
|
+
//
|
|
160
|
+
// Lots of traditional input streams (e.g. file descriptors, C stdio
|
|
161
|
+
// streams, and C++ iostreams) expose an interface where every read
|
|
162
|
+
// involves copying bytes into a buffer. If you want to take such an
|
|
163
|
+
// interface and make a ZeroCopyInputStream based on it, simply implement
|
|
164
|
+
// CopyingInputStream and then use CopyingInputStreamAdaptor.
|
|
165
|
+
//
|
|
166
|
+
// CopyingInputStream implementations should avoid buffering if possible.
|
|
167
|
+
// CopyingInputStreamAdaptor does its own buffering and will read data
|
|
168
|
+
// in large blocks.
|
|
169
|
+
class LIBPROTOBUF_EXPORT CopyingInputStream {
|
|
170
|
+
public:
|
|
171
|
+
virtual ~CopyingInputStream();
|
|
172
|
+
|
|
173
|
+
// Reads up to "size" bytes into the given buffer. Returns the number of
|
|
174
|
+
// bytes read. Read() waits until at least one byte is available, or
|
|
175
|
+
// returns zero if no bytes will ever become available (EOF), or -1 if a
|
|
176
|
+
// permanent read error occurred.
|
|
177
|
+
virtual int Read(void* buffer, int size) = 0;
|
|
178
|
+
|
|
179
|
+
// Skips the next "count" bytes of input. Returns the number of bytes
|
|
180
|
+
// actually skipped. This will always be exactly equal to "count" unless
|
|
181
|
+
// EOF was reached or a permanent read error occurred.
|
|
182
|
+
//
|
|
183
|
+
// The default implementation just repeatedly calls Read() into a scratch
|
|
184
|
+
// buffer.
|
|
185
|
+
virtual int Skip(int count);
|
|
186
|
+
};
|
|
187
|
+
|
|
188
|
+
// A ZeroCopyInputStream which reads from a CopyingInputStream. This is
|
|
189
|
+
// useful for implementing ZeroCopyInputStreams that read from traditional
|
|
190
|
+
// streams. Note that this class is not really zero-copy.
|
|
191
|
+
//
|
|
192
|
+
// If you want to read from file descriptors or C++ istreams, this is
|
|
193
|
+
// already implemented for you: use FileInputStream or IstreamInputStream
|
|
194
|
+
// respectively.
|
|
195
|
+
class LIBPROTOBUF_EXPORT CopyingInputStreamAdaptor : public ZeroCopyInputStream {
|
|
196
|
+
public:
|
|
197
|
+
// Creates a stream that reads from the given CopyingInputStream.
|
|
198
|
+
// If a block_size is given, it specifies the number of bytes that
|
|
199
|
+
// should be read and returned with each call to Next(). Otherwise,
|
|
200
|
+
// a reasonable default is used. The caller retains ownership of
|
|
201
|
+
// copying_stream unless SetOwnsCopyingStream(true) is called.
|
|
202
|
+
explicit CopyingInputStreamAdaptor(CopyingInputStream* copying_stream,
|
|
203
|
+
int block_size = -1);
|
|
204
|
+
~CopyingInputStreamAdaptor();
|
|
205
|
+
|
|
206
|
+
// Call SetOwnsCopyingStream(true) to tell the CopyingInputStreamAdaptor to
|
|
207
|
+
// delete the underlying CopyingInputStream when it is destroyed.
|
|
208
|
+
void SetOwnsCopyingStream(bool value) { owns_copying_stream_ = value; }
|
|
209
|
+
|
|
210
|
+
// implements ZeroCopyInputStream ----------------------------------
|
|
211
|
+
bool Next(const void** data, int* size);
|
|
212
|
+
void BackUp(int count);
|
|
213
|
+
bool Skip(int count);
|
|
214
|
+
int64 ByteCount() const;
|
|
215
|
+
|
|
216
|
+
private:
|
|
217
|
+
// Insures that buffer_ is not NULL.
|
|
218
|
+
void AllocateBufferIfNeeded();
|
|
219
|
+
// Frees the buffer and resets buffer_used_.
|
|
220
|
+
void FreeBuffer();
|
|
221
|
+
|
|
222
|
+
// The underlying copying stream.
|
|
223
|
+
CopyingInputStream* copying_stream_;
|
|
224
|
+
bool owns_copying_stream_;
|
|
225
|
+
|
|
226
|
+
// True if we have seen a permenant error from the underlying stream.
|
|
227
|
+
bool failed_;
|
|
228
|
+
|
|
229
|
+
// The current position of copying_stream_, relative to the point where
|
|
230
|
+
// we started reading.
|
|
231
|
+
int64 position_;
|
|
232
|
+
|
|
233
|
+
// Data is read into this buffer. It may be NULL if no buffer is currently
|
|
234
|
+
// in use. Otherwise, it points to an array of size buffer_size_.
|
|
235
|
+
scoped_array<uint8> buffer_;
|
|
236
|
+
const int buffer_size_;
|
|
237
|
+
|
|
238
|
+
// Number of valid bytes currently in the buffer (i.e. the size last
|
|
239
|
+
// returned by Next()). 0 <= buffer_used_ <= buffer_size_.
|
|
240
|
+
int buffer_used_;
|
|
241
|
+
|
|
242
|
+
// Number of bytes in the buffer which were backed up over by a call to
|
|
243
|
+
// BackUp(). These need to be returned again.
|
|
244
|
+
// 0 <= backup_bytes_ <= buffer_used_
|
|
245
|
+
int backup_bytes_;
|
|
246
|
+
|
|
247
|
+
GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(CopyingInputStreamAdaptor);
|
|
248
|
+
};
|
|
249
|
+
|
|
250
|
+
// ===================================================================
|
|
251
|
+
|
|
252
|
+
// A generic traditional output stream interface.
|
|
253
|
+
//
|
|
254
|
+
// Lots of traditional output streams (e.g. file descriptors, C stdio
|
|
255
|
+
// streams, and C++ iostreams) expose an interface where every write
|
|
256
|
+
// involves copying bytes from a buffer. If you want to take such an
|
|
257
|
+
// interface and make a ZeroCopyOutputStream based on it, simply implement
|
|
258
|
+
// CopyingOutputStream and then use CopyingOutputStreamAdaptor.
|
|
259
|
+
//
|
|
260
|
+
// CopyingOutputStream implementations should avoid buffering if possible.
|
|
261
|
+
// CopyingOutputStreamAdaptor does its own buffering and will write data
|
|
262
|
+
// in large blocks.
|
|
263
|
+
class LIBPROTOBUF_EXPORT CopyingOutputStream {
|
|
264
|
+
public:
|
|
265
|
+
virtual ~CopyingOutputStream();
|
|
266
|
+
|
|
267
|
+
// Writes "size" bytes from the given buffer to the output. Returns true
|
|
268
|
+
// if successful, false on a write error.
|
|
269
|
+
virtual bool Write(const void* buffer, int size) = 0;
|
|
270
|
+
};
|
|
271
|
+
|
|
272
|
+
// A ZeroCopyOutputStream which writes to a CopyingOutputStream. This is
|
|
273
|
+
// useful for implementing ZeroCopyOutputStreams that write to traditional
|
|
274
|
+
// streams. Note that this class is not really zero-copy.
|
|
275
|
+
//
|
|
276
|
+
// If you want to write to file descriptors or C++ ostreams, this is
|
|
277
|
+
// already implemented for you: use FileOutputStream or OstreamOutputStream
|
|
278
|
+
// respectively.
|
|
279
|
+
class LIBPROTOBUF_EXPORT CopyingOutputStreamAdaptor : public ZeroCopyOutputStream {
|
|
280
|
+
public:
|
|
281
|
+
// Creates a stream that writes to the given Unix file descriptor.
|
|
282
|
+
// If a block_size is given, it specifies the size of the buffers
|
|
283
|
+
// that should be returned by Next(). Otherwise, a reasonable default
|
|
284
|
+
// is used.
|
|
285
|
+
explicit CopyingOutputStreamAdaptor(CopyingOutputStream* copying_stream,
|
|
286
|
+
int block_size = -1);
|
|
287
|
+
~CopyingOutputStreamAdaptor();
|
|
288
|
+
|
|
289
|
+
// Writes all pending data to the underlying stream. Returns false if a
|
|
290
|
+
// write error occurred on the underlying stream. (The underlying
|
|
291
|
+
// stream itself is not necessarily flushed.)
|
|
292
|
+
bool Flush();
|
|
293
|
+
|
|
294
|
+
// Call SetOwnsCopyingStream(true) to tell the CopyingOutputStreamAdaptor to
|
|
295
|
+
// delete the underlying CopyingOutputStream when it is destroyed.
|
|
296
|
+
void SetOwnsCopyingStream(bool value) { owns_copying_stream_ = value; }
|
|
297
|
+
|
|
298
|
+
// implements ZeroCopyOutputStream ---------------------------------
|
|
299
|
+
bool Next(void** data, int* size);
|
|
300
|
+
void BackUp(int count);
|
|
301
|
+
int64 ByteCount() const;
|
|
302
|
+
|
|
303
|
+
private:
|
|
304
|
+
// Write the current buffer, if it is present.
|
|
305
|
+
bool WriteBuffer();
|
|
306
|
+
// Insures that buffer_ is not NULL.
|
|
307
|
+
void AllocateBufferIfNeeded();
|
|
308
|
+
// Frees the buffer.
|
|
309
|
+
void FreeBuffer();
|
|
310
|
+
|
|
311
|
+
// The underlying copying stream.
|
|
312
|
+
CopyingOutputStream* copying_stream_;
|
|
313
|
+
bool owns_copying_stream_;
|
|
314
|
+
|
|
315
|
+
// True if we have seen a permenant error from the underlying stream.
|
|
316
|
+
bool failed_;
|
|
317
|
+
|
|
318
|
+
// The current position of copying_stream_, relative to the point where
|
|
319
|
+
// we started writing.
|
|
320
|
+
int64 position_;
|
|
321
|
+
|
|
322
|
+
// Data is written from this buffer. It may be NULL if no buffer is
|
|
323
|
+
// currently in use. Otherwise, it points to an array of size buffer_size_.
|
|
324
|
+
scoped_array<uint8> buffer_;
|
|
325
|
+
const int buffer_size_;
|
|
326
|
+
|
|
327
|
+
// Number of valid bytes currently in the buffer (i.e. the size last
|
|
328
|
+
// returned by Next()). When BackUp() is called, we just reduce this.
|
|
329
|
+
// 0 <= buffer_used_ <= buffer_size_.
|
|
330
|
+
int buffer_used_;
|
|
331
|
+
|
|
332
|
+
GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(CopyingOutputStreamAdaptor);
|
|
333
|
+
};
|
|
334
|
+
|
|
335
|
+
// ===================================================================
|
|
336
|
+
|
|
337
|
+
// Return a pointer to mutable characters underlying the given string. The
|
|
338
|
+
// return value is valid until the next time the string is resized. We
|
|
339
|
+
// trust the caller to treat the return value as an array of length s->size().
|
|
340
|
+
inline char* mutable_string_data(string* s) {
|
|
341
|
+
#ifdef LANG_CXX11
|
|
342
|
+
// This should be simpler & faster than string_as_array() because the latter
|
|
343
|
+
// is guaranteed to return NULL when *s is empty, so it has to check for that.
|
|
344
|
+
return &(*s)[0];
|
|
345
|
+
#else
|
|
346
|
+
return string_as_array(s);
|
|
347
|
+
#endif
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
} // namespace io
|
|
351
|
+
} // namespace protobuf
|
|
352
|
+
|
|
353
|
+
} // namespace google
|
|
354
|
+
#endif // GOOGLE_PROTOBUF_IO_ZERO_COPY_STREAM_IMPL_LITE_H__
|
|
@@ -0,0 +1,965 @@
|
|
|
1
|
+
// Protocol Buffers - Google's data interchange format
|
|
2
|
+
// Copyright 2008 Google Inc. All rights reserved.
|
|
3
|
+
// https://developers.google.com/protocol-buffers/
|
|
4
|
+
//
|
|
5
|
+
// Redistribution and use in source and binary forms, with or without
|
|
6
|
+
// modification, are permitted provided that the following conditions are
|
|
7
|
+
// met:
|
|
8
|
+
//
|
|
9
|
+
// * Redistributions of source code must retain the above copyright
|
|
10
|
+
// notice, this list of conditions and the following disclaimer.
|
|
11
|
+
// * Redistributions in binary form must reproduce the above
|
|
12
|
+
// copyright notice, this list of conditions and the following disclaimer
|
|
13
|
+
// in the documentation and/or other materials provided with the
|
|
14
|
+
// distribution.
|
|
15
|
+
// * Neither the name of Google Inc. nor the names of its
|
|
16
|
+
// contributors may be used to endorse or promote products derived from
|
|
17
|
+
// this software without specific prior written permission.
|
|
18
|
+
//
|
|
19
|
+
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
20
|
+
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
21
|
+
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
22
|
+
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
23
|
+
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
24
|
+
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
25
|
+
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
26
|
+
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
27
|
+
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
28
|
+
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
29
|
+
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
30
|
+
|
|
31
|
+
// Author: kenton@google.com (Kenton Varda)
|
|
32
|
+
// Based on original Protocol Buffers design by
|
|
33
|
+
// Sanjay Ghemawat, Jeff Dean, and others.
|
|
34
|
+
//
|
|
35
|
+
// Testing strategy: For each type of I/O (array, string, file, etc.) we
|
|
36
|
+
// create an output stream and write some data to it, then create a
|
|
37
|
+
// corresponding input stream to read the same data back and expect it to
|
|
38
|
+
// match. When the data is written, it is written in several small chunks
|
|
39
|
+
// of varying sizes, with a BackUp() after each chunk. It is read back
|
|
40
|
+
// similarly, but with chunks separated at different points. The whole
|
|
41
|
+
// process is run with a variety of block sizes for both the input and
|
|
42
|
+
// the output.
|
|
43
|
+
//
|
|
44
|
+
// TODO(kenton): Rewrite this test to bring it up to the standards of all
|
|
45
|
+
// the other proto2 tests. May want to wait for gTest to implement
|
|
46
|
+
// "parametized tests" so that one set of tests can be used on all the
|
|
47
|
+
// implementations.
|
|
48
|
+
|
|
49
|
+
#include "config.h"
|
|
50
|
+
|
|
51
|
+
#ifdef _MSC_VER
|
|
52
|
+
#include <io.h>
|
|
53
|
+
#else
|
|
54
|
+
#include <unistd.h>
|
|
55
|
+
#endif
|
|
56
|
+
#include <stdlib.h>
|
|
57
|
+
#include <sys/types.h>
|
|
58
|
+
#include <sys/stat.h>
|
|
59
|
+
#include <fcntl.h>
|
|
60
|
+
#include <errno.h>
|
|
61
|
+
#include <sstream>
|
|
62
|
+
|
|
63
|
+
#include <google/protobuf/io/zero_copy_stream_impl.h>
|
|
64
|
+
#include <google/protobuf/io/coded_stream.h>
|
|
65
|
+
|
|
66
|
+
#if HAVE_ZLIB
|
|
67
|
+
#include <google/protobuf/io/gzip_stream.h>
|
|
68
|
+
#endif
|
|
69
|
+
|
|
70
|
+
#include <google/protobuf/stubs/common.h>
|
|
71
|
+
#include <google/protobuf/testing/googletest.h>
|
|
72
|
+
#include <google/protobuf/testing/file.h>
|
|
73
|
+
#include <gtest/gtest.h>
|
|
74
|
+
|
|
75
|
+
namespace google {
|
|
76
|
+
namespace protobuf {
|
|
77
|
+
namespace io {
|
|
78
|
+
namespace {
|
|
79
|
+
|
|
80
|
+
#ifdef _WIN32
|
|
81
|
+
#define pipe(fds) _pipe(fds, 4096, O_BINARY)
|
|
82
|
+
#endif
|
|
83
|
+
|
|
84
|
+
#ifndef O_BINARY
|
|
85
|
+
#ifdef _O_BINARY
|
|
86
|
+
#define O_BINARY _O_BINARY
|
|
87
|
+
#else
|
|
88
|
+
#define O_BINARY 0 // If this isn't defined, the platform doesn't need it.
|
|
89
|
+
#endif
|
|
90
|
+
#endif
|
|
91
|
+
|
|
92
|
+
class IoTest : public testing::Test {
|
|
93
|
+
protected:
|
|
94
|
+
// Test helpers.
|
|
95
|
+
|
|
96
|
+
// Helper to write an array of data to an output stream.
|
|
97
|
+
bool WriteToOutput(ZeroCopyOutputStream* output, const void* data, int size);
|
|
98
|
+
// Helper to read a fixed-length array of data from an input stream.
|
|
99
|
+
int ReadFromInput(ZeroCopyInputStream* input, void* data, int size);
|
|
100
|
+
// Write a string to the output stream.
|
|
101
|
+
void WriteString(ZeroCopyOutputStream* output, const string& str);
|
|
102
|
+
// Read a number of bytes equal to the size of the given string and checks
|
|
103
|
+
// that it matches the string.
|
|
104
|
+
void ReadString(ZeroCopyInputStream* input, const string& str);
|
|
105
|
+
// Writes some text to the output stream in a particular order. Returns
|
|
106
|
+
// the number of bytes written, incase the caller needs that to set up an
|
|
107
|
+
// input stream.
|
|
108
|
+
int WriteStuff(ZeroCopyOutputStream* output);
|
|
109
|
+
// Reads text from an input stream and expects it to match what
|
|
110
|
+
// WriteStuff() writes.
|
|
111
|
+
void ReadStuff(ZeroCopyInputStream* input);
|
|
112
|
+
|
|
113
|
+
// Similar to WriteStuff, but performs more sophisticated testing.
|
|
114
|
+
int WriteStuffLarge(ZeroCopyOutputStream* output);
|
|
115
|
+
// Reads and tests a stream that should have been written to
|
|
116
|
+
// via WriteStuffLarge().
|
|
117
|
+
void ReadStuffLarge(ZeroCopyInputStream* input);
|
|
118
|
+
|
|
119
|
+
#if HAVE_ZLIB
|
|
120
|
+
string Compress(const string& data, const GzipOutputStream::Options& options);
|
|
121
|
+
string Uncompress(const string& data);
|
|
122
|
+
#endif
|
|
123
|
+
|
|
124
|
+
static const int kBlockSizes[];
|
|
125
|
+
static const int kBlockSizeCount;
|
|
126
|
+
};
|
|
127
|
+
|
|
128
|
+
const int IoTest::kBlockSizes[] = {-1, 1, 2, 5, 7, 10, 23, 64};
|
|
129
|
+
const int IoTest::kBlockSizeCount = GOOGLE_ARRAYSIZE(IoTest::kBlockSizes);
|
|
130
|
+
|
|
131
|
+
bool IoTest::WriteToOutput(ZeroCopyOutputStream* output,
|
|
132
|
+
const void* data, int size) {
|
|
133
|
+
const uint8* in = reinterpret_cast<const uint8*>(data);
|
|
134
|
+
int in_size = size;
|
|
135
|
+
|
|
136
|
+
void* out;
|
|
137
|
+
int out_size;
|
|
138
|
+
|
|
139
|
+
while (true) {
|
|
140
|
+
if (!output->Next(&out, &out_size)) {
|
|
141
|
+
return false;
|
|
142
|
+
}
|
|
143
|
+
EXPECT_GT(out_size, 0);
|
|
144
|
+
|
|
145
|
+
if (in_size <= out_size) {
|
|
146
|
+
memcpy(out, in, in_size);
|
|
147
|
+
output->BackUp(out_size - in_size);
|
|
148
|
+
return true;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
memcpy(out, in, out_size);
|
|
152
|
+
in += out_size;
|
|
153
|
+
in_size -= out_size;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
#define MAX_REPEATED_ZEROS 100
|
|
158
|
+
|
|
159
|
+
int IoTest::ReadFromInput(ZeroCopyInputStream* input, void* data, int size) {
|
|
160
|
+
uint8* out = reinterpret_cast<uint8*>(data);
|
|
161
|
+
int out_size = size;
|
|
162
|
+
|
|
163
|
+
const void* in;
|
|
164
|
+
int in_size = 0;
|
|
165
|
+
|
|
166
|
+
int repeated_zeros = 0;
|
|
167
|
+
|
|
168
|
+
while (true) {
|
|
169
|
+
if (!input->Next(&in, &in_size)) {
|
|
170
|
+
return size - out_size;
|
|
171
|
+
}
|
|
172
|
+
EXPECT_GT(in_size, -1);
|
|
173
|
+
if (in_size == 0) {
|
|
174
|
+
repeated_zeros++;
|
|
175
|
+
} else {
|
|
176
|
+
repeated_zeros = 0;
|
|
177
|
+
}
|
|
178
|
+
EXPECT_LT(repeated_zeros, MAX_REPEATED_ZEROS);
|
|
179
|
+
|
|
180
|
+
if (out_size <= in_size) {
|
|
181
|
+
memcpy(out, in, out_size);
|
|
182
|
+
if (in_size > out_size) {
|
|
183
|
+
input->BackUp(in_size - out_size);
|
|
184
|
+
}
|
|
185
|
+
return size; // Copied all of it.
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
memcpy(out, in, in_size);
|
|
189
|
+
out += in_size;
|
|
190
|
+
out_size -= in_size;
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
void IoTest::WriteString(ZeroCopyOutputStream* output, const string& str) {
|
|
195
|
+
EXPECT_TRUE(WriteToOutput(output, str.c_str(), str.size()));
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
void IoTest::ReadString(ZeroCopyInputStream* input, const string& str) {
|
|
199
|
+
scoped_array<char> buffer(new char[str.size() + 1]);
|
|
200
|
+
buffer[str.size()] = '\0';
|
|
201
|
+
EXPECT_EQ(ReadFromInput(input, buffer.get(), str.size()), str.size());
|
|
202
|
+
EXPECT_STREQ(str.c_str(), buffer.get());
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
int IoTest::WriteStuff(ZeroCopyOutputStream* output) {
|
|
206
|
+
WriteString(output, "Hello world!\n");
|
|
207
|
+
WriteString(output, "Some te");
|
|
208
|
+
WriteString(output, "xt. Blah blah.");
|
|
209
|
+
WriteString(output, "abcdefg");
|
|
210
|
+
WriteString(output, "01234567890123456789");
|
|
211
|
+
WriteString(output, "foobar");
|
|
212
|
+
|
|
213
|
+
EXPECT_EQ(output->ByteCount(), 68);
|
|
214
|
+
|
|
215
|
+
int result = output->ByteCount();
|
|
216
|
+
return result;
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
// Reads text from an input stream and expects it to match what WriteStuff()
|
|
220
|
+
// writes.
|
|
221
|
+
void IoTest::ReadStuff(ZeroCopyInputStream* input) {
|
|
222
|
+
ReadString(input, "Hello world!\n");
|
|
223
|
+
ReadString(input, "Some text. ");
|
|
224
|
+
ReadString(input, "Blah ");
|
|
225
|
+
ReadString(input, "blah.");
|
|
226
|
+
ReadString(input, "abcdefg");
|
|
227
|
+
EXPECT_TRUE(input->Skip(20));
|
|
228
|
+
ReadString(input, "foo");
|
|
229
|
+
ReadString(input, "bar");
|
|
230
|
+
|
|
231
|
+
EXPECT_EQ(input->ByteCount(), 68);
|
|
232
|
+
|
|
233
|
+
uint8 byte;
|
|
234
|
+
EXPECT_EQ(ReadFromInput(input, &byte, 1), 0);
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
int IoTest::WriteStuffLarge(ZeroCopyOutputStream* output) {
|
|
238
|
+
WriteString(output, "Hello world!\n");
|
|
239
|
+
WriteString(output, "Some te");
|
|
240
|
+
WriteString(output, "xt. Blah blah.");
|
|
241
|
+
WriteString(output, string(100000, 'x')); // A very long string
|
|
242
|
+
WriteString(output, string(100000, 'y')); // A very long string
|
|
243
|
+
WriteString(output, "01234567890123456789");
|
|
244
|
+
|
|
245
|
+
EXPECT_EQ(output->ByteCount(), 200055);
|
|
246
|
+
|
|
247
|
+
int result = output->ByteCount();
|
|
248
|
+
return result;
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
// Reads text from an input stream and expects it to match what WriteStuff()
|
|
252
|
+
// writes.
|
|
253
|
+
void IoTest::ReadStuffLarge(ZeroCopyInputStream* input) {
|
|
254
|
+
ReadString(input, "Hello world!\nSome text. ");
|
|
255
|
+
EXPECT_TRUE(input->Skip(5));
|
|
256
|
+
ReadString(input, "blah.");
|
|
257
|
+
EXPECT_TRUE(input->Skip(100000 - 10));
|
|
258
|
+
ReadString(input, string(10, 'x') + string(100000 - 20000, 'y'));
|
|
259
|
+
EXPECT_TRUE(input->Skip(20000 - 10));
|
|
260
|
+
ReadString(input, "yyyyyyyyyy01234567890123456789");
|
|
261
|
+
|
|
262
|
+
EXPECT_EQ(input->ByteCount(), 200055);
|
|
263
|
+
|
|
264
|
+
uint8 byte;
|
|
265
|
+
EXPECT_EQ(ReadFromInput(input, &byte, 1), 0);
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
// ===================================================================
|
|
269
|
+
|
|
270
|
+
TEST_F(IoTest, ArrayIo) {
|
|
271
|
+
const int kBufferSize = 256;
|
|
272
|
+
uint8 buffer[kBufferSize];
|
|
273
|
+
|
|
274
|
+
for (int i = 0; i < kBlockSizeCount; i++) {
|
|
275
|
+
for (int j = 0; j < kBlockSizeCount; j++) {
|
|
276
|
+
int size;
|
|
277
|
+
{
|
|
278
|
+
ArrayOutputStream output(buffer, kBufferSize, kBlockSizes[i]);
|
|
279
|
+
size = WriteStuff(&output);
|
|
280
|
+
}
|
|
281
|
+
{
|
|
282
|
+
ArrayInputStream input(buffer, size, kBlockSizes[j]);
|
|
283
|
+
ReadStuff(&input);
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
TEST_F(IoTest, TwoSessionWrite) {
|
|
290
|
+
// Test that two concatenated write sessions read correctly
|
|
291
|
+
|
|
292
|
+
static const char* strA = "0123456789";
|
|
293
|
+
static const char* strB = "WhirledPeas";
|
|
294
|
+
const int kBufferSize = 2*1024;
|
|
295
|
+
uint8* buffer = new uint8[kBufferSize];
|
|
296
|
+
char* temp_buffer = new char[40];
|
|
297
|
+
|
|
298
|
+
for (int i = 0; i < kBlockSizeCount; i++) {
|
|
299
|
+
for (int j = 0; j < kBlockSizeCount; j++) {
|
|
300
|
+
ArrayOutputStream* output =
|
|
301
|
+
new ArrayOutputStream(buffer, kBufferSize, kBlockSizes[i]);
|
|
302
|
+
CodedOutputStream* coded_output = new CodedOutputStream(output);
|
|
303
|
+
coded_output->WriteVarint32(strlen(strA));
|
|
304
|
+
coded_output->WriteRaw(strA, strlen(strA));
|
|
305
|
+
delete coded_output; // flush
|
|
306
|
+
int64 pos = output->ByteCount();
|
|
307
|
+
delete output;
|
|
308
|
+
output = new ArrayOutputStream(
|
|
309
|
+
buffer + pos, kBufferSize - pos, kBlockSizes[i]);
|
|
310
|
+
coded_output = new CodedOutputStream(output);
|
|
311
|
+
coded_output->WriteVarint32(strlen(strB));
|
|
312
|
+
coded_output->WriteRaw(strB, strlen(strB));
|
|
313
|
+
delete coded_output; // flush
|
|
314
|
+
int64 size = pos + output->ByteCount();
|
|
315
|
+
delete output;
|
|
316
|
+
|
|
317
|
+
ArrayInputStream* input =
|
|
318
|
+
new ArrayInputStream(buffer, size, kBlockSizes[j]);
|
|
319
|
+
CodedInputStream* coded_input = new CodedInputStream(input);
|
|
320
|
+
uint32 insize;
|
|
321
|
+
EXPECT_TRUE(coded_input->ReadVarint32(&insize));
|
|
322
|
+
EXPECT_EQ(strlen(strA), insize);
|
|
323
|
+
EXPECT_TRUE(coded_input->ReadRaw(temp_buffer, insize));
|
|
324
|
+
EXPECT_EQ(0, memcmp(temp_buffer, strA, insize));
|
|
325
|
+
|
|
326
|
+
EXPECT_TRUE(coded_input->ReadVarint32(&insize));
|
|
327
|
+
EXPECT_EQ(strlen(strB), insize);
|
|
328
|
+
EXPECT_TRUE(coded_input->ReadRaw(temp_buffer, insize));
|
|
329
|
+
EXPECT_EQ(0, memcmp(temp_buffer, strB, insize));
|
|
330
|
+
|
|
331
|
+
delete coded_input;
|
|
332
|
+
delete input;
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
delete [] temp_buffer;
|
|
337
|
+
delete [] buffer;
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
#if HAVE_ZLIB
|
|
341
|
+
TEST_F(IoTest, GzipIo) {
|
|
342
|
+
const int kBufferSize = 2*1024;
|
|
343
|
+
uint8* buffer = new uint8[kBufferSize];
|
|
344
|
+
for (int i = 0; i < kBlockSizeCount; i++) {
|
|
345
|
+
for (int j = 0; j < kBlockSizeCount; j++) {
|
|
346
|
+
for (int z = 0; z < kBlockSizeCount; z++) {
|
|
347
|
+
int gzip_buffer_size = kBlockSizes[z];
|
|
348
|
+
int size;
|
|
349
|
+
{
|
|
350
|
+
ArrayOutputStream output(buffer, kBufferSize, kBlockSizes[i]);
|
|
351
|
+
GzipOutputStream::Options options;
|
|
352
|
+
options.format = GzipOutputStream::GZIP;
|
|
353
|
+
if (gzip_buffer_size != -1) {
|
|
354
|
+
options.buffer_size = gzip_buffer_size;
|
|
355
|
+
}
|
|
356
|
+
GzipOutputStream gzout(&output, options);
|
|
357
|
+
WriteStuff(&gzout);
|
|
358
|
+
gzout.Close();
|
|
359
|
+
size = output.ByteCount();
|
|
360
|
+
}
|
|
361
|
+
{
|
|
362
|
+
ArrayInputStream input(buffer, size, kBlockSizes[j]);
|
|
363
|
+
GzipInputStream gzin(
|
|
364
|
+
&input, GzipInputStream::GZIP, gzip_buffer_size);
|
|
365
|
+
ReadStuff(&gzin);
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
delete [] buffer;
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
TEST_F(IoTest, GzipIoWithFlush) {
|
|
374
|
+
const int kBufferSize = 2*1024;
|
|
375
|
+
uint8* buffer = new uint8[kBufferSize];
|
|
376
|
+
// We start with i = 4 as we want a block size > 6. With block size <= 6
|
|
377
|
+
// Flush() fills up the entire 2K buffer with flush markers and the test
|
|
378
|
+
// fails. See documentation for Flush() for more detail.
|
|
379
|
+
for (int i = 4; i < kBlockSizeCount; i++) {
|
|
380
|
+
for (int j = 0; j < kBlockSizeCount; j++) {
|
|
381
|
+
for (int z = 0; z < kBlockSizeCount; z++) {
|
|
382
|
+
int gzip_buffer_size = kBlockSizes[z];
|
|
383
|
+
int size;
|
|
384
|
+
{
|
|
385
|
+
ArrayOutputStream output(buffer, kBufferSize, kBlockSizes[i]);
|
|
386
|
+
GzipOutputStream::Options options;
|
|
387
|
+
options.format = GzipOutputStream::GZIP;
|
|
388
|
+
if (gzip_buffer_size != -1) {
|
|
389
|
+
options.buffer_size = gzip_buffer_size;
|
|
390
|
+
}
|
|
391
|
+
GzipOutputStream gzout(&output, options);
|
|
392
|
+
WriteStuff(&gzout);
|
|
393
|
+
EXPECT_TRUE(gzout.Flush());
|
|
394
|
+
gzout.Close();
|
|
395
|
+
size = output.ByteCount();
|
|
396
|
+
}
|
|
397
|
+
{
|
|
398
|
+
ArrayInputStream input(buffer, size, kBlockSizes[j]);
|
|
399
|
+
GzipInputStream gzin(
|
|
400
|
+
&input, GzipInputStream::GZIP, gzip_buffer_size);
|
|
401
|
+
ReadStuff(&gzin);
|
|
402
|
+
}
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
delete [] buffer;
|
|
407
|
+
}
|
|
408
|
+
|
|
409
|
+
TEST_F(IoTest, GzipIoContiguousFlushes) {
|
|
410
|
+
const int kBufferSize = 2*1024;
|
|
411
|
+
uint8* buffer = new uint8[kBufferSize];
|
|
412
|
+
|
|
413
|
+
int block_size = kBlockSizes[4];
|
|
414
|
+
int gzip_buffer_size = block_size;
|
|
415
|
+
int size;
|
|
416
|
+
|
|
417
|
+
ArrayOutputStream output(buffer, kBufferSize, block_size);
|
|
418
|
+
GzipOutputStream::Options options;
|
|
419
|
+
options.format = GzipOutputStream::GZIP;
|
|
420
|
+
if (gzip_buffer_size != -1) {
|
|
421
|
+
options.buffer_size = gzip_buffer_size;
|
|
422
|
+
}
|
|
423
|
+
GzipOutputStream gzout(&output, options);
|
|
424
|
+
WriteStuff(&gzout);
|
|
425
|
+
EXPECT_TRUE(gzout.Flush());
|
|
426
|
+
EXPECT_TRUE(gzout.Flush());
|
|
427
|
+
gzout.Close();
|
|
428
|
+
size = output.ByteCount();
|
|
429
|
+
|
|
430
|
+
ArrayInputStream input(buffer, size, block_size);
|
|
431
|
+
GzipInputStream gzin(
|
|
432
|
+
&input, GzipInputStream::GZIP, gzip_buffer_size);
|
|
433
|
+
ReadStuff(&gzin);
|
|
434
|
+
|
|
435
|
+
delete [] buffer;
|
|
436
|
+
}
|
|
437
|
+
|
|
438
|
+
TEST_F(IoTest, GzipIoReadAfterFlush) {
|
|
439
|
+
const int kBufferSize = 2*1024;
|
|
440
|
+
uint8* buffer = new uint8[kBufferSize];
|
|
441
|
+
|
|
442
|
+
int block_size = kBlockSizes[4];
|
|
443
|
+
int gzip_buffer_size = block_size;
|
|
444
|
+
int size;
|
|
445
|
+
ArrayOutputStream output(buffer, kBufferSize, block_size);
|
|
446
|
+
GzipOutputStream::Options options;
|
|
447
|
+
options.format = GzipOutputStream::GZIP;
|
|
448
|
+
if (gzip_buffer_size != -1) {
|
|
449
|
+
options.buffer_size = gzip_buffer_size;
|
|
450
|
+
}
|
|
451
|
+
|
|
452
|
+
GzipOutputStream gzout(&output, options);
|
|
453
|
+
WriteStuff(&gzout);
|
|
454
|
+
EXPECT_TRUE(gzout.Flush());
|
|
455
|
+
size = output.ByteCount();
|
|
456
|
+
|
|
457
|
+
ArrayInputStream input(buffer, size, block_size);
|
|
458
|
+
GzipInputStream gzin(
|
|
459
|
+
&input, GzipInputStream::GZIP, gzip_buffer_size);
|
|
460
|
+
ReadStuff(&gzin);
|
|
461
|
+
|
|
462
|
+
gzout.Close();
|
|
463
|
+
|
|
464
|
+
delete [] buffer;
|
|
465
|
+
}
|
|
466
|
+
|
|
467
|
+
TEST_F(IoTest, ZlibIo) {
|
|
468
|
+
const int kBufferSize = 2*1024;
|
|
469
|
+
uint8* buffer = new uint8[kBufferSize];
|
|
470
|
+
for (int i = 0; i < kBlockSizeCount; i++) {
|
|
471
|
+
for (int j = 0; j < kBlockSizeCount; j++) {
|
|
472
|
+
for (int z = 0; z < kBlockSizeCount; z++) {
|
|
473
|
+
int gzip_buffer_size = kBlockSizes[z];
|
|
474
|
+
int size;
|
|
475
|
+
{
|
|
476
|
+
ArrayOutputStream output(buffer, kBufferSize, kBlockSizes[i]);
|
|
477
|
+
GzipOutputStream::Options options;
|
|
478
|
+
options.format = GzipOutputStream::ZLIB;
|
|
479
|
+
if (gzip_buffer_size != -1) {
|
|
480
|
+
options.buffer_size = gzip_buffer_size;
|
|
481
|
+
}
|
|
482
|
+
GzipOutputStream gzout(&output, options);
|
|
483
|
+
WriteStuff(&gzout);
|
|
484
|
+
gzout.Close();
|
|
485
|
+
size = output.ByteCount();
|
|
486
|
+
}
|
|
487
|
+
{
|
|
488
|
+
ArrayInputStream input(buffer, size, kBlockSizes[j]);
|
|
489
|
+
GzipInputStream gzin(
|
|
490
|
+
&input, GzipInputStream::ZLIB, gzip_buffer_size);
|
|
491
|
+
ReadStuff(&gzin);
|
|
492
|
+
}
|
|
493
|
+
}
|
|
494
|
+
}
|
|
495
|
+
}
|
|
496
|
+
delete [] buffer;
|
|
497
|
+
}
|
|
498
|
+
|
|
499
|
+
TEST_F(IoTest, ZlibIoInputAutodetect) {
|
|
500
|
+
const int kBufferSize = 2*1024;
|
|
501
|
+
uint8* buffer = new uint8[kBufferSize];
|
|
502
|
+
int size;
|
|
503
|
+
{
|
|
504
|
+
ArrayOutputStream output(buffer, kBufferSize);
|
|
505
|
+
GzipOutputStream::Options options;
|
|
506
|
+
options.format = GzipOutputStream::ZLIB;
|
|
507
|
+
GzipOutputStream gzout(&output, options);
|
|
508
|
+
WriteStuff(&gzout);
|
|
509
|
+
gzout.Close();
|
|
510
|
+
size = output.ByteCount();
|
|
511
|
+
}
|
|
512
|
+
{
|
|
513
|
+
ArrayInputStream input(buffer, size);
|
|
514
|
+
GzipInputStream gzin(&input, GzipInputStream::AUTO);
|
|
515
|
+
ReadStuff(&gzin);
|
|
516
|
+
}
|
|
517
|
+
{
|
|
518
|
+
ArrayOutputStream output(buffer, kBufferSize);
|
|
519
|
+
GzipOutputStream::Options options;
|
|
520
|
+
options.format = GzipOutputStream::GZIP;
|
|
521
|
+
GzipOutputStream gzout(&output, options);
|
|
522
|
+
WriteStuff(&gzout);
|
|
523
|
+
gzout.Close();
|
|
524
|
+
size = output.ByteCount();
|
|
525
|
+
}
|
|
526
|
+
{
|
|
527
|
+
ArrayInputStream input(buffer, size);
|
|
528
|
+
GzipInputStream gzin(&input, GzipInputStream::AUTO);
|
|
529
|
+
ReadStuff(&gzin);
|
|
530
|
+
}
|
|
531
|
+
delete [] buffer;
|
|
532
|
+
}
|
|
533
|
+
|
|
534
|
+
string IoTest::Compress(const string& data,
|
|
535
|
+
const GzipOutputStream::Options& options) {
|
|
536
|
+
string result;
|
|
537
|
+
{
|
|
538
|
+
StringOutputStream output(&result);
|
|
539
|
+
GzipOutputStream gzout(&output, options);
|
|
540
|
+
WriteToOutput(&gzout, data.data(), data.size());
|
|
541
|
+
}
|
|
542
|
+
return result;
|
|
543
|
+
}
|
|
544
|
+
|
|
545
|
+
string IoTest::Uncompress(const string& data) {
|
|
546
|
+
string result;
|
|
547
|
+
{
|
|
548
|
+
ArrayInputStream input(data.data(), data.size());
|
|
549
|
+
GzipInputStream gzin(&input);
|
|
550
|
+
const void* buffer;
|
|
551
|
+
int size;
|
|
552
|
+
while (gzin.Next(&buffer, &size)) {
|
|
553
|
+
result.append(reinterpret_cast<const char*>(buffer), size);
|
|
554
|
+
}
|
|
555
|
+
}
|
|
556
|
+
return result;
|
|
557
|
+
}
|
|
558
|
+
|
|
559
|
+
TEST_F(IoTest, CompressionOptions) {
|
|
560
|
+
// Some ad-hoc testing of compression options.
|
|
561
|
+
|
|
562
|
+
string golden;
|
|
563
|
+
GOOGLE_CHECK_OK(File::GetContents(
|
|
564
|
+
TestSourceDir() +
|
|
565
|
+
"/google/protobuf/testdata/golden_message",
|
|
566
|
+
&golden, true));
|
|
567
|
+
|
|
568
|
+
GzipOutputStream::Options options;
|
|
569
|
+
string gzip_compressed = Compress(golden, options);
|
|
570
|
+
|
|
571
|
+
options.compression_level = 0;
|
|
572
|
+
string not_compressed = Compress(golden, options);
|
|
573
|
+
|
|
574
|
+
// Try zlib compression for fun.
|
|
575
|
+
options = GzipOutputStream::Options();
|
|
576
|
+
options.format = GzipOutputStream::ZLIB;
|
|
577
|
+
string zlib_compressed = Compress(golden, options);
|
|
578
|
+
|
|
579
|
+
// Uncompressed should be bigger than the original since it should have some
|
|
580
|
+
// sort of header.
|
|
581
|
+
EXPECT_GT(not_compressed.size(), golden.size());
|
|
582
|
+
|
|
583
|
+
// Higher compression levels should result in smaller sizes.
|
|
584
|
+
EXPECT_LT(zlib_compressed.size(), not_compressed.size());
|
|
585
|
+
|
|
586
|
+
// ZLIB format should differ from GZIP format.
|
|
587
|
+
EXPECT_TRUE(zlib_compressed != gzip_compressed);
|
|
588
|
+
|
|
589
|
+
// Everything should decompress correctly.
|
|
590
|
+
EXPECT_TRUE(Uncompress(not_compressed) == golden);
|
|
591
|
+
EXPECT_TRUE(Uncompress(gzip_compressed) == golden);
|
|
592
|
+
EXPECT_TRUE(Uncompress(zlib_compressed) == golden);
|
|
593
|
+
}
|
|
594
|
+
|
|
595
|
+
TEST_F(IoTest, TwoSessionWriteGzip) {
|
|
596
|
+
// Test that two concatenated gzip streams can be read correctly
|
|
597
|
+
|
|
598
|
+
static const char* strA = "0123456789";
|
|
599
|
+
static const char* strB = "QuickBrownFox";
|
|
600
|
+
const int kBufferSize = 2*1024;
|
|
601
|
+
uint8* buffer = new uint8[kBufferSize];
|
|
602
|
+
char* temp_buffer = new char[40];
|
|
603
|
+
|
|
604
|
+
for (int i = 0; i < kBlockSizeCount; i++) {
|
|
605
|
+
for (int j = 0; j < kBlockSizeCount; j++) {
|
|
606
|
+
ArrayOutputStream* output =
|
|
607
|
+
new ArrayOutputStream(buffer, kBufferSize, kBlockSizes[i]);
|
|
608
|
+
GzipOutputStream* gzout = new GzipOutputStream(output);
|
|
609
|
+
CodedOutputStream* coded_output = new CodedOutputStream(gzout);
|
|
610
|
+
int32 outlen = strlen(strA) + 1;
|
|
611
|
+
coded_output->WriteVarint32(outlen);
|
|
612
|
+
coded_output->WriteRaw(strA, outlen);
|
|
613
|
+
delete coded_output; // flush
|
|
614
|
+
delete gzout; // flush
|
|
615
|
+
int64 pos = output->ByteCount();
|
|
616
|
+
delete output;
|
|
617
|
+
output = new ArrayOutputStream(
|
|
618
|
+
buffer + pos, kBufferSize - pos, kBlockSizes[i]);
|
|
619
|
+
gzout = new GzipOutputStream(output);
|
|
620
|
+
coded_output = new CodedOutputStream(gzout);
|
|
621
|
+
outlen = strlen(strB) + 1;
|
|
622
|
+
coded_output->WriteVarint32(outlen);
|
|
623
|
+
coded_output->WriteRaw(strB, outlen);
|
|
624
|
+
delete coded_output; // flush
|
|
625
|
+
delete gzout; // flush
|
|
626
|
+
int64 size = pos + output->ByteCount();
|
|
627
|
+
delete output;
|
|
628
|
+
|
|
629
|
+
ArrayInputStream* input =
|
|
630
|
+
new ArrayInputStream(buffer, size, kBlockSizes[j]);
|
|
631
|
+
GzipInputStream* gzin = new GzipInputStream(input);
|
|
632
|
+
CodedInputStream* coded_input = new CodedInputStream(gzin);
|
|
633
|
+
uint32 insize;
|
|
634
|
+
EXPECT_TRUE(coded_input->ReadVarint32(&insize));
|
|
635
|
+
EXPECT_EQ(strlen(strA) + 1, insize);
|
|
636
|
+
EXPECT_TRUE(coded_input->ReadRaw(temp_buffer, insize));
|
|
637
|
+
EXPECT_EQ(0, memcmp(temp_buffer, strA, insize))
|
|
638
|
+
<< "strA=" << strA << " in=" << temp_buffer;
|
|
639
|
+
|
|
640
|
+
EXPECT_TRUE(coded_input->ReadVarint32(&insize));
|
|
641
|
+
EXPECT_EQ(strlen(strB) + 1, insize);
|
|
642
|
+
EXPECT_TRUE(coded_input->ReadRaw(temp_buffer, insize));
|
|
643
|
+
EXPECT_EQ(0, memcmp(temp_buffer, strB, insize))
|
|
644
|
+
<< " out_block_size=" << kBlockSizes[i]
|
|
645
|
+
<< " in_block_size=" << kBlockSizes[j]
|
|
646
|
+
<< " pos=" << pos
|
|
647
|
+
<< " size=" << size
|
|
648
|
+
<< " strB=" << strB << " in=" << temp_buffer;
|
|
649
|
+
|
|
650
|
+
delete coded_input;
|
|
651
|
+
delete gzin;
|
|
652
|
+
delete input;
|
|
653
|
+
}
|
|
654
|
+
}
|
|
655
|
+
|
|
656
|
+
delete [] temp_buffer;
|
|
657
|
+
delete [] buffer;
|
|
658
|
+
}
|
|
659
|
+
#endif
|
|
660
|
+
|
|
661
|
+
// There is no string input, only string output. Also, it doesn't support
|
|
662
|
+
// explicit block sizes. So, we'll only run one test and we'll use
|
|
663
|
+
// ArrayInput to read back the results.
|
|
664
|
+
TEST_F(IoTest, StringIo) {
|
|
665
|
+
string str;
|
|
666
|
+
{
|
|
667
|
+
StringOutputStream output(&str);
|
|
668
|
+
WriteStuff(&output);
|
|
669
|
+
}
|
|
670
|
+
{
|
|
671
|
+
ArrayInputStream input(str.data(), str.size());
|
|
672
|
+
ReadStuff(&input);
|
|
673
|
+
}
|
|
674
|
+
}
|
|
675
|
+
|
|
676
|
+
|
|
677
|
+
// To test files, we create a temporary file, write, read, truncate, repeat.
|
|
678
|
+
TEST_F(IoTest, FileIo) {
|
|
679
|
+
string filename = TestTempDir() + "/zero_copy_stream_test_file";
|
|
680
|
+
|
|
681
|
+
for (int i = 0; i < kBlockSizeCount; i++) {
|
|
682
|
+
for (int j = 0; j < kBlockSizeCount; j++) {
|
|
683
|
+
// Make a temporary file.
|
|
684
|
+
int file =
|
|
685
|
+
open(filename.c_str(), O_RDWR | O_CREAT | O_TRUNC | O_BINARY, 0777);
|
|
686
|
+
ASSERT_GE(file, 0);
|
|
687
|
+
|
|
688
|
+
{
|
|
689
|
+
FileOutputStream output(file, kBlockSizes[i]);
|
|
690
|
+
WriteStuff(&output);
|
|
691
|
+
EXPECT_EQ(0, output.GetErrno());
|
|
692
|
+
}
|
|
693
|
+
|
|
694
|
+
// Rewind.
|
|
695
|
+
ASSERT_NE(lseek(file, 0, SEEK_SET), (off_t)-1);
|
|
696
|
+
|
|
697
|
+
{
|
|
698
|
+
FileInputStream input(file, kBlockSizes[j]);
|
|
699
|
+
ReadStuff(&input);
|
|
700
|
+
EXPECT_EQ(0, input.GetErrno());
|
|
701
|
+
}
|
|
702
|
+
|
|
703
|
+
close(file);
|
|
704
|
+
}
|
|
705
|
+
}
|
|
706
|
+
}
|
|
707
|
+
|
|
708
|
+
#if HAVE_ZLIB
|
|
709
|
+
TEST_F(IoTest, GzipFileIo) {
|
|
710
|
+
string filename = TestTempDir() + "/zero_copy_stream_test_file";
|
|
711
|
+
|
|
712
|
+
for (int i = 0; i < kBlockSizeCount; i++) {
|
|
713
|
+
for (int j = 0; j < kBlockSizeCount; j++) {
|
|
714
|
+
// Make a temporary file.
|
|
715
|
+
int file =
|
|
716
|
+
open(filename.c_str(), O_RDWR | O_CREAT | O_TRUNC | O_BINARY, 0777);
|
|
717
|
+
ASSERT_GE(file, 0);
|
|
718
|
+
{
|
|
719
|
+
FileOutputStream output(file, kBlockSizes[i]);
|
|
720
|
+
GzipOutputStream gzout(&output);
|
|
721
|
+
WriteStuffLarge(&gzout);
|
|
722
|
+
gzout.Close();
|
|
723
|
+
output.Flush();
|
|
724
|
+
EXPECT_EQ(0, output.GetErrno());
|
|
725
|
+
}
|
|
726
|
+
|
|
727
|
+
// Rewind.
|
|
728
|
+
ASSERT_NE(lseek(file, 0, SEEK_SET), (off_t)-1);
|
|
729
|
+
|
|
730
|
+
{
|
|
731
|
+
FileInputStream input(file, kBlockSizes[j]);
|
|
732
|
+
GzipInputStream gzin(&input);
|
|
733
|
+
ReadStuffLarge(&gzin);
|
|
734
|
+
EXPECT_EQ(0, input.GetErrno());
|
|
735
|
+
}
|
|
736
|
+
|
|
737
|
+
close(file);
|
|
738
|
+
}
|
|
739
|
+
}
|
|
740
|
+
}
|
|
741
|
+
#endif
|
|
742
|
+
|
|
743
|
+
// MSVC raises various debugging exceptions if we try to use a file
|
|
744
|
+
// descriptor of -1, defeating our tests below. This class will disable
|
|
745
|
+
// these debug assertions while in scope.
|
|
746
|
+
class MsvcDebugDisabler {
|
|
747
|
+
public:
|
|
748
|
+
#if defined(_MSC_VER) && _MSC_VER >= 1400
|
|
749
|
+
MsvcDebugDisabler() {
|
|
750
|
+
old_handler_ = _set_invalid_parameter_handler(MyHandler);
|
|
751
|
+
old_mode_ = _CrtSetReportMode(_CRT_ASSERT, 0);
|
|
752
|
+
}
|
|
753
|
+
~MsvcDebugDisabler() {
|
|
754
|
+
old_handler_ = _set_invalid_parameter_handler(old_handler_);
|
|
755
|
+
old_mode_ = _CrtSetReportMode(_CRT_ASSERT, old_mode_);
|
|
756
|
+
}
|
|
757
|
+
|
|
758
|
+
static void MyHandler(const wchar_t *expr,
|
|
759
|
+
const wchar_t *func,
|
|
760
|
+
const wchar_t *file,
|
|
761
|
+
unsigned int line,
|
|
762
|
+
uintptr_t pReserved) {
|
|
763
|
+
// do nothing
|
|
764
|
+
}
|
|
765
|
+
|
|
766
|
+
_invalid_parameter_handler old_handler_;
|
|
767
|
+
int old_mode_;
|
|
768
|
+
#else
|
|
769
|
+
// Dummy constructor and destructor to ensure that GCC doesn't complain
|
|
770
|
+
// that debug_disabler is an unused variable.
|
|
771
|
+
MsvcDebugDisabler() {}
|
|
772
|
+
~MsvcDebugDisabler() {}
|
|
773
|
+
#endif
|
|
774
|
+
};
|
|
775
|
+
|
|
776
|
+
// Test that FileInputStreams report errors correctly.
|
|
777
|
+
TEST_F(IoTest, FileReadError) {
|
|
778
|
+
MsvcDebugDisabler debug_disabler;
|
|
779
|
+
|
|
780
|
+
// -1 = invalid file descriptor.
|
|
781
|
+
FileInputStream input(-1);
|
|
782
|
+
|
|
783
|
+
const void* buffer;
|
|
784
|
+
int size;
|
|
785
|
+
EXPECT_FALSE(input.Next(&buffer, &size));
|
|
786
|
+
EXPECT_EQ(EBADF, input.GetErrno());
|
|
787
|
+
}
|
|
788
|
+
|
|
789
|
+
// Test that FileOutputStreams report errors correctly.
|
|
790
|
+
TEST_F(IoTest, FileWriteError) {
|
|
791
|
+
MsvcDebugDisabler debug_disabler;
|
|
792
|
+
|
|
793
|
+
// -1 = invalid file descriptor.
|
|
794
|
+
FileOutputStream input(-1);
|
|
795
|
+
|
|
796
|
+
void* buffer;
|
|
797
|
+
int size;
|
|
798
|
+
|
|
799
|
+
// The first call to Next() succeeds because it doesn't have anything to
|
|
800
|
+
// write yet.
|
|
801
|
+
EXPECT_TRUE(input.Next(&buffer, &size));
|
|
802
|
+
|
|
803
|
+
// Second call fails.
|
|
804
|
+
EXPECT_FALSE(input.Next(&buffer, &size));
|
|
805
|
+
|
|
806
|
+
EXPECT_EQ(EBADF, input.GetErrno());
|
|
807
|
+
}
|
|
808
|
+
|
|
809
|
+
// Pipes are not seekable, so File{Input,Output}Stream ends up doing some
|
|
810
|
+
// different things to handle them. We'll test by writing to a pipe and
|
|
811
|
+
// reading back from it.
|
|
812
|
+
TEST_F(IoTest, PipeIo) {
|
|
813
|
+
int files[2];
|
|
814
|
+
|
|
815
|
+
for (int i = 0; i < kBlockSizeCount; i++) {
|
|
816
|
+
for (int j = 0; j < kBlockSizeCount; j++) {
|
|
817
|
+
// Need to create a new pipe each time because ReadStuff() expects
|
|
818
|
+
// to see EOF at the end.
|
|
819
|
+
ASSERT_EQ(pipe(files), 0);
|
|
820
|
+
|
|
821
|
+
{
|
|
822
|
+
FileOutputStream output(files[1], kBlockSizes[i]);
|
|
823
|
+
WriteStuff(&output);
|
|
824
|
+
EXPECT_EQ(0, output.GetErrno());
|
|
825
|
+
}
|
|
826
|
+
close(files[1]); // Send EOF.
|
|
827
|
+
|
|
828
|
+
{
|
|
829
|
+
FileInputStream input(files[0], kBlockSizes[j]);
|
|
830
|
+
ReadStuff(&input);
|
|
831
|
+
EXPECT_EQ(0, input.GetErrno());
|
|
832
|
+
}
|
|
833
|
+
close(files[0]);
|
|
834
|
+
}
|
|
835
|
+
}
|
|
836
|
+
}
|
|
837
|
+
|
|
838
|
+
// Test using C++ iostreams.
|
|
839
|
+
TEST_F(IoTest, IostreamIo) {
|
|
840
|
+
for (int i = 0; i < kBlockSizeCount; i++) {
|
|
841
|
+
for (int j = 0; j < kBlockSizeCount; j++) {
|
|
842
|
+
{
|
|
843
|
+
stringstream stream;
|
|
844
|
+
|
|
845
|
+
{
|
|
846
|
+
OstreamOutputStream output(&stream, kBlockSizes[i]);
|
|
847
|
+
WriteStuff(&output);
|
|
848
|
+
EXPECT_FALSE(stream.fail());
|
|
849
|
+
}
|
|
850
|
+
|
|
851
|
+
{
|
|
852
|
+
IstreamInputStream input(&stream, kBlockSizes[j]);
|
|
853
|
+
ReadStuff(&input);
|
|
854
|
+
EXPECT_TRUE(stream.eof());
|
|
855
|
+
}
|
|
856
|
+
}
|
|
857
|
+
|
|
858
|
+
{
|
|
859
|
+
stringstream stream;
|
|
860
|
+
|
|
861
|
+
{
|
|
862
|
+
OstreamOutputStream output(&stream, kBlockSizes[i]);
|
|
863
|
+
WriteStuffLarge(&output);
|
|
864
|
+
EXPECT_FALSE(stream.fail());
|
|
865
|
+
}
|
|
866
|
+
|
|
867
|
+
{
|
|
868
|
+
IstreamInputStream input(&stream, kBlockSizes[j]);
|
|
869
|
+
ReadStuffLarge(&input);
|
|
870
|
+
EXPECT_TRUE(stream.eof());
|
|
871
|
+
}
|
|
872
|
+
}
|
|
873
|
+
}
|
|
874
|
+
}
|
|
875
|
+
}
|
|
876
|
+
|
|
877
|
+
// To test ConcatenatingInputStream, we create several ArrayInputStreams
|
|
878
|
+
// covering a buffer and then concatenate them.
|
|
879
|
+
TEST_F(IoTest, ConcatenatingInputStream) {
|
|
880
|
+
const int kBufferSize = 256;
|
|
881
|
+
uint8 buffer[kBufferSize];
|
|
882
|
+
|
|
883
|
+
// Fill the buffer.
|
|
884
|
+
ArrayOutputStream output(buffer, kBufferSize);
|
|
885
|
+
WriteStuff(&output);
|
|
886
|
+
|
|
887
|
+
// Now split it up into multiple streams of varying sizes.
|
|
888
|
+
ASSERT_EQ(68, output.ByteCount()); // Test depends on this.
|
|
889
|
+
ArrayInputStream input1(buffer , 12);
|
|
890
|
+
ArrayInputStream input2(buffer + 12, 7);
|
|
891
|
+
ArrayInputStream input3(buffer + 19, 6);
|
|
892
|
+
ArrayInputStream input4(buffer + 25, 15);
|
|
893
|
+
ArrayInputStream input5(buffer + 40, 0);
|
|
894
|
+
// Note: We want to make sure we have a stream boundary somewhere between
|
|
895
|
+
// bytes 42 and 62, which is the range that it Skip()ed by ReadStuff(). This
|
|
896
|
+
// tests that a bug that existed in the original code for Skip() is fixed.
|
|
897
|
+
ArrayInputStream input6(buffer + 40, 10);
|
|
898
|
+
ArrayInputStream input7(buffer + 50, 18); // Total = 68 bytes.
|
|
899
|
+
|
|
900
|
+
ZeroCopyInputStream* streams[] =
|
|
901
|
+
{&input1, &input2, &input3, &input4, &input5, &input6, &input7};
|
|
902
|
+
|
|
903
|
+
// Create the concatenating stream and read.
|
|
904
|
+
ConcatenatingInputStream input(streams, GOOGLE_ARRAYSIZE(streams));
|
|
905
|
+
ReadStuff(&input);
|
|
906
|
+
}
|
|
907
|
+
|
|
908
|
+
// To test LimitingInputStream, we write our golden text to a buffer, then
|
|
909
|
+
// create an ArrayInputStream that contains the whole buffer (not just the
|
|
910
|
+
// bytes written), then use a LimitingInputStream to limit it just to the
|
|
911
|
+
// bytes written.
|
|
912
|
+
TEST_F(IoTest, LimitingInputStream) {
|
|
913
|
+
const int kBufferSize = 256;
|
|
914
|
+
uint8 buffer[kBufferSize];
|
|
915
|
+
|
|
916
|
+
// Fill the buffer.
|
|
917
|
+
ArrayOutputStream output(buffer, kBufferSize);
|
|
918
|
+
WriteStuff(&output);
|
|
919
|
+
|
|
920
|
+
// Set up input.
|
|
921
|
+
ArrayInputStream array_input(buffer, kBufferSize);
|
|
922
|
+
LimitingInputStream input(&array_input, output.ByteCount());
|
|
923
|
+
|
|
924
|
+
ReadStuff(&input);
|
|
925
|
+
}
|
|
926
|
+
|
|
927
|
+
// Checks that ByteCount works correctly for LimitingInputStreams where the
|
|
928
|
+
// underlying stream has already been read.
|
|
929
|
+
TEST_F(IoTest, LimitingInputStreamByteCount) {
|
|
930
|
+
const int kHalfBufferSize = 128;
|
|
931
|
+
const int kBufferSize = kHalfBufferSize * 2;
|
|
932
|
+
uint8 buffer[kBufferSize];
|
|
933
|
+
|
|
934
|
+
// Set up input. Only allow half to be read at once.
|
|
935
|
+
ArrayInputStream array_input(buffer, kBufferSize, kHalfBufferSize);
|
|
936
|
+
const void* data;
|
|
937
|
+
int size;
|
|
938
|
+
EXPECT_TRUE(array_input.Next(&data, &size));
|
|
939
|
+
EXPECT_EQ(kHalfBufferSize, array_input.ByteCount());
|
|
940
|
+
// kHalfBufferSize - 1 to test limiting logic as well.
|
|
941
|
+
LimitingInputStream input(&array_input, kHalfBufferSize - 1);
|
|
942
|
+
EXPECT_EQ(0, input.ByteCount());
|
|
943
|
+
EXPECT_TRUE(input.Next(&data, &size));
|
|
944
|
+
EXPECT_EQ(kHalfBufferSize - 1 , input.ByteCount());
|
|
945
|
+
}
|
|
946
|
+
|
|
947
|
+
// Check that a zero-size array doesn't confuse the code.
|
|
948
|
+
TEST(ZeroSizeArray, Input) {
|
|
949
|
+
ArrayInputStream input(NULL, 0);
|
|
950
|
+
const void* data;
|
|
951
|
+
int size;
|
|
952
|
+
EXPECT_FALSE(input.Next(&data, &size));
|
|
953
|
+
}
|
|
954
|
+
|
|
955
|
+
TEST(ZeroSizeArray, Output) {
|
|
956
|
+
ArrayOutputStream output(NULL, 0);
|
|
957
|
+
void* data;
|
|
958
|
+
int size;
|
|
959
|
+
EXPECT_FALSE(output.Next(&data, &size));
|
|
960
|
+
}
|
|
961
|
+
|
|
962
|
+
} // namespace
|
|
963
|
+
} // namespace io
|
|
964
|
+
} // namespace protobuf
|
|
965
|
+
} // namespace google
|