Skip to content

Commit 301d475

Browse files
authored
Fix tests on macOS 13 (#354)
Python is no longer installed in `/usr/bin`, so support `/usr/local` as well. In the medium term, we should not depend on Python for these tests.
1 parent 7c8bcf3 commit 301d475

File tree

1 file changed

+48
-16
lines changed

1 file changed

+48
-16
lines changed

Tests/TSCBasicTests/ProcessTests.swift

Lines changed: 48 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,6 @@ typealias ProcessID = TSCBasic.Process.ProcessID
1919
typealias Process = TSCBasic.Process
2020

2121
class ProcessTests: XCTestCase {
22-
func script(_ name: String) -> String {
23-
return AbsolutePath(path: #file).parentDirectory.appending(components: "processInputs", name).pathString
24-
}
25-
2622
func testBasics() throws {
2723
do {
2824
let process = Process(args: "echo", "hello")
@@ -34,7 +30,7 @@ class ProcessTests: XCTestCase {
3430
}
3531

3632
do {
37-
let process = Process(args: script("exit4"))
33+
let process = Process(scriptName: "exit4")
3834
try process.launch()
3935
let result = try process.waitUntilExit()
4036
XCTAssertEqual(result.exitStatus, .terminated(code: 4))
@@ -100,7 +96,7 @@ class ProcessTests: XCTestCase {
10096
}
10197

10298
do {
103-
let output = try Process.checkNonZeroExit(args: script("exit4"))
99+
let output = try Process.checkNonZeroExit(scriptName: "exit4")
104100
XCTFail("Unexpected success \(output)")
105101
} catch ProcessResult.Error.nonZeroExit(let result) {
106102
XCTAssertEqual(result.exitStatus, .terminated(code: 4))
@@ -162,7 +158,7 @@ class ProcessTests: XCTestCase {
162158
try testWithTemporaryDirectory { tmpdir in
163159
let file = tmpdir.appending(component: "pidfile")
164160
let waitFile = tmpdir.appending(component: "waitFile")
165-
let process = Process(args: self.script("print-pid"), file.pathString, waitFile.pathString)
161+
let process = Process(scriptName: "print-pid", arguments: [file.pathString, waitFile.pathString])
166162
try processes.add(process)
167163
try process.launch()
168164
guard waitForFile(waitFile) else {
@@ -190,7 +186,7 @@ class ProcessTests: XCTestCase {
190186
try testWithTemporaryDirectory { tmpdir in
191187
let file = tmpdir.appending(component: "pidfile")
192188
let waitFile = tmpdir.appending(component: "waitFile")
193-
let process = Process(args: self.script("subprocess"), file.pathString, waitFile.pathString)
189+
let process = Process(scriptName: "subprocess", arguments: [file.pathString, waitFile.pathString])
194190
try processes.add(process)
195191
try process.launch()
196192
guard waitForFile(waitFile) else {
@@ -255,7 +251,7 @@ class ProcessTests: XCTestCase {
255251

256252
func testStdin() throws {
257253
var stdout = [UInt8]()
258-
let process = Process(args: script("in-to-out"), outputRedirection: .stream(stdout: { stdoutBytes in
254+
let process = Process(scriptName: "in-to-out", outputRedirection: .stream(stdout: { stdoutBytes in
259255
stdout += stdoutBytes
260256
}, stderr: { _ in }))
261257
let stdinStream = try process.launch()
@@ -273,22 +269,22 @@ class ProcessTests: XCTestCase {
273269
func testStdoutStdErr() throws {
274270
// A simple script to check that stdout and stderr are captured separatly.
275271
do {
276-
let result = try Process.popen(args: script("simple-stdout-stderr"))
272+
let result = try Process.popen(scriptName: "simple-stdout-stderr")
277273
XCTAssertEqual(try result.utf8Output(), "simple output\n")
278274
XCTAssertEqual(try result.utf8stderrOutput(), "simple error\n")
279275
}
280276

281277
// A long stdout and stderr output.
282278
do {
283-
let result = try Process.popen(args: script("long-stdout-stderr"))
279+
let result = try Process.popen(scriptName: "long-stdout-stderr")
284280
let count = 16 * 1024
285281
XCTAssertEqual(try result.utf8Output(), String(repeating: "1", count: count))
286282
XCTAssertEqual(try result.utf8stderrOutput(), String(repeating: "2", count: count))
287283
}
288284

289285
// This script will block if the streams are not read.
290286
do {
291-
let result = try Process.popen(args: script("deadlock-if-blocking-io"))
287+
let result = try Process.popen(scriptName: "deadlock-if-blocking-io")
292288
let count = 16 * 1024
293289
XCTAssertEqual(try result.utf8Output(), String(repeating: "1", count: count))
294290
XCTAssertEqual(try result.utf8stderrOutput(), String(repeating: "2", count: count))
@@ -298,7 +294,7 @@ class ProcessTests: XCTestCase {
298294
func testStdoutStdErrRedirected() throws {
299295
// A simple script to check that stdout and stderr are captured in the same location.
300296
do {
301-
let process = Process(args: script("simple-stdout-stderr"), outputRedirection: .collect(redirectStderr: true))
297+
let process = Process(scriptName: "simple-stdout-stderr", outputRedirection: .collect(redirectStderr: true))
302298
try process.launch()
303299
let result = try process.waitUntilExit()
304300
XCTAssertEqual(try result.utf8Output(), "simple error\nsimple output\n")
@@ -307,7 +303,7 @@ class ProcessTests: XCTestCase {
307303

308304
// A long stdout and stderr output.
309305
do {
310-
let process = Process(args: script("long-stdout-stderr"), outputRedirection: .collect(redirectStderr: true))
306+
let process = Process(scriptName: "long-stdout-stderr", outputRedirection: .collect(redirectStderr: true))
311307
try process.launch()
312308
let result = try process.waitUntilExit()
313309

@@ -320,7 +316,7 @@ class ProcessTests: XCTestCase {
320316
func testStdoutStdErrStreaming() throws {
321317
var stdout = [UInt8]()
322318
var stderr = [UInt8]()
323-
let process = Process(args: script("long-stdout-stderr"), outputRedirection: .stream(stdout: { stdoutBytes in
319+
let process = Process(scriptName: "long-stdout-stderr", outputRedirection: .stream(stdout: { stdoutBytes in
324320
stdout += stdoutBytes
325321
}, stderr: { stderrBytes in
326322
stderr += stderrBytes
@@ -336,7 +332,7 @@ class ProcessTests: XCTestCase {
336332
func testStdoutStdErrStreamingRedirected() throws {
337333
var stdout = [UInt8]()
338334
var stderr = [UInt8]()
339-
let process = Process(args: script("long-stdout-stderr"), outputRedirection: .stream(stdout: { stdoutBytes in
335+
let process = Process(scriptName: "long-stdout-stderr", outputRedirection: .stream(stdout: { stdoutBytes in
340336
stdout += stdoutBytes
341337
}, stderr: { stderrBytes in
342338
stderr += stderrBytes
@@ -386,3 +382,39 @@ class ProcessTests: XCTestCase {
386382
}
387383
}
388384
}
385+
386+
fileprivate extension Process {
387+
private static func env() -> [String:String] {
388+
var env = ProcessEnv.vars
389+
#if os(macOS)
390+
// Many of these tests use Python which might not be in the default `PATH` when running these tests from Xcode.
391+
env["PATH"] = "\(env["PATH"] ?? ""):/usr/local/bin"
392+
#endif
393+
return env
394+
}
395+
396+
private static func script(_ name: String) -> String {
397+
return AbsolutePath(path: #file).parentDirectory.appending(components: "processInputs", name).pathString
398+
}
399+
400+
convenience init(scriptName: String, arguments: [String] = [], outputRedirection: OutputRedirection = .collect) {
401+
self.init(arguments: [Self.script(scriptName)] + arguments, environment: Self.env(), outputRedirection: outputRedirection)
402+
}
403+
404+
static func checkNonZeroExit(
405+
scriptName: String,
406+
environment: [String: String] = ProcessEnv.vars,
407+
loggingHandler: LoggingHandler? = .none
408+
) throws -> String {
409+
return try checkNonZeroExit(args: script(scriptName), environment: environment, loggingHandler: loggingHandler)
410+
}
411+
412+
@discardableResult
413+
static func popen(
414+
scriptName: String,
415+
environment: [String: String] = ProcessEnv.vars,
416+
loggingHandler: LoggingHandler? = .none
417+
) throws -> ProcessResult {
418+
return try popen(arguments: [script(scriptName)], environment: Self.env(), loggingHandler: loggingHandler)
419+
}
420+
}

0 commit comments

Comments
 (0)