diff --git a/Sources/Shell/Output.swift b/Sources/Shell/Output.swift index 63c1f9d..6c79272 100644 --- a/Sources/Shell/Output.swift +++ b/Sources/Shell/Output.swift @@ -77,6 +77,13 @@ public final class RunOutput { stderror.trimmingCharacters(in: .whitespacesAndNewlines) } + public func throwIfError() throws -> Self { + if let err = error() { + throw err + } + return self + } + // MAKR: - enum Result { diff --git a/Sources/Shell/Shell.swift b/Sources/Shell/Shell.swift index 5fe436c..7c1780d 100644 --- a/Sources/Shell/Shell.swift +++ b/Sources/Shell/Shell.swift @@ -28,11 +28,11 @@ public func run(_ executable: String, args: [String], otherParams: RunParams? = } let (process, group, waitFunc) = run - let stdoutData = outPipe.fileHandleForReading.readDataToEndOfFile() var stderrData: Data! DispatchQueue.global().async(group: group) { stderrData = errPipe.fileHandleForReading.readDataToEndOfFile() } + let stdoutData = outPipe.fileHandleForReading.readDataToEndOfFile() waitFunc() diff --git a/Tests/ShellTests/OutputTests.swift b/Tests/ShellTests/OutputTests.swift index ec0cd6c..50c7ddc 100644 --- a/Tests/ShellTests/OutputTests.swift +++ b/Tests/ShellTests/OutputTests.swift @@ -16,7 +16,7 @@ extension String: LocalizedError { final class OutputTests: XCTestCase { - func test_RunOutput_errored() { + func test_RunOutput_errored() throws { let r = RunOutput(raw: .throwError("dd")) if let err = r.error(), case let .launchFailed(innerErr) = err { XCTAssertEqual(innerErr.localizedDescription, "dd") @@ -29,9 +29,10 @@ final class OutputTests: XCTestCase { XCTAssertEqual(r.stderror, "") XCTAssertEqual(r.stdoutTrimmed, "") XCTAssertEqual(r.stderrTrimmed, "") + XCTAssertThrowsError(try r.throwIfError()) } - func test_RunOutput_succeeded() { + func test_RunOutput_succeeded() throws { let r = RunOutput(raw: .finished(code: 0, stdout: "123\n".data(using: .utf8), stderr: "456\n".data(using: .utf8))) XCTAssertNil(r.error()) XCTAssertEqual(r.exitCode, 0) @@ -40,6 +41,8 @@ final class OutputTests: XCTestCase { XCTAssertEqual(r.stderror, "456\n") XCTAssertEqual(r.stdoutTrimmed, "123") XCTAssertEqual(r.stderrTrimmed, "456") + let n = try r.throwIfError() + XCTAssertTrue(n === r) } func test_RunOutput_failed() { diff --git a/Tests/ShellTests/ShellTests.swift b/Tests/ShellTests/ShellTests.swift index 9d16ee2..5066c58 100644 --- a/Tests/ShellTests/ShellTests.swift +++ b/Tests/ShellTests/ShellTests.swift @@ -50,6 +50,18 @@ final class ShellTests: XCTestCase { #endif } + func testShellRun_longOutput() { + // more then the buffer length + let count = 100000 + let stdout = Shell.run("bash", "-c", "for i in {1..\(count)}; do >&1 echo 'Welcome'; done") + XCTAssertTrue(stdout.succeeded) + XCTAssertEqual(stdout.stdout, String(repeating: "Welcome\n", count: count)) + + let stderr = Shell.run("bash", "-c", "for i in {1..\(count)}; do >&2 echo 'Welcome'; done") + XCTAssertTrue(stderr.succeeded) + XCTAssertEqual(stderr.stderror, String(repeating: "Welcome\n", count: count)) + } + // --- test run and print --- func testRunAndPrint_succeed() throws {