7
7
8
8
import Foundation
9
9
import Rainbow
10
- import ShellOut
10
+ import Basic
11
+ import Utility
12
+ import POSIX
11
13
import Dispatch
12
14
13
15
/// Specifies how to parallelize test runs.
@@ -36,7 +38,7 @@ public enum ParallelismLevel {
36
38
class TestRunner {
37
39
38
40
/// The test directory in which tests reside.
39
- let testDir : URL
41
+ let testDir : Foundation . URL
40
42
41
43
/// The set of substitutions to apply to each run line.
42
44
let substitutor : Substitutor
@@ -92,7 +94,7 @@ class TestRunner {
92
94
let enumerator = fm. enumerator ( at: testDir,
93
95
includingPropertiesForKeys: nil ) !
94
96
var files = [ TestFile] ( )
95
- for case let file as URL in enumerator {
97
+ for case let file as Foundation . URL in enumerator {
96
98
guard pathExtensions. contains ( file. pathExtension) else { continue }
97
99
let nsPath = NSString ( string: file. path)
98
100
let matchesFilter = filters. contains {
@@ -250,15 +252,26 @@ class TestRunner {
250
252
let exitCode : Int
251
253
let bash = file. makeCommandLine ( line, substitutor: substitutor)
252
254
do {
253
- stdout = try shellOut ( to: bash)
255
+ let args = bash. split ( separator: " " ) . map { String ( $0 as Substring ) }
256
+ let result = try Process . popen ( arguments: args)
257
+ stdout = try result. utf8Output ( ) . chomp ( )
254
258
stderr = " "
255
- exitCode = 0
256
- } catch let error as ShellOutError {
257
- stderr = error. message
258
- stdout = error. output
259
- exitCode = Int ( error. terminationStatus)
259
+ switch result. exitStatus {
260
+ case let . terminated( code: code) :
261
+ exitCode = Int ( code)
262
+ case let . signalled( signal: code) :
263
+ exitCode = Int ( code)
264
+ }
265
+ } catch let error as SystemError {
266
+ stderr = error. description
267
+ stdout = " "
268
+ exitCode = Int ( error. exitCode)
269
+ } catch let error as Basic . Process . Error {
270
+ stderr = error. description
271
+ stdout = " "
272
+ exitCode = Int ( EXIT_FAILURE)
260
273
} catch {
261
- fatalError ( " unhandled error" )
274
+ fatalError ( " \( error) " )
262
275
}
263
276
let end = Date ( )
264
277
results. append ( TestResult ( line: line,
@@ -271,3 +284,60 @@ class TestRunner {
271
284
return results
272
285
}
273
286
}
287
+
288
+ extension SystemError {
289
+ var exitCode : Int32 {
290
+ switch self {
291
+ case . chdir( let errno, _) :
292
+ return errno
293
+ case . close( let errno) :
294
+ return errno
295
+ case . dirfd( let errno, _) :
296
+ return errno
297
+ case . exec( let errno, _, _) :
298
+ return errno
299
+ case . fgetc( let errno) :
300
+ return errno
301
+ case . fread( let errno) :
302
+ return errno
303
+ case . getcwd( let errno) :
304
+ return errno
305
+ case . mkdir( let errno, _) :
306
+ return errno
307
+ case . mkdtemp( let errno) :
308
+ return errno
309
+ case . pipe( let errno) :
310
+ return errno
311
+ case . posix_spawn( let errno, _) :
312
+ return errno
313
+ case . popen( let errno, _) :
314
+ return errno
315
+ case . read( let errno) :
316
+ return errno
317
+ case . readdir( let errno, _) :
318
+ return errno
319
+ case . realpath( let errno, _) :
320
+ return errno
321
+ case . rename( let errno, _, _) :
322
+ return errno
323
+ case . rmdir( let errno, _) :
324
+ return errno
325
+ case . setenv( let errno, _) :
326
+ return errno
327
+ case . stat( let errno, _) :
328
+ return errno
329
+ case . symlink( let errno, _, _) :
330
+ return errno
331
+ case . symlinkat( let errno, _) :
332
+ return errno
333
+ case . unlink( let errno, _) :
334
+ return errno
335
+ case . unsetenv( let errno, _) :
336
+ return errno
337
+ case . waitpid( let errno) :
338
+ return errno
339
+ case . usleep( let errno) :
340
+ return errno
341
+ }
342
+ }
343
+ }
0 commit comments