diff options
-rw-r--r-- | BUILD | 2 | ||||
-rw-r--r-- | conformance/Makefile.am | 12 | ||||
-rwxr-xr-x | conformance/conformance_python.py | 130 | ||||
-rw-r--r-- | conformance/conformance_test.cc | 8 | ||||
-rw-r--r-- | conformance/conformance_test_runner.cc | 6 | ||||
-rw-r--r-- | conformance/failure_list_python.txt | 0 | ||||
-rw-r--r-- | conformance/failure_list_python_cpp.txt | 25 | ||||
-rw-r--r-- | objectivec/GPBMessage.h | 2 | ||||
-rw-r--r-- | objectivec/GPBMessage.m | 23 | ||||
-rw-r--r-- | objectivec/GPBUtilities.h | 2 | ||||
-rw-r--r-- | objectivec/ProtocolBuffers_OSX.xcodeproj/project.pbxproj | 2 | ||||
-rw-r--r-- | objectivec/ProtocolBuffers_iOS.xcodeproj/project.pbxproj | 2 | ||||
-rw-r--r-- | objectivec/Tests/GPBCodedInputStreamTests.m | 4 | ||||
-rw-r--r-- | objectivec/Tests/GPBMessageTests+Serialization.m | 171 | ||||
-rw-r--r-- | objectivec/Tests/GPBMessageTests.m | 16 | ||||
-rw-r--r-- | protobuf.bzl | 3 | ||||
-rwxr-xr-x | python/setup.py | 8 | ||||
-rw-r--r-- | python/tox.ini | 2 | ||||
-rw-r--r-- | six.BUILD | 1 |
19 files changed, 357 insertions, 62 deletions
@@ -512,6 +512,7 @@ internal_copied_filegroup( py_proto_library( name = "protobuf_python", srcs = WELL_KNOWN_PROTOS, + srcs_version = "PY2AND3", include = "src", protoc = ":protoc", py_extra_srcs = [":python_srcs"], @@ -555,6 +556,7 @@ py_proto_library( py_library( name = "python_tests", srcs = [":python_test_srcs"], + srcs_version = "PY2AND3", deps = [ ":protobuf_python", ":python_common_test_protos", diff --git a/conformance/Makefile.am b/conformance/Makefile.am index ea5edbba..0e76b16a 100644 --- a/conformance/Makefile.am +++ b/conformance/Makefile.am @@ -53,7 +53,7 @@ endif if USE_EXTERNAL_PROTOC protoc_middleman: $(protoc_inputs) - $(PROTOC) -I$(srcdir) --cpp_out=. --java_out=. --ruby_out=. --objc_out=. $^ + $(PROTOC) -I$(srcdir) --cpp_out=. --java_out=. --ruby_out=. --objc_out=. --python_out=.$^ touch protoc_middleman else @@ -62,7 +62,7 @@ else # relative to srcdir, which may not be the same as the current directory when # building out-of-tree. protoc_middleman: $(top_srcdir)/src/protoc$(EXEEXT) $(protoc_inputs) - oldpwd=`pwd` && ( cd $(srcdir) && $$oldpwd/../src/protoc$(EXEEXT) -I. --cpp_out=$$oldpwd --java_out=$$oldpwd --ruby_out=$$oldpwd --objc_out=$$oldpwd $(protoc_inputs) ) + oldpwd=`pwd` && ( cd $(srcdir) && $$oldpwd/../src/protoc$(EXEEXT) -I. --cpp_out=$$oldpwd --java_out=$$oldpwd --ruby_out=$$oldpwd --objc_out=$$oldpwd --python_out=$$oldpwd $(protoc_inputs) ) touch protoc_middleman endif @@ -110,6 +110,14 @@ test_csharp: protoc_middleman conformance-test-runner conformance-csharp test_ruby: protoc_middleman conformance-test-runner $(other_language_protoc_outputs) RUBYLIB=../ruby/lib:. ./conformance-test-runner --failure_list failure_list_ruby.txt ./conformance_ruby.rb +# These depend on library paths being properly set up. The easiest way to +# run them is to just use "tox" from the python dir. +test_python: protoc_middleman conformance-test-runner + ./conformance-test-runner --failure_list failure_list_python.txt ./conformance_python.py + +test_python_cpp: protoc_middleman conformance-test-runner + ./conformance-test-runner --failure_list failure_list_python_cpp.txt ./conformance_python.py + if OBJC_CONFORMANCE_TEST test_objc: protoc_middleman conformance-test-runner conformance-objc diff --git a/conformance/conformance_python.py b/conformance/conformance_python.py new file mode 100755 index 00000000..a490c8e8 --- /dev/null +++ b/conformance/conformance_python.py @@ -0,0 +1,130 @@ +#!/usr/bin/env python +# +# Protocol Buffers - Google's data interchange format +# Copyright 2008 Google Inc. All rights reserved. +# https://developers.google.com/protocol-buffers/ +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following disclaimer +# in the documentation and/or other materials provided with the +# distribution. +# * Neither the name of Google Inc. nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +"""A conformance test implementation for the Python protobuf library. + +See conformance.proto for more information. +""" + +import struct +import sys +import os +from google.protobuf import message +from google.protobuf import json_format +import conformance_pb2 + +sys.stdout = os.fdopen(sys.stdout.fileno(), 'wb', 0) +sys.stdin = os.fdopen(sys.stdin.fileno(), 'rb', 0) + +test_count = 0 +verbose = False + +class ProtocolError(Exception): + pass + +def do_test(request): + test_message = conformance_pb2.TestAllTypes() + response = conformance_pb2.ConformanceResponse() + test_message = conformance_pb2.TestAllTypes() + + try: + if request.WhichOneof('payload') == 'protobuf_payload': + try: + test_message.ParseFromString(request.protobuf_payload) + except message.DecodeError as e: + response.parse_error = str(e) + return response + + elif request.WhichOneof('payload') == 'json_payload': + try: + json_format.Parse(request.json_payload, test_message) + except json_format.ParseError as e: + response.parse_error = str(e) + return response + + else: + raise ProtocolError("Request didn't have payload.") + + if request.requested_output_format == conformance_pb2.UNSPECIFIED: + raise ProtocolError("Unspecified output format") + + elif request.requested_output_format == conformance_pb2.PROTOBUF: + response.protobuf_payload = test_message.SerializeToString() + + elif request.requested_output_format == conformance_pb2.JSON: + response.json_payload = json_format.MessageToJson(test_message) + + except Exception as e: + response.runtime_error = str(e) + + return response + +def do_test_io(): + length_bytes = sys.stdin.read(4) + if len(length_bytes) == 0: + return False # EOF + elif len(length_bytes) != 4: + raise IOError("I/O error") + + # "I" is "unsigned int", so this depends on running on a platform with + # 32-bit "unsigned int" type. The Python struct module unfortunately + # has no format specifier for uint32_t. + length = struct.unpack("<I", length_bytes)[0] + serialized_request = sys.stdin.read(length) + if len(serialized_request) != length: + raise IOError("I/O error") + + request = conformance_pb2.ConformanceRequest() + request.ParseFromString(serialized_request) + + response = do_test(request) + + serialized_response = response.SerializeToString() + sys.stdout.write(struct.pack("<I", len(serialized_response))) + sys.stdout.write(serialized_response) + sys.stdout.flush() + + if verbose: + sys.stderr.write("conformance_python: request=%s, response=%s\n" % ( + request.ShortDebugString().c_str(), + response.ShortDebugString().c_str())) + + global test_count + test_count += 1 + + return True + +while True: + if not do_test_io(): + sys.stderr.write("conformance_python: received EOF from test runner " + + "after %s tests, exiting\n" % (test_count)) + sys.exit(0) diff --git a/conformance/conformance_test.cc b/conformance/conformance_test.cc index 0ee201f3..c250cb1e 100644 --- a/conformance/conformance_test.cc +++ b/conformance/conformance_test.cc @@ -514,9 +514,11 @@ bool ConformanceTestSuite::RunSuite(ConformanceTestRunner* runner, "These tests succeeded, even though they were listed in " "the failure list. Remove them from the failure list"); - CheckSetEmpty(skipped_, - "These tests were skipped (probably because support for some " - "features is not implemented)"); + if (verbose_) { + CheckSetEmpty(skipped_, + "These tests were skipped (probably because support for some " + "features is not implemented)"); + } StringAppendF(&output_, "CONFORMANCE SUITE %s: %d successes, %d skipped, " diff --git a/conformance/conformance_test_runner.cc b/conformance/conformance_test_runner.cc index 780e1c44..c3b3db22 100644 --- a/conformance/conformance_test_runner.cc +++ b/conformance/conformance_test_runner.cc @@ -202,6 +202,12 @@ void UsageError() { void ParseFailureList(const char *filename, vector<string>* failure_list) { std::ifstream infile(filename); + + if (!infile.is_open()) { + fprintf(stderr, "Couldn't open failure list file: %s\n", filename); + exit(1); + } + for (string line; getline(infile, line);) { // Remove whitespace. line.erase(std::remove_if(line.begin(), line.end(), ::isspace), diff --git a/conformance/failure_list_python.txt b/conformance/failure_list_python.txt new file mode 100644 index 00000000..e69de29b --- /dev/null +++ b/conformance/failure_list_python.txt diff --git a/conformance/failure_list_python_cpp.txt b/conformance/failure_list_python_cpp.txt new file mode 100644 index 00000000..4b16a88b --- /dev/null +++ b/conformance/failure_list_python_cpp.txt @@ -0,0 +1,25 @@ +# This is the list of conformance tests that are known to fail for the +# Python/C++ implementation right now. These should be fixed. +# +# By listing them here we can keep tabs on which ones are failing and be sure +# that we don't introduce regressions in other tests. +# +# TODO(haberman): insert links to corresponding bugs tracking the issue. +# Should we use GitHub issues or the Google-internal bug tracker? + +ProtobufInput.PrematureEofInDelimitedDataForKnownNonRepeatedValue.MESSAGE +ProtobufInput.PrematureEofInDelimitedDataForKnownRepeatedValue.MESSAGE +ProtobufInput.PrematureEofInPackedField.BOOL +ProtobufInput.PrematureEofInPackedField.DOUBLE +ProtobufInput.PrematureEofInPackedField.ENUM +ProtobufInput.PrematureEofInPackedField.FIXED32 +ProtobufInput.PrematureEofInPackedField.FIXED64 +ProtobufInput.PrematureEofInPackedField.FLOAT +ProtobufInput.PrematureEofInPackedField.INT32 +ProtobufInput.PrematureEofInPackedField.INT64 +ProtobufInput.PrematureEofInPackedField.SFIXED32 +ProtobufInput.PrematureEofInPackedField.SFIXED64 +ProtobufInput.PrematureEofInPackedField.SINT32 +ProtobufInput.PrematureEofInPackedField.SINT64 +ProtobufInput.PrematureEofInPackedField.UINT32 +ProtobufInput.PrematureEofInPackedField.UINT64 diff --git a/objectivec/GPBMessage.h b/objectivec/GPBMessage.h index d4c2fccf..332393ed 100644 --- a/objectivec/GPBMessage.h +++ b/objectivec/GPBMessage.h @@ -127,7 +127,7 @@ CF_EXTERN_C_END // Same as -[data], except a delimiter is added to the start of the data // indicating the size of the message data that follows. -- (nullable NSData *)delimitedData; +- (NSData *)delimitedData; // Returns the size of the object if it were serialized. // This is not a cached value. If you are following a pattern like this: diff --git a/objectivec/GPBMessage.m b/objectivec/GPBMessage.m index c655edd3..d9080c3f 100644 --- a/objectivec/GPBMessage.m +++ b/objectivec/GPBMessage.m @@ -55,10 +55,15 @@ NSString *const GPBExceptionMessageKey = static NSString *const kGPBDataCoderKey = @"GPBData"; #ifndef _GPBCompileAssert -#define _GPBCompileAssertSymbolInner(line, msg) _GPBCompileAssert ## line ## __ ## msg -#define _GPBCompileAssertSymbol(line, msg) _GPBCompileAssertSymbolInner(line, msg) -#define _GPBCompileAssert(test, msg) \ - typedef char _GPBCompileAssertSymbol(__LINE__, msg) [ ((test) ? 1 : -1) ] + #if __has_feature(c_static_assert) || __has_extension(c_static_assert) + #define _GPBCompileAssert(test, msg) _Static_assert((test), #msg) + #else + // Pre-Xcode 7 support. + #define _GPBCompileAssertSymbolInner(line, msg) _GPBCompileAssert ## line ## __ ## msg + #define _GPBCompileAssertSymbol(line, msg) _GPBCompileAssertSymbolInner(line, msg) + #define _GPBCompileAssert(test, msg) \ + typedef char _GPBCompileAssertSymbol(__LINE__, msg) [ ((test) ? 1 : -1) ] + #endif // __has_feature(c_static_assert) || __has_extension(c_static_assert) #endif // _GPBCompileAssert // @@ -1212,7 +1217,8 @@ static GPBUnknownFieldSet *GetOrMakeUnknownFields(GPBMessage *self) { NSLog(@"%@: Internal exception while building message delimitedData: %@", [self class], exception); #endif - data = nil; + // If it happens, truncate. + data.length = 0; } [stream release]; return data; @@ -1791,7 +1797,12 @@ static GPBUnknownFieldSet *GetOrMakeUnknownFields(GPBMessage *self) { extensionMap_ = [[NSMutableDictionary alloc] init]; } - [extensionMap_ setObject:value forKey:extension]; + // This pointless cast is for CLANG_WARN_NULLABLE_TO_NONNULL_CONVERSION. + // Without it, the compiler complains we're passing an id nullable when + // setObject:forKey: requires a id nonnull for the value. The check for + // !value at the start of the method ensures it isn't nil, but the check + // isn't smart enough to realize that. + [extensionMap_ setObject:(id)value forKey:extension]; GPBExtensionDescriptor *descriptor = extension; diff --git a/objectivec/GPBUtilities.h b/objectivec/GPBUtilities.h index 1301b436..5b55104b 100644 --- a/objectivec/GPBUtilities.h +++ b/objectivec/GPBUtilities.h @@ -44,7 +44,7 @@ NS_ASSUME_NONNULL_BEGIN // most likely won't exactly match the original .proto file. NSString *GPBTextFormatForMessage(GPBMessage *message, NSString * __nullable lineIndent); -NSString *GPBTextFormatForUnknownFieldSet(GPBUnknownFieldSet *unknownSet, +NSString *GPBTextFormatForUnknownFieldSet(GPBUnknownFieldSet * __nullable unknownSet, NSString * __nullable lineIndent); // diff --git a/objectivec/ProtocolBuffers_OSX.xcodeproj/project.pbxproj b/objectivec/ProtocolBuffers_OSX.xcodeproj/project.pbxproj index 08d0b7ef..b17a4f4a 100644 --- a/objectivec/ProtocolBuffers_OSX.xcodeproj/project.pbxproj +++ b/objectivec/ProtocolBuffers_OSX.xcodeproj/project.pbxproj @@ -787,6 +787,7 @@ CLANG_ANALYZER_SECURITY_INSECUREAPI_STRCPY = YES; CLANG_STATIC_ANALYZER_MODE = deep; CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_NULLABLE_TO_NONNULL_CONVERSION = YES; CLANG_WARN_OBJC_IMPLICIT_ATOMIC_PROPERTIES = YES; CLANG_WARN_OBJC_MISSING_PROPERTY_SYNTHESIS = YES; CLANG_WARN_SUSPICIOUS_IMPLICIT_CONVERSION = YES; @@ -831,6 +832,7 @@ CLANG_ANALYZER_SECURITY_INSECUREAPI_STRCPY = YES; CLANG_STATIC_ANALYZER_MODE = deep; CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_NULLABLE_TO_NONNULL_CONVERSION = YES; CLANG_WARN_OBJC_IMPLICIT_ATOMIC_PROPERTIES = YES; CLANG_WARN_OBJC_MISSING_PROPERTY_SYNTHESIS = YES; CLANG_WARN_SUSPICIOUS_IMPLICIT_CONVERSION = YES; diff --git a/objectivec/ProtocolBuffers_iOS.xcodeproj/project.pbxproj b/objectivec/ProtocolBuffers_iOS.xcodeproj/project.pbxproj index 14e51037..e0a45ef6 100644 --- a/objectivec/ProtocolBuffers_iOS.xcodeproj/project.pbxproj +++ b/objectivec/ProtocolBuffers_iOS.xcodeproj/project.pbxproj @@ -949,6 +949,7 @@ CLANG_ANALYZER_SECURITY_INSECUREAPI_STRCPY = YES; CLANG_STATIC_ANALYZER_MODE = deep; CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_NULLABLE_TO_NONNULL_CONVERSION = YES; CLANG_WARN_OBJC_IMPLICIT_ATOMIC_PROPERTIES = YES; CLANG_WARN_OBJC_MISSING_PROPERTY_SYNTHESIS = YES; CLANG_WARN_SUSPICIOUS_IMPLICIT_CONVERSION = YES; @@ -994,6 +995,7 @@ CLANG_ANALYZER_SECURITY_INSECUREAPI_STRCPY = YES; CLANG_STATIC_ANALYZER_MODE = deep; CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_NULLABLE_TO_NONNULL_CONVERSION = YES; CLANG_WARN_OBJC_IMPLICIT_ATOMIC_PROPERTIES = YES; CLANG_WARN_OBJC_MISSING_PROPERTY_SYNTHESIS = YES; CLANG_WARN_SUSPICIOUS_IMPLICIT_CONVERSION = YES; diff --git a/objectivec/Tests/GPBCodedInputStreamTests.m b/objectivec/Tests/GPBCodedInputStreamTests.m index 579fe65c..7c3c006b 100644 --- a/objectivec/Tests/GPBCodedInputStreamTests.m +++ b/objectivec/Tests/GPBCodedInputStreamTests.m @@ -225,8 +225,10 @@ // Serialize and parse it. Make sure to parse from an InputStream, not // directly from a ByteString, so that CodedInputStream uses buffered // reading. + NSData *messageData = message.data; + XCTAssertNotNil(messageData); GPBCodedInputStream* stream = - [GPBCodedInputStream streamWithData:message.data]; + [GPBCodedInputStream streamWithData:messageData]; TestAllTypes* message2 = [TestAllTypes parseFromCodedInputStream:stream extensionRegistry:nil error:NULL]; diff --git a/objectivec/Tests/GPBMessageTests+Serialization.m b/objectivec/Tests/GPBMessageTests+Serialization.m index 4dcca7a3..0d811a96 100644 --- a/objectivec/Tests/GPBMessageTests+Serialization.m +++ b/objectivec/Tests/GPBMessageTests+Serialization.m @@ -121,8 +121,9 @@ static NSData *DataFromCStr(const char *str) { fooWithExtras.enumValue = DropUnknownsFooWithExtraFields_NestedEnum_Baz; fooWithExtras.extraInt32Value = 2; - DropUnknownsFoo *foo = - [DropUnknownsFoo parseFromData:[fooWithExtras data] error:NULL]; + NSData *data = [fooWithExtras data]; + XCTAssertNotNil(data); + DropUnknownsFoo *foo = [DropUnknownsFoo parseFromData:data error:NULL]; XCTAssertEqual(foo.int32Value, 1); XCTAssertEqual(foo.enumValue, DropUnknownsFoo_NestedEnum_Baz); @@ -130,8 +131,9 @@ static NSData *DataFromCStr(const char *str) { XCTAssertEqual([foo.unknownFields countOfFields], 0U); [fooWithExtras release]; + data = [foo data]; fooWithExtras = - [DropUnknownsFooWithExtraFields parseFromData:[foo data] error:NULL]; + [DropUnknownsFooWithExtraFields parseFromData:data error:NULL]; XCTAssertEqual(fooWithExtras.int32Value, 1); XCTAssertEqual(fooWithExtras.enumValue, DropUnknownsFooWithExtraFields_NestedEnum_Baz); @@ -149,7 +151,9 @@ static NSData *DataFromCStr(const char *str) { rawValue:Message3_Enum_Extra3]; orig.oneofEnum = Message3_Enum_Extra3; - Message2 *msg = [[Message2 alloc] initWithData:[orig data] error:NULL]; + NSData *data = [orig data]; + XCTAssertNotNil(data); + Message2 *msg = [[Message2 alloc] initWithData:data error:NULL]; // None of the fields should be set. @@ -201,8 +205,10 @@ static NSData *DataFromCStr(const char *str) { // Everything should be there via raw values. + NSData *data = [orig data]; + XCTAssertNotNil(data); UnknownEnumsMyMessage *msg = - [UnknownEnumsMyMessage parseFromData:[orig data] error:NULL]; + [UnknownEnumsMyMessage parseFromData:data error:NULL]; XCTAssertEqual(msg.e, UnknownEnumsMyEnum_GPBUnrecognizedEnumeratorValue); XCTAssertEqual(UnknownEnumsMyMessage_E_RawValue(msg), @@ -224,7 +230,8 @@ static NSData *DataFromCStr(const char *str) { // Everything should go out and come back. - orig = [UnknownEnumsMyMessagePlusExtra parseFromData:[msg data] error:NULL]; + data = [msg data]; + orig = [UnknownEnumsMyMessagePlusExtra parseFromData:data error:NULL]; XCTAssertEqual(orig.e, UnknownEnumsMyEnumPlusExtra_EExtra); XCTAssertEqual(orig.repeatedEArray.count, 1U); @@ -243,7 +250,9 @@ static NSData *DataFromCStr(const char *str) { //% MESSAGE *orig = [[MESSAGE alloc] init]; //% orig.oneof##FIELD = VALUE; //% XCTAssertEqual(orig.oOneOfCase, MESSAGE##_O_OneOfCase_Oneof##FIELD); -//% MESSAGE *msg = [MESSAGE parseFromData:[orig data] error:NULL]; +//% NSData *data = [orig data]; +//% XCTAssertNotNil(data); +//% MESSAGE *msg = [MESSAGE parseFromData:data error:NULL]; //% XCTAssertEqual(msg.oOneOfCase, MESSAGE##_O_OneOfCase_Oneof##FIELD); //% XCTAssertEqual##EQ_SUFFIX(msg.oneof##FIELD, VALUE); //% [orig release]; @@ -311,7 +320,9 @@ static NSData *DataFromCStr(const char *str) { Message2 *orig = [[Message2 alloc] init]; orig.oneofInt32 = 1; XCTAssertEqual(orig.oOneOfCase, Message2_O_OneOfCase_OneofInt32); - Message2 *msg = [Message2 parseFromData:[orig data] error:NULL]; + NSData *data = [orig data]; + XCTAssertNotNil(data); + Message2 *msg = [Message2 parseFromData:data error:NULL]; XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase_OneofInt32); XCTAssertEqual(msg.oneofInt32, 1); [orig release]; @@ -321,7 +332,9 @@ static NSData *DataFromCStr(const char *str) { Message2 *orig = [[Message2 alloc] init]; orig.oneofInt64 = 2; XCTAssertEqual(orig.oOneOfCase, Message2_O_OneOfCase_OneofInt64); - Message2 *msg = [Message2 parseFromData:[orig data] error:NULL]; + NSData *data = [orig data]; + XCTAssertNotNil(data); + Message2 *msg = [Message2 parseFromData:data error:NULL]; XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase_OneofInt64); XCTAssertEqual(msg.oneofInt64, 2); [orig release]; @@ -331,7 +344,9 @@ static NSData *DataFromCStr(const char *str) { Message2 *orig = [[Message2 alloc] init]; orig.oneofUint32 = 3U; XCTAssertEqual(orig.oOneOfCase, Message2_O_OneOfCase_OneofUint32); - Message2 *msg = [Message2 parseFromData:[orig data] error:NULL]; + NSData *data = [orig data]; + XCTAssertNotNil(data); + Message2 *msg = [Message2 parseFromData:data error:NULL]; XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase_OneofUint32); XCTAssertEqual(msg.oneofUint32, 3U); [orig release]; @@ -341,7 +356,9 @@ static NSData *DataFromCStr(const char *str) { Message2 *orig = [[Message2 alloc] init]; orig.oneofUint64 = 4U; XCTAssertEqual(orig.oOneOfCase, Message2_O_OneOfCase_OneofUint64); - Message2 *msg = [Message2 parseFromData:[orig data] error:NULL]; + NSData *data = [orig data]; + XCTAssertNotNil(data); + Message2 *msg = [Message2 parseFromData:data error:NULL]; XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase_OneofUint64); XCTAssertEqual(msg.oneofUint64, 4U); [orig release]; @@ -351,7 +368,9 @@ static NSData *DataFromCStr(const char *str) { Message2 *orig = [[Message2 alloc] init]; orig.oneofSint32 = 5; XCTAssertEqual(orig.oOneOfCase, Message2_O_OneOfCase_OneofSint32); - Message2 *msg = [Message2 parseFromData:[orig data] error:NULL]; + NSData *data = [orig data]; + XCTAssertNotNil(data); + Message2 *msg = [Message2 parseFromData:data error:NULL]; XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase_OneofSint32); XCTAssertEqual(msg.oneofSint32, 5); [orig release]; @@ -361,7 +380,9 @@ static NSData *DataFromCStr(const char *str) { Message2 *orig = [[Message2 alloc] init]; orig.oneofSint64 = 6; XCTAssertEqual(orig.oOneOfCase, Message2_O_OneOfCase_OneofSint64); - Message2 *msg = [Message2 parseFromData:[orig data] error:NULL]; + NSData *data = [orig data]; + XCTAssertNotNil(data); + Message2 *msg = [Message2 parseFromData:data error:NULL]; XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase_OneofSint64); XCTAssertEqual(msg.oneofSint64, 6); [orig release]; @@ -371,7 +392,9 @@ static NSData *DataFromCStr(const char *str) { Message2 *orig = [[Message2 alloc] init]; orig.oneofFixed32 = 7U; XCTAssertEqual(orig.oOneOfCase, Message2_O_OneOfCase_OneofFixed32); - Message2 *msg = [Message2 parseFromData:[orig data] error:NULL]; + NSData *data = [orig data]; + XCTAssertNotNil(data); + Message2 *msg = [Message2 parseFromData:data error:NULL]; XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase_OneofFixed32); XCTAssertEqual(msg.oneofFixed32, 7U); [orig release]; @@ -381,7 +404,9 @@ static NSData *DataFromCStr(const char *str) { Message2 *orig = [[Message2 alloc] init]; orig.oneofFixed64 = 8U; XCTAssertEqual(orig.oOneOfCase, Message2_O_OneOfCase_OneofFixed64); - Message2 *msg = [Message2 parseFromData:[orig data] error:NULL]; + NSData *data = [orig data]; + XCTAssertNotNil(data); + Message2 *msg = [Message2 parseFromData:data error:NULL]; XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase_OneofFixed64); XCTAssertEqual(msg.oneofFixed64, 8U); [orig release]; @@ -391,7 +416,9 @@ static NSData *DataFromCStr(const char *str) { Message2 *orig = [[Message2 alloc] init]; orig.oneofSfixed32 = 9; XCTAssertEqual(orig.oOneOfCase, Message2_O_OneOfCase_OneofSfixed32); - Message2 *msg = [Message2 parseFromData:[orig data] error:NULL]; + NSData *data = [orig data]; + XCTAssertNotNil(data); + Message2 *msg = [Message2 parseFromData:data error:NULL]; XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase_OneofSfixed32); XCTAssertEqual(msg.oneofSfixed32, 9); [orig release]; @@ -401,7 +428,9 @@ static NSData *DataFromCStr(const char *str) { Message2 *orig = [[Message2 alloc] init]; orig.oneofSfixed64 = 10; XCTAssertEqual(orig.oOneOfCase, Message2_O_OneOfCase_OneofSfixed64); - Message2 *msg = [Message2 parseFromData:[orig data] error:NULL]; + NSData *data = [orig data]; + XCTAssertNotNil(data); + Message2 *msg = [Message2 parseFromData:data error:NULL]; XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase_OneofSfixed64); XCTAssertEqual(msg.oneofSfixed64, 10); [orig release]; @@ -411,7 +440,9 @@ static NSData *DataFromCStr(const char *str) { Message2 *orig = [[Message2 alloc] init]; orig.oneofFloat = 11.0f; XCTAssertEqual(orig.oOneOfCase, Message2_O_OneOfCase_OneofFloat); - Message2 *msg = [Message2 parseFromData:[orig data] error:NULL]; + NSData *data = [orig data]; + XCTAssertNotNil(data); + Message2 *msg = [Message2 parseFromData:data error:NULL]; XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase_OneofFloat); XCTAssertEqual(msg.oneofFloat, 11.0f); [orig release]; @@ -421,7 +452,9 @@ static NSData *DataFromCStr(const char *str) { Message2 *orig = [[Message2 alloc] init]; orig.oneofDouble = 12.0; XCTAssertEqual(orig.oOneOfCase, Message2_O_OneOfCase_OneofDouble); - Message2 *msg = [Message2 parseFromData:[orig data] error:NULL]; + NSData *data = [orig data]; + XCTAssertNotNil(data); + Message2 *msg = [Message2 parseFromData:data error:NULL]; XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase_OneofDouble); XCTAssertEqual(msg.oneofDouble, 12.0); [orig release]; @@ -431,7 +464,9 @@ static NSData *DataFromCStr(const char *str) { Message2 *orig = [[Message2 alloc] init]; orig.oneofBool = NO; XCTAssertEqual(orig.oOneOfCase, Message2_O_OneOfCase_OneofBool); - Message2 *msg = [Message2 parseFromData:[orig data] error:NULL]; + NSData *data = [orig data]; + XCTAssertNotNil(data); + Message2 *msg = [Message2 parseFromData:data error:NULL]; XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase_OneofBool); XCTAssertEqual(msg.oneofBool, NO); [orig release]; @@ -441,7 +476,9 @@ static NSData *DataFromCStr(const char *str) { Message2 *orig = [[Message2 alloc] init]; orig.oneofString = @"foo"; XCTAssertEqual(orig.oOneOfCase, Message2_O_OneOfCase_OneofString); - Message2 *msg = [Message2 parseFromData:[orig data] error:NULL]; + NSData *data = [orig data]; + XCTAssertNotNil(data); + Message2 *msg = [Message2 parseFromData:data error:NULL]; XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase_OneofString); XCTAssertEqualObjects(msg.oneofString, @"foo"); [orig release]; @@ -451,7 +488,9 @@ static NSData *DataFromCStr(const char *str) { Message2 *orig = [[Message2 alloc] init]; orig.oneofBytes = [@"bar" dataUsingEncoding:NSUTF8StringEncoding]; XCTAssertEqual(orig.oOneOfCase, Message2_O_OneOfCase_OneofBytes); - Message2 *msg = [Message2 parseFromData:[orig data] error:NULL]; + NSData *data = [orig data]; + XCTAssertNotNil(data); + Message2 *msg = [Message2 parseFromData:data error:NULL]; XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase_OneofBytes); XCTAssertEqualObjects(msg.oneofBytes, [@"bar" dataUsingEncoding:NSUTF8StringEncoding]); [orig release]; @@ -461,7 +500,9 @@ static NSData *DataFromCStr(const char *str) { Message2 *orig = [[Message2 alloc] init]; orig.oneofGroup = group; XCTAssertEqual(orig.oOneOfCase, Message2_O_OneOfCase_OneofGroup); - Message2 *msg = [Message2 parseFromData:[orig data] error:NULL]; + NSData *data = [orig data]; + XCTAssertNotNil(data); + Message2 *msg = [Message2 parseFromData:data error:NULL]; XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase_OneofGroup); XCTAssertEqualObjects(msg.oneofGroup, group); [orig release]; @@ -471,7 +512,9 @@ static NSData *DataFromCStr(const char *str) { Message2 *orig = [[Message2 alloc] init]; orig.oneofMessage = subMessage; XCTAssertEqual(orig.oOneOfCase, Message2_O_OneOfCase_OneofMessage); - Message2 *msg = [Message2 parseFromData:[orig data] error:NULL]; + NSData *data = [orig data]; + XCTAssertNotNil(data); + Message2 *msg = [Message2 parseFromData:data error:NULL]; XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase_OneofMessage); XCTAssertEqualObjects(msg.oneofMessage, subMessage); [orig release]; @@ -481,7 +524,9 @@ static NSData *DataFromCStr(const char *str) { Message2 *orig = [[Message2 alloc] init]; orig.oneofEnum = Message2_Enum_Bar; XCTAssertEqual(orig.oOneOfCase, Message2_O_OneOfCase_OneofEnum); - Message2 *msg = [Message2 parseFromData:[orig data] error:NULL]; + NSData *data = [orig data]; + XCTAssertNotNil(data); + Message2 *msg = [Message2 parseFromData:data error:NULL]; XCTAssertEqual(msg.oOneOfCase, Message2_O_OneOfCase_OneofEnum); XCTAssertEqual(msg.oneofEnum, Message2_Enum_Bar); [orig release]; @@ -504,7 +549,9 @@ static NSData *DataFromCStr(const char *str) { Message3 *orig = [[Message3 alloc] init]; orig.oneofInt32 = 1; XCTAssertEqual(orig.oOneOfCase, Message3_O_OneOfCase_OneofInt32); - Message3 *msg = [Message3 parseFromData:[orig data] error:NULL]; + NSData *data = [orig data]; + XCTAssertNotNil(data); + Message3 *msg = [Message3 parseFromData:data error:NULL]; XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase_OneofInt32); XCTAssertEqual(msg.oneofInt32, 1); [orig release]; @@ -514,7 +561,9 @@ static NSData *DataFromCStr(const char *str) { Message3 *orig = [[Message3 alloc] init]; orig.oneofInt64 = 2; XCTAssertEqual(orig.oOneOfCase, Message3_O_OneOfCase_OneofInt64); - Message3 *msg = [Message3 parseFromData:[orig data] error:NULL]; + NSData *data = [orig data]; + XCTAssertNotNil(data); + Message3 *msg = [Message3 parseFromData:data error:NULL]; XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase_OneofInt64); XCTAssertEqual(msg.oneofInt64, 2); [orig release]; @@ -524,7 +573,9 @@ static NSData *DataFromCStr(const char *str) { Message3 *orig = [[Message3 alloc] init]; orig.oneofUint32 = 3U; XCTAssertEqual(orig.oOneOfCase, Message3_O_OneOfCase_OneofUint32); - Message3 *msg = [Message3 parseFromData:[orig data] error:NULL]; + NSData *data = [orig data]; + XCTAssertNotNil(data); + Message3 *msg = [Message3 parseFromData:data error:NULL]; XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase_OneofUint32); XCTAssertEqual(msg.oneofUint32, 3U); [orig release]; @@ -534,7 +585,9 @@ static NSData *DataFromCStr(const char *str) { Message3 *orig = [[Message3 alloc] init]; orig.oneofUint64 = 4U; XCTAssertEqual(orig.oOneOfCase, Message3_O_OneOfCase_OneofUint64); - Message3 *msg = [Message3 parseFromData:[orig data] error:NULL]; + NSData *data = [orig data]; + XCTAssertNotNil(data); + Message3 *msg = [Message3 parseFromData:data error:NULL]; XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase_OneofUint64); XCTAssertEqual(msg.oneofUint64, 4U); [orig release]; @@ -544,7 +597,9 @@ static NSData *DataFromCStr(const char *str) { Message3 *orig = [[Message3 alloc] init]; orig.oneofSint32 = 5; XCTAssertEqual(orig.oOneOfCase, Message3_O_OneOfCase_OneofSint32); - Message3 *msg = [Message3 parseFromData:[orig data] error:NULL]; + NSData *data = [orig data]; + XCTAssertNotNil(data); + Message3 *msg = [Message3 parseFromData:data error:NULL]; XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase_OneofSint32); XCTAssertEqual(msg.oneofSint32, 5); [orig release]; @@ -554,7 +609,9 @@ static NSData *DataFromCStr(const char *str) { Message3 *orig = [[Message3 alloc] init]; orig.oneofSint64 = 6; XCTAssertEqual(orig.oOneOfCase, Message3_O_OneOfCase_OneofSint64); - Message3 *msg = [Message3 parseFromData:[orig data] error:NULL]; + NSData *data = [orig data]; + XCTAssertNotNil(data); + Message3 *msg = [Message3 parseFromData:data error:NULL]; XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase_OneofSint64); XCTAssertEqual(msg.oneofSint64, 6); [orig release]; @@ -564,7 +621,9 @@ static NSData *DataFromCStr(const char *str) { Message3 *orig = [[Message3 alloc] init]; orig.oneofFixed32 = 7U; XCTAssertEqual(orig.oOneOfCase, Message3_O_OneOfCase_OneofFixed32); - Message3 *msg = [Message3 parseFromData:[orig data] error:NULL]; + NSData *data = [orig data]; + XCTAssertNotNil(data); + Message3 *msg = [Message3 parseFromData:data error:NULL]; XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase_OneofFixed32); XCTAssertEqual(msg.oneofFixed32, 7U); [orig release]; @@ -574,7 +633,9 @@ static NSData *DataFromCStr(const char *str) { Message3 *orig = [[Message3 alloc] init]; orig.oneofFixed64 = 8U; XCTAssertEqual(orig.oOneOfCase, Message3_O_OneOfCase_OneofFixed64); - Message3 *msg = [Message3 parseFromData:[orig data] error:NULL]; + NSData *data = [orig data]; + XCTAssertNotNil(data); + Message3 *msg = [Message3 parseFromData:data error:NULL]; XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase_OneofFixed64); XCTAssertEqual(msg.oneofFixed64, 8U); [orig release]; @@ -584,7 +645,9 @@ static NSData *DataFromCStr(const char *str) { Message3 *orig = [[Message3 alloc] init]; orig.oneofSfixed32 = 9; XCTAssertEqual(orig.oOneOfCase, Message3_O_OneOfCase_OneofSfixed32); - Message3 *msg = [Message3 parseFromData:[orig data] error:NULL]; + NSData *data = [orig data]; + XCTAssertNotNil(data); + Message3 *msg = [Message3 parseFromData:data error:NULL]; XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase_OneofSfixed32); XCTAssertEqual(msg.oneofSfixed32, 9); [orig release]; @@ -594,7 +657,9 @@ static NSData *DataFromCStr(const char *str) { Message3 *orig = [[Message3 alloc] init]; orig.oneofSfixed64 = 10; XCTAssertEqual(orig.oOneOfCase, Message3_O_OneOfCase_OneofSfixed64); - Message3 *msg = [Message3 parseFromData:[orig data] error:NULL]; + NSData *data = [orig data]; + XCTAssertNotNil(data); + Message3 *msg = [Message3 parseFromData:data error:NULL]; XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase_OneofSfixed64); XCTAssertEqual(msg.oneofSfixed64, 10); [orig release]; @@ -604,7 +669,9 @@ static NSData *DataFromCStr(const char *str) { Message3 *orig = [[Message3 alloc] init]; orig.oneofFloat = 11.0f; XCTAssertEqual(orig.oOneOfCase, Message3_O_OneOfCase_OneofFloat); - Message3 *msg = [Message3 parseFromData:[orig data] error:NULL]; + NSData *data = [orig data]; + XCTAssertNotNil(data); + Message3 *msg = [Message3 parseFromData:data error:NULL]; XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase_OneofFloat); XCTAssertEqual(msg.oneofFloat, 11.0f); [orig release]; @@ -614,7 +681,9 @@ static NSData *DataFromCStr(const char *str) { Message3 *orig = [[Message3 alloc] init]; orig.oneofDouble = 12.0; XCTAssertEqual(orig.oOneOfCase, Message3_O_OneOfCase_OneofDouble); - Message3 *msg = [Message3 parseFromData:[orig data] error:NULL]; + NSData *data = [orig data]; + XCTAssertNotNil(data); + Message3 *msg = [Message3 parseFromData:data error:NULL]; XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase_OneofDouble); XCTAssertEqual(msg.oneofDouble, 12.0); [orig release]; @@ -624,7 +693,9 @@ static NSData *DataFromCStr(const char *str) { Message3 *orig = [[Message3 alloc] init]; orig.oneofBool = YES; XCTAssertEqual(orig.oOneOfCase, Message3_O_OneOfCase_OneofBool); - Message3 *msg = [Message3 parseFromData:[orig data] error:NULL]; + NSData *data = [orig data]; + XCTAssertNotNil(data); + Message3 *msg = [Message3 parseFromData:data error:NULL]; XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase_OneofBool); XCTAssertEqual(msg.oneofBool, YES); [orig release]; @@ -634,7 +705,9 @@ static NSData *DataFromCStr(const char *str) { Message3 *orig = [[Message3 alloc] init]; orig.oneofString = @"foo"; XCTAssertEqual(orig.oOneOfCase, Message3_O_OneOfCase_OneofString); - Message3 *msg = [Message3 parseFromData:[orig data] error:NULL]; + NSData *data = [orig data]; + XCTAssertNotNil(data); + Message3 *msg = [Message3 parseFromData:data error:NULL]; XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase_OneofString); XCTAssertEqualObjects(msg.oneofString, @"foo"); [orig release]; @@ -644,7 +717,9 @@ static NSData *DataFromCStr(const char *str) { Message3 *orig = [[Message3 alloc] init]; orig.oneofBytes = [@"bar" dataUsingEncoding:NSUTF8StringEncoding]; XCTAssertEqual(orig.oOneOfCase, Message3_O_OneOfCase_OneofBytes); - Message3 *msg = [Message3 parseFromData:[orig data] error:NULL]; + NSData *data = [orig data]; + XCTAssertNotNil(data); + Message3 *msg = [Message3 parseFromData:data error:NULL]; XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase_OneofBytes); XCTAssertEqualObjects(msg.oneofBytes, [@"bar" dataUsingEncoding:NSUTF8StringEncoding]); [orig release]; @@ -656,7 +731,9 @@ static NSData *DataFromCStr(const char *str) { Message3 *orig = [[Message3 alloc] init]; orig.oneofMessage = subMessage; XCTAssertEqual(orig.oOneOfCase, Message3_O_OneOfCase_OneofMessage); - Message3 *msg = [Message3 parseFromData:[orig data] error:NULL]; + NSData *data = [orig data]; + XCTAssertNotNil(data); + Message3 *msg = [Message3 parseFromData:data error:NULL]; XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase_OneofMessage); XCTAssertEqualObjects(msg.oneofMessage, subMessage); [orig release]; @@ -666,7 +743,9 @@ static NSData *DataFromCStr(const char *str) { Message3 *orig = [[Message3 alloc] init]; orig.oneofEnum = Message2_Enum_Bar; XCTAssertEqual(orig.oOneOfCase, Message3_O_OneOfCase_OneofEnum); - Message3 *msg = [Message3 parseFromData:[orig data] error:NULL]; + NSData *data = [orig data]; + XCTAssertNotNil(data); + Message3 *msg = [Message3 parseFromData:data error:NULL]; XCTAssertEqual(msg.oOneOfCase, Message3_O_OneOfCase_OneofEnum); XCTAssertEqual(msg.oneofEnum, Message2_Enum_Bar); [orig release]; @@ -927,15 +1006,18 @@ static NSData *DataFromCStr(const char *str) { [orig.unknownMapField setValue:Proto2MapEnumPlusExtra_EProto2MapEnumExtra forKey:0]; - TestEnumMap *msg1 = [TestEnumMap parseFromData:[orig data] error:NULL]; + NSData *data = [orig data]; + XCTAssertNotNil(data); + TestEnumMap *msg1 = [TestEnumMap parseFromData:data error:NULL]; XCTAssertEqual(msg1.knownMapField.count, 1U); int32_t val = -1; XCTAssertTrue([msg1.knownMapField valueForKey:0 value:&val]); XCTAssertEqual(val, Proto2MapEnum_Proto2MapEnumFoo); XCTAssertEqual(msg1.unknownFields.countOfFields, 1U); + data = [msg1 data]; TestEnumMapPlusExtra *msg2 = - [TestEnumMapPlusExtra parseFromData:[msg1 data] error:NULL]; + [TestEnumMapPlusExtra parseFromData:data error:NULL]; val = -1; XCTAssertEqual(msg2.knownMapField.count, 1U); XCTAssertTrue([msg2.knownMapField valueForKey:0 value:&val]); @@ -1006,6 +1088,7 @@ static NSData *DataFromCStr(const char *str) { [msg.mapInt32Message setObject:val4 forKey:2035]; NSData *data = [msg data]; + XCTAssertNotNil(data); Message2 *msg2 = [[Message2 alloc] initWithData:data error:NULL]; XCTAssertNotEqual(msg2, msg); // Pointer comparison diff --git a/objectivec/Tests/GPBMessageTests.m b/objectivec/Tests/GPBMessageTests.m index cd0de8fc..f79b8128 100644 --- a/objectivec/Tests/GPBMessageTests.m +++ b/objectivec/Tests/GPBMessageTests.m @@ -195,7 +195,9 @@ // Test merging from data. result = [self mergeExtensionsDestination]; - [result mergeFromData:[[self mergeExtensionsSource] data] + NSData *data = [[self mergeExtensionsSource] data]; + XCTAssertNotNil(data); + [result mergeFromData:data extensionRegistry:[UnittestRoot extensionRegistry]]; resultData = [result data]; XCTAssertEqualObjects(resultData, mergeResultData); @@ -1884,7 +1886,9 @@ XCTAssertEqual(msg.bar, EnumTestMsg_MyEnum_One); XCTAssertEqual(msg.baz, EnumTestMsg_MyEnum_NegOne); // Bounce to wire and back. - EnumTestMsg *msgPrime = [EnumTestMsg parseFromData:[msg data] error:NULL]; + NSData *data = [msg data]; + XCTAssertNotNil(data); + EnumTestMsg *msgPrime = [EnumTestMsg parseFromData:data error:NULL]; XCTAssertEqualObjects(msgPrime, msg); XCTAssertEqual(msgPrime.foo, EnumTestMsg_MyEnum_Zero); XCTAssertEqual(msgPrime.bar, EnumTestMsg_MyEnum_One); @@ -1896,7 +1900,9 @@ XCTAssertEqual(msg.bar, EnumTestMsg_MyEnum_Two); XCTAssertEqual(msg.baz, EnumTestMsg_MyEnum_NegTwo); // Bounce to wire and back. - msgPrime = [EnumTestMsg parseFromData:[msg data] error:NULL]; + data = [msg data]; + XCTAssertNotNil(data); + msgPrime = [EnumTestMsg parseFromData:data error:NULL]; XCTAssertEqualObjects(msgPrime, msg); XCTAssertEqual(msgPrime.foo, EnumTestMsg_MyEnum_Zero); XCTAssertEqual(msgPrime.bar, EnumTestMsg_MyEnum_Two); @@ -1917,7 +1923,9 @@ XCTAssertEqual([msg.mumbleArray valueAtIndex:3], EnumTestMsg_MyEnum_NegOne); XCTAssertEqual([msg.mumbleArray valueAtIndex:4], EnumTestMsg_MyEnum_NegTwo); // Bounce to wire and back. - msgPrime = [EnumTestMsg parseFromData:[msg data] error:NULL]; + data = [msg data]; + XCTAssertNotNil(data); + msgPrime = [EnumTestMsg parseFromData:data error:NULL]; XCTAssertEqualObjects(msgPrime, msg); XCTAssertEqual([msgPrime.mumbleArray valueAtIndex:0], EnumTestMsg_MyEnum_Zero); diff --git a/protobuf.bzl b/protobuf.bzl index 86c6f251..bf748db6 100644 --- a/protobuf.bzl +++ b/protobuf.bzl @@ -141,6 +141,7 @@ def cc_proto_library( deps=[s + "_genproto" for s in deps], includes=includes, protoc=protoc, + visibility=["//visibility:public"], ) # An empty cc_library to make rule dependency consistent. native.cc_library( @@ -157,6 +158,7 @@ def cc_proto_library( protoc=protoc, gen_cc=1, outs=outs, + visibility=["//visibility:public"], ) if default_runtime and not default_runtime in cc_libs: @@ -245,6 +247,7 @@ def py_proto_library( protoc=protoc, gen_py=1, outs=outs, + visibility=["//visibility:public"], ) if include != None: diff --git a/python/setup.py b/python/setup.py index 9a7eaddf..18865e03 100755 --- a/python/setup.py +++ b/python/setup.py @@ -144,6 +144,12 @@ class build_py(_build_py): # _build_py is an old-style class, so super() doesn't work. _build_py.run(self) +class test_conformance(_build_py): + target = 'test_python' + def run(self): + cmd = 'cd ../conformance && make %s' % (test_conformance.target) + status = subprocess.check_call(cmd, shell=True) + if __name__ == '__main__': ext_module_list = [] @@ -152,6 +158,7 @@ if __name__ == '__main__': if cpp_impl in sys.argv: sys.argv.remove(cpp_impl) extra_compile_args = ['-Wno-write-strings', '-Wno-invalid-offsetof'] + test_conformance.target = 'test_python_cpp' if "clang" in os.popen('$CC --version').read(): extra_compile_args.append('-Wno-shorten-64-to-32') @@ -207,6 +214,7 @@ if __name__ == '__main__': cmdclass={ 'clean': clean, 'build_py': build_py, + 'test_conformance': test_conformance, }, install_requires=install_requires, ext_modules=ext_module_list, diff --git a/python/tox.ini b/python/tox.ini index a05460b5..683d82dc 100644 --- a/python/tox.ini +++ b/python/tox.ini @@ -15,6 +15,8 @@ commands = cpp: python setup.py -q build --cpp_implementation --warnings_as_errors python: python setup.py -q test -q cpp: python setup.py -q test -q --cpp_implementation + python: python setup.py -q test_conformance + cpp: python setup.py -q test_conformance --cpp_implementation deps = # Keep this list of dependencies in sync with setup.py. six @@ -8,5 +8,6 @@ genrule( py_library( name = "six", srcs = ["six.py"], + srcs_version = "PY2AND3", visibility = ["//visibility:public"], ) |