Skip to content

Commit a0dd497

Browse files
authored
Merge pull request #2043 from spevans/pr_fixpipe_read
TestProcess: Improve reading from a pipe with a sub-process
2 parents e764480 + 8e2f232 commit a0dd497

File tree

1 file changed

+22
-2
lines changed

1 file changed

+22
-2
lines changed

TestFoundation/TestProcess.swift

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -609,19 +609,39 @@ internal func runTask(_ arguments: [String], environment: [String: String]? = ni
609609
let stderrPipe = Pipe()
610610
process.standardOutput = stdoutPipe
611611
process.standardError = stderrPipe
612+
613+
var stdoutData = Data()
614+
stdoutPipe.fileHandleForReading.readabilityHandler = { fh in
615+
stdoutData.append(fh.availableData)
616+
}
617+
618+
var stderrData = Data()
619+
stderrPipe.fileHandleForReading.readabilityHandler = { fh in
620+
stderrData.append(fh.availableData)
621+
}
622+
612623
try process.run()
613624
process.waitUntilExit()
625+
stdoutPipe.fileHandleForReading.readabilityHandler = nil
626+
stderrPipe.fileHandleForReading.readabilityHandler = nil
627+
628+
// Drain any data remaining in the pipes
629+
if let d = try stdoutPipe.fileHandleForReading.readToEnd() {
630+
stdoutData.append(d)
631+
}
632+
633+
if let d = try stderrPipe.fileHandleForReading.readToEnd() {
634+
stderrData.append(d)
635+
}
614636

615637
guard process.terminationStatus == 0 else {
616638
throw Error.TerminationStatus(process.terminationStatus)
617639
}
618640

619-
let stdoutData = stdoutPipe.fileHandleForReading.availableData
620641
guard let stdout = String(data: stdoutData, encoding: .utf8) else {
621642
throw Error.UnicodeDecodingError(stdoutData)
622643
}
623644

624-
let stderrData = stderrPipe.fileHandleForReading.availableData
625645
guard let stderr = String(data: stderrData, encoding: .utf8) else {
626646
throw Error.UnicodeDecodingError(stderrData)
627647
}

0 commit comments

Comments
 (0)