Skip to content

Commit 56435cf

Browse files
committed
Fix tests compilation for FileHandle missing functions in old Darwin OSes
1 parent e536ed4 commit 56435cf

File tree

3 files changed

+58
-8
lines changed

3 files changed

+58
-8
lines changed
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
import Foundation
2+
3+
4+
5+
private let system_read = read
6+
private let system_close = close
7+
8+
extension FileHandle {
9+
10+
func jl_close() throws {
11+
if #available(macOS 10.15, *) {
12+
try close()
13+
} else {
14+
/* closeFile exists but I’m not sure it never throws an ObjC exception, so I call the C function. */
15+
let ret = system_close(fileDescriptor)
16+
guard ret == 0 else {
17+
throw Errno()
18+
}
19+
}
20+
}
21+
22+
func jl_readToEnd() throws -> Data? {
23+
if #available(macOS 10.15, tvOS 13.0, iOS 13.0, watchOS 6.0, *) {
24+
return try readToEnd()
25+
} else {
26+
let buffer = UnsafeMutableRawBufferPointer.allocate(byteCount: 512, alignment: MemoryLayout<UInt8>.alignment)
27+
defer {buffer.deallocate()}
28+
29+
var nread = 0
30+
var ret = Data()
31+
repeat {
32+
nread = system_read(fileDescriptor, buffer.baseAddress, buffer.count)
33+
ret += buffer
34+
} while nread > 0
35+
guard nread >= 0 else {
36+
throw Errno()
37+
}
38+
return ret
39+
}
40+
}
41+
42+
}
43+
44+
45+
struct Errno : Error {
46+
var err: errno_t
47+
init() {
48+
self.err = errno
49+
}
50+
}

Tests/JSONLoggerTests/JSONLoggerTests.swift

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -66,17 +66,17 @@ final class JSONLoggerTests : XCTestCase {
6666
let pipe = Pipe()
6767
let jsonLogger = JSONLogger(label: "best-logger", fileHandle: pipe.fileHandleForWriting, lineSeparator: Data([0x0a]), prefix: Data(), suffix: Data())
6868
jsonLogger.log(level: .info, message: "First log message", metadata: nil, source: "dummy-source", file: "dummy-file", function: "dummy-function", line: 42)
69-
try pipe.fileHandleForWriting.close()
70-
let data = try pipe.fileHandleForReading.readToEnd() ?? Data()
69+
try pipe.fileHandleForWriting.jl_close()
70+
let data = try pipe.fileHandleForReading.jl_readToEnd() ?? Data()
7171
XCTAssertEqual(data.first, 0x7b)
7272
}
7373

7474
func testSeparatorForNotFirstLog() throws {
7575
let pipe = Pipe()
7676
let jsonLogger = JSONLogger(label: "best-logger", fileHandle: pipe.fileHandleForWriting, lineSeparator: Data([0x0a]), prefix: Data(), suffix: Data())
7777
jsonLogger.log(level: .info, message: "Not first log message", metadata: nil, source: "dummy-source", file: "dummy-file", function: "dummy-function", line: 42)
78-
try pipe.fileHandleForWriting.close()
79-
let data = try pipe.fileHandleForReading.readToEnd() ?? Data()
78+
try pipe.fileHandleForWriting.jl_close()
79+
let data = try pipe.fileHandleForReading.jl_readToEnd() ?? Data()
8080
XCTAssertEqual(data.first, 0x0a)
8181
}
8282

@@ -91,8 +91,8 @@ final class JSONLoggerTests : XCTestCase {
9191
let pipe = Pipe()
9292
let jsonLogger = JSONLogger(label: "best-logger", fileHandle: pipe.fileHandleForWriting)
9393
jsonLogger.log(level: ref.level, message: "\(ref.message)", metadata: ["yolo": .stringConvertible(BestStruct(val: 21))], source: ref.source, file: ref.file, function: ref.function, line: ref.line)
94-
try pipe.fileHandleForWriting.close()
95-
let data = try pipe.fileHandleForReading.readToEnd() ?? Data()
94+
try pipe.fileHandleForWriting.jl_close()
95+
let data = try pipe.fileHandleForReading.jl_readToEnd() ?? Data()
9696
//print(data.reduce("", { $0 + String(format: "%02x", $1) }))
9797
var line = try Self.defaultJSONDecoder.decode(LogLine.self, from: data)
9898
XCTAssertLessThanOrEqual(line.date.timeIntervalSince(ref.date), 0.1)
@@ -122,8 +122,8 @@ final class JSONLoggerTests : XCTestCase {
122122
let pipe = Pipe()
123123
let jsonLogger = JSONLogger(label: "best-logger", fileHandle: pipe.fileHandleForWriting, jsonEncoder: failEncoder)
124124
jsonLogger.log(level: ref.level, message: "\(ref.message)", metadata: ["yolo": .stringConvertible(BestStruct(val: 21))], source: ref.source, file: ref.file, function: ref.function, line: ref.line)
125-
try pipe.fileHandleForWriting.close()
126-
let data = try pipe.fileHandleForReading.readToEnd() ?? Data()
125+
try pipe.fileHandleForWriting.jl_close()
126+
let data = try pipe.fileHandleForReading.jl_readToEnd() ?? Data()
127127
var line = try Self.defaultJSONDecoder.decode(LogLine.self, from: data)
128128
XCTAssertLessThanOrEqual(line.date.timeIntervalSince(ref.date), 0.1)
129129
line.date = mangled.date

0 commit comments

Comments
 (0)