@@ -59,19 +59,21 @@ func buildSDK(_ logger: Logger, scratchPath: String, withArguments runArguments:
59
59
async throws -> String
60
60
{
61
61
var logger = logger
62
- logger [ metadataKey: " runArguments " ] = " \" \( runArguments) \" "
63
- logger [ metadataKey: " scratchPath " ] = " \( scratchPath) "
62
+ logger [ metadataKey: " scratchPath " ] = . string( scratchPath)
64
63
65
- logger. info ( " Building Swift SDK " )
64
+ let packageDirectory = FilePath ( #filePath)
65
+ . removingLastComponent ( )
66
+ . removingLastComponent ( )
66
67
67
- var packageDirectory = FilePath ( #filePath)
68
- packageDirectory. removeLastComponent ( )
69
- packageDirectory. removeLastComponent ( )
68
+ logger. info ( " Building SDK generator " )
69
+ _ = try await Shell . readStdout (
70
+ " cd \( packageDirectory) && swift build --scratch-path \" \( scratchPath) \" --product swift-sdk-generator "
71
+ )
70
72
73
+ logger. info ( " Building Swift SDK " , metadata: [ " runArguments " : . string( runArguments) ] )
71
74
let generatorOutput = try await Shell . readStdout (
72
75
" cd \( packageDirectory) && swift run --scratch-path \" \( scratchPath) \" swift-sdk-generator make-linux-sdk \( runArguments) "
73
76
)
74
- logger. info ( " Finished building Swift SDK " )
75
77
76
78
let installCommand = try XCTUnwrap (
77
79
generatorOutput. split ( separator: " \n " ) . first {
@@ -84,18 +86,16 @@ func buildSDK(_ logger: Logger, scratchPath: String, withArguments runArguments:
84
86
) . stem
85
87
logger [ metadataKey: " bundleName " ] = " \( bundleName) "
86
88
87
- logger . info ( " Checking installed Swift SDKs " )
89
+ // Make sure this bundle hasn't been installed already.
88
90
let installedSDKs = try await Shell . readStdout ( " swift experimental-sdk list " ) . components (
89
91
separatedBy: " \n "
90
92
)
91
-
92
- // Make sure this bundle hasn't been installed already.
93
93
if installedSDKs. contains ( bundleName) {
94
- logger. info ( " Removing existing Swift SDK " )
94
+ logger. info ( " Removing existing Swift SDK " , metadata : [ " bundleName " : . string ( bundleName ) ] )
95
95
try await Shell . run ( " swift experimental-sdk remove \( bundleName) " )
96
96
}
97
97
98
- logger. info ( " Installing new Swift SDK " )
98
+ logger. info ( " Installing new Swift SDK " , metadata : [ " bundleName " : . string ( bundleName ) ] )
99
99
let installOutput = try await Shell . readStdout ( String ( installCommand) )
100
100
XCTAssertTrue ( installOutput. contains ( " successfully installed " ) )
101
101
@@ -262,7 +262,6 @@ func buildTestcase(_ logger: Logger, testcase: String, bundleName: String, tempD
262
262
263
263
// This is a workaround for if Swift 6.0 is used as the host toolchain to run the generator.
264
264
// We manually set the swift-tools-version to 5.9 to support building our test cases.
265
- logger. info ( " Updating minimum swift-tools-version in test project... " )
266
265
let package_swift = testPackageURL. appendingPathComponent ( " Package.swift " )
267
266
let text = try String ( contentsOf: package_swift, encoding: . utf8)
268
267
var lines = text. components ( separatedBy: . newlines)
@@ -353,29 +352,37 @@ func buildTestcases(config: SDKConfiguration) async throws {
353
352
withArguments: config. sdkGeneratorArguments
354
353
)
355
354
}
356
-
357
- logger. info ( " Built Swift SDK " )
355
+ logger [ metadataKey: " bundleName " ] = . string( bundleName)
358
356
359
357
// Cleanup
360
358
func cleanupSDK( ) async {
361
359
logger. info ( " Removing Swift SDK to clean up... " )
362
360
try ? await Shell . run ( " swift experimental-sdk remove \( bundleName) " )
363
361
}
364
362
365
- for (name, testcase) in testcases {
366
- logger [ metadataKey: " testcase " ] = . string( name)
367
- do {
368
- try await FileManager . default. withTemporaryDirectory ( logger: logger) { tempDir in
369
- try await buildTestcase (
370
- logger,
371
- testcase: testcase,
372
- bundleName: bundleName,
373
- tempDir: tempDir
374
- )
363
+ // Let's run the test cases in parallel to speed things up!
364
+ logger. info ( " Running test cases... " )
365
+ try await withThrowingTaskGroup ( of: Void . self) { group in
366
+ for (name, testcase) in testcases {
367
+ var testcaseLogger = logger
368
+ testcaseLogger [ metadataKey: " testcase " ] = . string( name)
369
+ group. addTask {
370
+ try await FileManager . default. withTemporaryDirectory ( logger: testcaseLogger) { tempDir in
371
+ try await buildTestcase (
372
+ testcaseLogger,
373
+ testcase: testcase,
374
+ bundleName: bundleName,
375
+ tempDir: tempDir
376
+ )
377
+ }
378
+ }
379
+
380
+ do {
381
+ try await group. next ( )
382
+ } catch {
383
+ await cleanupSDK ( )
384
+ throw error
375
385
}
376
- } catch {
377
- await cleanupSDK ( )
378
- throw error
379
386
}
380
387
}
381
388
0 commit comments