Skip to content

Commit 74eb084

Browse files
authored
Merge pull request #1677 from spevans/pr_sr_7455
2 parents 8a5c3d8 + 8422c1a commit 74eb084

File tree

9 files changed

+120
-22
lines changed

9 files changed

+120
-22
lines changed

DarwinCompatibilityTests.xcodeproj/project.pbxproj

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,10 @@
1010
B907F36F20BB188800013CBE /* NSString-ISO-8859-1-data.txt in Resources */ = {isa = PBXBuildFile; fileRef = B907F36E20BB188800013CBE /* NSString-ISO-8859-1-data.txt */; };
1111
B917D32420B0DB9700728EE0 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B917D32320B0DB9700728EE0 /* Foundation.framework */; };
1212
B917D32620B0DE2000728EE0 /* main.swift in Sources */ = {isa = PBXBuildFile; fileRef = B917D32520B0DE2000728EE0 /* main.swift */; };
13+
B94897772135E7AD00FB930E /* Utilities.swift in Sources */ = {isa = PBXBuildFile; fileRef = B94897762135E7AC00FB930E /* Utilities.swift */; };
1314
B95788861F6FB9470003EB01 /* TestNSNumberBridging.swift in Sources */ = {isa = PBXBuildFile; fileRef = B95788851F6FB9470003EB01 /* TestNSNumberBridging.swift */; };
1415
B987C65E2093C8AF0026B50D /* TestImports.swift in Sources */ = {isa = PBXBuildFile; fileRef = B987C65D2093C8AF0026B50D /* TestImports.swift */; };
16+
B98E33E02136AC120044EBE9 /* TestFileWithZeros.txt in Resources */ = {isa = PBXBuildFile; fileRef = B98E33DF2136AC120044EBE9 /* TestFileWithZeros.txt */; };
1517
B9C89F361F6BF89C00087AF4 /* TestScanner.swift in Sources */ = {isa = PBXBuildFile; fileRef = B9C89EE61F6BF88F00087AF4 /* TestScanner.swift */; };
1618
B9C89F371F6BF89C00087AF4 /* TestNSValue.swift in Sources */ = {isa = PBXBuildFile; fileRef = B9C89EE71F6BF88F00087AF4 /* TestNSValue.swift */; };
1719
B9C89F381F6BF89C00087AF4 /* TestUtils.swift in Sources */ = {isa = PBXBuildFile; fileRef = B9C89EE81F6BF88F00087AF4 /* TestUtils.swift */; };
@@ -151,8 +153,10 @@
151153
B917D31C20B0DB8B00728EE0 /* xdgTestHelper */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = xdgTestHelper; sourceTree = BUILT_PRODUCTS_DIR; };
152154
B917D32320B0DB9700728EE0 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };
153155
B917D32520B0DE2000728EE0 /* main.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = main.swift; path = TestFoundation/xdgTestHelper/main.swift; sourceTree = "<group>"; };
156+
B94897762135E7AC00FB930E /* Utilities.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = Utilities.swift; path = TestFoundation/Utilities.swift; sourceTree = "<group>"; };
154157
B95788851F6FB9470003EB01 /* TestNSNumberBridging.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = TestNSNumberBridging.swift; path = TestFoundation/TestNSNumberBridging.swift; sourceTree = "<group>"; };
155158
B987C65D2093C8AF0026B50D /* TestImports.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = TestImports.swift; path = TestFoundation/TestImports.swift; sourceTree = "<group>"; };
159+
B98E33DF2136AC120044EBE9 /* TestFileWithZeros.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = TestFileWithZeros.txt; path = TestFoundation/Resources/TestFileWithZeros.txt; sourceTree = "<group>"; };
156160
B9C89ED11F6BF67C00087AF4 /* XCTest.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XCTest.framework; path = Platforms/MacOSX.platform/Developer/Library/Frameworks/XCTest.framework; sourceTree = DEVELOPER_DIR; };
157161
B9C89ED71F6BF77E00087AF4 /* DarwinCompatibilityTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = DarwinCompatibilityTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
158162
B9C89EDB1F6BF77E00087AF4 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
@@ -288,9 +292,6 @@
288292
B9C89EB81F6BF47D00087AF4 = {
289293
isa = PBXGroup;
290294
children = (
291-
B917D32520B0DE2000728EE0 /* main.swift */,
292-
B987C65D2093C8AF0026B50D /* TestImports.swift */,
293-
B95788851F6FB9470003EB01 /* TestNSNumberBridging.swift */,
294295
B9C89FAC1F6DCAE700087AF4 /* Info.plist */,
295296
B9C89FAD1F6DCAE800087AF4 /* NSKeyedUnarchiver-ArrayTest.plist */,
296297
B9C89FB31F6DCAE900087AF4 /* NSKeyedUnarchiver-ComplexTest.plist */,
@@ -313,6 +314,11 @@
313314
B9C89FA91F6DCAE700087AF4 /* NSXMLDTDTestData.xml */,
314315
B9C89FB81F6DCAEB00087AF4 /* PropertyList-1.0.dtd */,
315316
B9C89FB91F6DCAEB00087AF4 /* Test.plist */,
317+
B98E33DF2136AC120044EBE9 /* TestFileWithZeros.txt */,
318+
B917D32520B0DE2000728EE0 /* main.swift */,
319+
B94897762135E7AC00FB930E /* Utilities.swift */,
320+
B987C65D2093C8AF0026B50D /* TestImports.swift */,
321+
B95788851F6FB9470003EB01 /* TestNSNumberBridging.swift */,
316322
B9C89F891F6D4D9D00087AF4 /* HTTPServer.swift */,
317323
B9C89F321F6BF89B00087AF4 /* TestAffineTransform.swift */,
318324
B9C89EFB1F6BF89200087AF4 /* TestBundle.swift */,
@@ -519,6 +525,7 @@
519525
B9C89FC11F6DCAEB00087AF4 /* Info.plist in Resources */,
520526
B9C89FC21F6DCAEB00087AF4 /* NSKeyedUnarchiver-ArrayTest.plist in Resources */,
521527
B9C89FC31F6DCAEB00087AF4 /* NSStringTestData.txt in Resources */,
528+
B98E33E02136AC120044EBE9 /* TestFileWithZeros.txt in Resources */,
522529
B9C89FC41F6DCAEB00087AF4 /* NSKeyedUnarchiver-OrderedSetTest.plist in Resources */,
523530
B9C89FC51F6DCAEB00087AF4 /* NSString-UTF32-BE-data.txt in Resources */,
524531
B9C89FC61F6DCAEB00087AF4 /* NSKeyedUnarchiver-URLTest.plist in Resources */,
@@ -548,6 +555,7 @@
548555
isa = PBXSourcesBuildPhase;
549556
buildActionMask = 2147483647;
550557
files = (
558+
B94897772135E7AD00FB930E /* Utilities.swift in Sources */,
551559
B987C65E2093C8AF0026B50D /* TestImports.swift in Sources */,
552560
B95788861F6FB9470003EB01 /* TestNSNumberBridging.swift in Sources */,
553561
B9C89F8B1F6D4DA900087AF4 /* HTTPServer.swift in Sources */,

Foundation.xcodeproj/project.pbxproj

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -347,6 +347,7 @@
347347
B933A79E1F3055F700FE6846 /* NSString-UTF32-BE-data.txt in Resources */ = {isa = PBXBuildFile; fileRef = B933A79C1F3055F600FE6846 /* NSString-UTF32-BE-data.txt */; };
348348
B933A79F1F3055F700FE6846 /* NSString-UTF32-LE-data.txt in Resources */ = {isa = PBXBuildFile; fileRef = B933A79D1F3055F600FE6846 /* NSString-UTF32-LE-data.txt */; };
349349
B951B5EC1F4E2A2000D8B332 /* TestNSLock.swift in Sources */ = {isa = PBXBuildFile; fileRef = B951B5EB1F4E2A2000D8B332 /* TestNSLock.swift */; };
350+
B98E33DD2136AA740044EBE9 /* TestFileWithZeros.txt in Resources */ = {isa = PBXBuildFile; fileRef = B98E33DC2136AA740044EBE9 /* TestFileWithZeros.txt */; };
350351
B9974B961EDF4A22007F15B8 /* TransferState.swift in Sources */ = {isa = PBXBuildFile; fileRef = B9974B8F1EDF4A22007F15B8 /* TransferState.swift */; };
351352
B9974B971EDF4A22007F15B8 /* MultiHandle.swift in Sources */ = {isa = PBXBuildFile; fileRef = B9974B901EDF4A22007F15B8 /* MultiHandle.swift */; };
352353
B9974B981EDF4A22007F15B8 /* libcurlHelpers.swift in Sources */ = {isa = PBXBuildFile; fileRef = B9974B911EDF4A22007F15B8 /* libcurlHelpers.swift */; };
@@ -855,6 +856,7 @@
855856
B933A79C1F3055F600FE6846 /* NSString-UTF32-BE-data.txt */ = {isa = PBXFileReference; lastKnownFileType = text; path = "NSString-UTF32-BE-data.txt"; sourceTree = "<group>"; };
856857
B933A79D1F3055F600FE6846 /* NSString-UTF32-LE-data.txt */ = {isa = PBXFileReference; lastKnownFileType = text; path = "NSString-UTF32-LE-data.txt"; sourceTree = "<group>"; };
857858
B951B5EB1F4E2A2000D8B332 /* TestNSLock.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TestNSLock.swift; sourceTree = "<group>"; };
859+
B98E33DC2136AA740044EBE9 /* TestFileWithZeros.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = TestFileWithZeros.txt; sourceTree = "<group>"; };
858860
B9974B8F1EDF4A22007F15B8 /* TransferState.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TransferState.swift; sourceTree = "<group>"; };
859861
B9974B901EDF4A22007F15B8 /* MultiHandle.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MultiHandle.swift; sourceTree = "<group>"; };
860862
B9974B911EDF4A22007F15B8 /* libcurlHelpers.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = libcurlHelpers.swift; sourceTree = "<group>"; };
@@ -1488,6 +1490,7 @@
14881490
EA66F6391BF1619600136161 /* Resources */ = {
14891491
isa = PBXGroup;
14901492
children = (
1493+
B98E33DC2136AA740044EBE9 /* TestFileWithZeros.txt */,
14911494
D370696D1C394FBF00295652 /* NSKeyedUnarchiver-RangeTest.plist */,
14921495
D3E8D6D41C36AC0C00295652 /* NSKeyedUnarchiver-RectTest.plist */,
14931496
D3E8D6D21C36982700295652 /* NSKeyedUnarchiver-EdgeInsetsTest.plist */,
@@ -2199,6 +2202,7 @@
21992202
isa = PBXResourcesBuildPhase;
22002203
buildActionMask = 2147483647;
22012204
files = (
2205+
B98E33DD2136AA740044EBE9 /* TestFileWithZeros.txt in Resources */,
22022206
B933A79E1F3055F700FE6846 /* NSString-UTF32-BE-data.txt in Resources */,
22032207
B933A79F1F3055F700FE6846 /* NSString-UTF32-LE-data.txt in Resources */,
22042208
D3A597F41C34142600295652 /* NSKeyedUnarchiver-NotificationTest.plist in Resources */,

Foundation/String.swift

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -29,22 +29,31 @@ extension String : _ObjectiveCBridgeable {
2929
result = source._storage
3030
} else if type(of: source) == _NSCFString.self {
3131
let cf = unsafeBitCast(source, to: CFString.self)
32-
if let str = CFStringGetCStringPtr(cf, CFStringEncoding(kCFStringEncodingUTF8)) {
33-
result = String(cString: str)
32+
let length = CFStringGetLength(cf)
33+
if length == 0 {
34+
result = ""
35+
} else if let ptr = CFStringGetCStringPtr(cf, CFStringEncoding(kCFStringEncodingASCII)) {
36+
// ASCII encoding has 1 byte per code point and CFStringGetLength() returned the length in
37+
// codepoints so length should be the length of the ASCII string in bytes. We cant ask for the UTF-8
38+
// encoding as some codepoints are multi-byte in UTF8 so the buffer length wouldn't be known.
39+
// Note: CFStringGetCStringPtr(cf, CFStringEncoding(kCFStringEncodingUTF8)) does seems to return NULL
40+
// for strings with multibyte UTF-8 but this isnt guaranteed or documented so ASCII is safer.
41+
result = ptr.withMemoryRebound(to: UInt8.self, capacity: length) {
42+
return String(decoding: UnsafeBufferPointer(start: $0, count: length), as: UTF8.self)
43+
}
44+
} else if let ptr = CFStringGetCharactersPtr(cf) {
45+
result = String(decoding: UnsafeBufferPointer(start: ptr, count: length), as: UTF16.self)
3446
} else {
35-
let length = CFStringGetLength(cf)
3647
let buffer = UnsafeMutablePointer<UniChar>.allocate(capacity: length)
3748
CFStringGetCharacters(cf, CFRangeMake(0, length), buffer)
3849

39-
let str = String(decoding: UnsafeBufferPointer(start: buffer, count: length), as: UTF16.self)
50+
result = String(decoding: UnsafeBufferPointer(start: buffer, count: length), as: UTF16.self)
4051
buffer.deinitialize(count: length)
4152
buffer.deallocate()
42-
result = str
4353
}
4454
} else if type(of: source) == _NSCFConstantString.self {
4555
let conststr = unsafeDowncast(source, to: _NSCFConstantString.self)
46-
let str = String(decoding: UnsafeBufferPointer(start: conststr._ptr, count: Int(conststr._length)), as: UTF8.self)
47-
result = str
56+
result = String(decoding: UnsafeBufferPointer(start: conststr._ptr, count: Int(conststr._length)), as: UTF8.self)
4857
} else {
4958
let len = source.length
5059
var characters = [unichar](repeating: 0, count: len)
45 Bytes
Binary file not shown.

TestFoundation/TestJSONSerialization.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1367,7 +1367,7 @@ extension TestJSONSerialization {
13671367
let result = try JSONSerialization.writeJSONObject(dict, toStream: outputStream, options: [])
13681368
outputStream.close()
13691369
if(result > -1) {
1370-
XCTAssertEqual(NSString(bytes: buffer, length: buffer.count, encoding: String.Encoding.utf8.rawValue), "{\"a\":{\"b\":1}}")
1370+
XCTAssertEqual(NSString(bytes: buffer, length: buffer.firstIndex(of: 0) ?? buffer.count, encoding: String.Encoding.utf8.rawValue), "{\"a\":{\"b\":1}}")
13711371
}
13721372
} catch {
13731373
XCTFail("Error thrown: \(error)")
@@ -1390,7 +1390,7 @@ extension TestJSONSerialization {
13901390
let resultRead: Int = fileStream.read(&buffer, maxLength: buffer.count)
13911391
fileStream.close()
13921392
if(resultRead > -1){
1393-
XCTAssertEqual(NSString(bytes: buffer, length: buffer.count, encoding: String.Encoding.utf8.rawValue), "{\"a\":{\"b\":1}}")
1393+
XCTAssertEqual(NSString(bytes: buffer, length: buffer.firstIndex(of: 0) ?? buffer.count, encoding: String.Encoding.utf8.rawValue), "{\"a\":{\"b\":1}}")
13941394
}
13951395
}
13961396
removeTestFile(filePath)

TestFoundation/TestNSData.swift

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1475,11 +1475,12 @@ extension TestNSData {
14751475
if let contents = contents {
14761476
XCTAssertTrue(contents.length > 0)
14771477
let ptr = UnsafeMutableRawPointer(mutating: contents.bytes)
1478-
let str = String(bytesNoCopy: ptr, length: contents.length,
1479-
encoding: .ascii, freeWhenDone: false)
1480-
XCTAssertNotNil(str)
1481-
if let str = str {
1478+
var zeroIdx = contents.range(of: Data([0]), in: NSMakeRange(0, contents.length)).location
1479+
if zeroIdx == NSNotFound { zeroIdx = contents.length }
1480+
if let str = String(bytesNoCopy: ptr, length: zeroIdx, encoding: .ascii, freeWhenDone: false) {
14821481
XCTAssertTrue(str.hasSuffix("TestFoundation"))
1482+
} else {
1483+
XCTFail("Cant create String")
14831484
}
14841485
}
14851486

TestFoundation/TestNSString.swift

Lines changed: 76 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ class TestNSString: LoopbackServerTest {
3131

3232
static var allTests: [(String, (TestNSString) -> () throws -> Void)] {
3333
return [
34+
("test_initData", test_initData),
3435
("test_boolValue", test_boolValue ),
3536
("test_BridgeConstruction", test_BridgeConstruction ),
3637
("test_integerValue", test_integerValue ),
@@ -95,7 +96,71 @@ class TestNSString: LoopbackServerTest {
9596
("test_commonPrefix", test_commonPrefix)
9697
]
9798
}
98-
99+
100+
func test_initData() {
101+
let testString = "\u{00} This is a test string"
102+
let data = testString.data(using: .utf8)!
103+
XCTAssertEqual(data.count, 23)
104+
_ = data.withUnsafeBytes { (bytes: UnsafePointer<UInt8>) in
105+
if let text1 = NSString(bytes: bytes , length: data.count, encoding: String.Encoding.utf8.rawValue) {
106+
XCTAssertEqual(text1.length, data.count)
107+
XCTAssertEqual(text1, testString as NSString)
108+
} else {
109+
XCTFail("Cant convert Data to NSString")
110+
}
111+
}
112+
113+
if let text2 = String(data: data, encoding: .utf8) {
114+
XCTAssertEqual(text2.count, data.count)
115+
XCTAssertEqual(text2, testString)
116+
} else {
117+
XCTFail("Cant convert Data to String")
118+
}
119+
120+
// Test multibyte UTF8 and UTF16
121+
// kra ("ĸ") has codepoint value 312,
122+
// as UTF-8 bytes it is 0xC4 0xB8
123+
// as UTF-16 bytes it is 0x1, 0x38
124+
let kra = "ĸ"
125+
let utf8KraData = Data(bytes: [0xc4, 0xb8])
126+
if let utf8kra = utf8KraData.withUnsafeBytes( { (bytes: UnsafePointer<UInt8>) in
127+
return NSString(bytes: bytes, length: utf8KraData.count, encoding: String.Encoding.utf8.rawValue)
128+
}) {
129+
XCTAssertEqual(kra.count, 1)
130+
XCTAssertEqual(kra.utf8.count, 2)
131+
XCTAssertEqual(kra.utf16.count, 1)
132+
XCTAssertEqual(kra, utf8kra as String)
133+
} else {
134+
XCTFail("Cant create UTF8 kra")
135+
}
136+
137+
let utf16KraData = Data(bytes: [0x1, 0x38])
138+
if let utf16kra = utf16KraData.withUnsafeBytes( { (bytes: UnsafePointer<UInt8>) in
139+
return NSString(bytes: bytes, length: utf16KraData.count, encoding: String.Encoding.utf16.rawValue)
140+
}) {
141+
XCTAssertEqual(kra.count, 1)
142+
XCTAssertEqual(kra.utf8.count, 2)
143+
XCTAssertEqual(kra.utf16.count, 1)
144+
XCTAssertEqual(kra, utf16kra as String)
145+
} else {
146+
XCTFail("Cant create UTF16 kra")
147+
}
148+
149+
// Test a large string > 255 characters
150+
let largeString = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut at tincidunt arcu. Suspendisse nec sodales erat, sit amet imperdiet ipsum. Etiam sed ornare felis. Nunc mauris turpis, bibendum non lectus quis, malesuada placerat turpis. Nam adipiscing non massa et semper. Nulla convallis semper bibendum."
151+
XCTAssertTrue(largeString.count > 255)
152+
let largeData = largeString.data(using: .utf8)!
153+
if let largeText = largeData.withUnsafeBytes( { (bytes: UnsafePointer<UInt8>) in
154+
return NSString(bytes: bytes, length: largeData.count, encoding: String.Encoding.ascii.rawValue)
155+
}) {
156+
XCTAssertEqual(largeText.length, largeString.count)
157+
XCTAssertEqual(largeText.length, largeData.count)
158+
XCTAssertEqual(largeString, largeText as String)
159+
} else {
160+
XCTFail("Cant convert large Data string to String")
161+
}
162+
}
163+
99164
func test_boolValue() {
100165
let trueStrings: [NSString] = ["t", "true", "TRUE", "tRuE", "yes", "YES", "1", "+000009"]
101166
for string in trueStrings {
@@ -326,6 +391,16 @@ class TestNSString: LoopbackServerTest {
326391
if let contents = contents {
327392
XCTAssertEqual(contents, "This file is encoded as ISO-8859-1\nÀÁÂÃÄÅÿ\n±\n")
328393
}
394+
395+
guard let zeroFileURL = testBundle().url(forResource: "TestFileWithZeros", withExtension: "txt") else {
396+
XCTFail("Cant get URL for TestFileWithZeros.txt")
397+
return
398+
}
399+
guard let zeroString = try? String(contentsOf: zeroFileURL, encoding: .utf8) else {
400+
XCTFail("Cant create string from \(zeroFileURL)")
401+
return
402+
}
403+
XCTAssertEqual(zeroString, "Some\u{00}text\u{00}with\u{00}NUL\u{00}bytes\u{00}instead\u{00}of\u{00}spaces.\u{00}\n")
329404
}
330405

331406
func test_FromContentOfFileUsedEncodingIgnored() {

TestFoundation/TestStream.swift

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,8 @@ class TestStream : XCTestCase {
3636
let result: Int = dataStream.read(&buffer, maxLength: buffer.count)
3737
dataStream.close()
3838
XCTAssertEqual(.closed, dataStream.streamStatus)
39-
if(result > 0){
40-
let output = NSString(bytes: &buffer, length: buffer.count, encoding: String.Encoding.utf8.rawValue)
39+
if(result > 0) {
40+
let output = NSString(bytes: &buffer, length: buffer.firstIndex(of: 0) ?? buffer.count, encoding: String.Encoding.utf8.rawValue)
4141
XCTAssertEqual(message, output!)
4242
}
4343
}
@@ -64,7 +64,7 @@ class TestStream : XCTestCase {
6464
XCTAssertEqual(.closed, urlStream.streamStatus)
6565
XCTAssertEqual(messageData.count, result)
6666
if(result > 0) {
67-
let output = NSString(bytes: &buffer, length: buffer.count, encoding: String.Encoding.utf8.rawValue)
67+
let output = NSString(bytes: &buffer, length: buffer.firstIndex(of: 0) ?? buffer.count, encoding: String.Encoding.utf8.rawValue)
6868
XCTAssertEqual(message, output!)
6969
}
7070
}
@@ -90,8 +90,8 @@ class TestStream : XCTestCase {
9090
fileStream.close()
9191
XCTAssertEqual(.closed, fileStream.streamStatus)
9292
XCTAssertEqual(messageData.count, result)
93-
if(result > 0){
94-
let output = NSString(bytes: &buffer, length: buffer.count, encoding: String.Encoding.utf8.rawValue)
93+
if(result > 0) {
94+
let output = NSString(bytes: &buffer, length: buffer.firstIndex(of: 0) ?? buffer.count, encoding: String.Encoding.utf8.rawValue)
9595
XCTAssertEqual(message, output!)
9696
}
9797
}

0 commit comments

Comments
 (0)