@@ -19,10 +19,6 @@ typealias ProcessID = TSCBasic.Process.ProcessID
1919typealias Process = TSCBasic . Process
2020
2121class 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 \n simple 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