Index: third_party/protobuf/objectivec/Tests/GPBCodedInputStreamTests.m |
diff --git a/third_party/protobuf/objectivec/Tests/GPBCodedInputStreamTests.m b/third_party/protobuf/objectivec/Tests/GPBCodedInputStreamTests.m |
index b0e39d2cf09f0d9a6b513acf47545529294fa713..cc40215698c7396d22d2de6be8a2668d5a102779 100644 |
--- a/third_party/protobuf/objectivec/Tests/GPBCodedInputStreamTests.m |
+++ b/third_party/protobuf/objectivec/Tests/GPBCodedInputStreamTests.m |
@@ -283,16 +283,53 @@ |
[output writeRawData:[NSData dataWithBytes:bytes length:sizeof(bytes)]]; |
[output flush]; |
- NSData* data = |
+ NSData *data = |
[rawOutput propertyForKey:NSStreamDataWrittenToMemoryStreamKey]; |
GPBCodedInputStream* input = [GPBCodedInputStream streamWithData:data]; |
+ NSError *error = nil; |
TestAllTypes* message = [TestAllTypes parseFromCodedInputStream:input |
extensionRegistry:nil |
- error:NULL]; |
- XCTAssertNotNil(message); |
- // Make sure we can read string properties twice without crashing. |
- XCTAssertEqual([message.defaultString length], (NSUInteger)0); |
- XCTAssertEqualObjects(@"", message.defaultString); |
+ error:&error]; |
+ XCTAssertNotNil(error); |
+ XCTAssertNil(message); |
+} |
+ |
+- (void)testBOMWithinStrings { |
+ // We've seen servers that end up with BOMs within strings (not always at the |
+ // start, and sometimes in multiple places), make sure they always parse |
+ // correctly. (Again, this is inpart incase a custom string class is ever |
+ // used again.) |
+ const char* strs[] = { |
+ "\xEF\xBB\xBF String with BOM", |
+ "String with \xEF\xBB\xBF in middle", |
+ "String with end bom \xEF\xBB\xBF", |
+ "\xEF\xBB\xBF\xe2\x99\xa1", // BOM White Heart |
+ "\xEF\xBB\xBF\xEF\xBB\xBF String with Two BOM", |
+ }; |
+ for (size_t i = 0; i < GPBARRAYSIZE(strs); ++i) { |
+ NSOutputStream* rawOutput = [NSOutputStream outputStreamToMemory]; |
+ GPBCodedOutputStream* output = |
+ [GPBCodedOutputStream streamWithOutputStream:rawOutput]; |
+ |
+ int32_t tag = GPBWireFormatMakeTag(TestAllTypes_FieldNumber_DefaultString, |
+ GPBWireFormatLengthDelimited); |
+ [output writeRawVarint32:tag]; |
+ size_t length = strlen(strs[i]); |
+ [output writeRawVarint32:(int32_t)length]; |
+ [output writeRawData:[NSData dataWithBytes:strs[i] length:length]]; |
+ [output flush]; |
+ |
+ NSData* data = |
+ [rawOutput propertyForKey:NSStreamDataWrittenToMemoryStreamKey]; |
+ GPBCodedInputStream* input = [GPBCodedInputStream streamWithData:data]; |
+ TestAllTypes* message = [TestAllTypes parseFromCodedInputStream:input |
+ extensionRegistry:nil |
+ error:NULL]; |
+ XCTAssertNotNil(message, @"Loop %zd", i); |
+ // Ensure the string is there. NSString can consume the BOM in some |
+ // cases, so don't actually check the string for exact equality. |
+ XCTAssertTrue(message.defaultString.length > 0, @"Loop %zd", i); |
+ } |
} |
@end |