Skip to content

Commit a59dcb8

Browse files
Improve running EndToEnd testcases by running in parallel, improve logging some more
1 parent a62a3cd commit a59dcb8

File tree

1 file changed

+35
-28
lines changed

1 file changed

+35
-28
lines changed

Tests/SwiftSDKGeneratorTests/EndToEndTests.swift

Lines changed: 35 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -59,19 +59,21 @@ func buildSDK(_ logger: Logger, scratchPath: String, withArguments runArguments:
5959
async throws -> String
6060
{
6161
var logger = logger
62-
logger[metadataKey: "runArguments"] = "\"\(runArguments)\""
63-
logger[metadataKey: "scratchPath"] = "\(scratchPath)"
62+
logger[metadataKey: "scratchPath"] = .string(scratchPath)
6463

65-
logger.info("Building Swift SDK")
64+
let packageDirectory = FilePath(#filePath)
65+
.removingLastComponent()
66+
.removingLastComponent()
6667

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+
)
7072

73+
logger.info("Building Swift SDK", metadata: ["runArguments": .string(runArguments)])
7174
let generatorOutput = try await Shell.readStdout(
7275
"cd \(packageDirectory) && swift run --scratch-path \"\(scratchPath)\" swift-sdk-generator make-linux-sdk \(runArguments)"
7376
)
74-
logger.info("Finished building Swift SDK")
7577

7678
let installCommand = try XCTUnwrap(
7779
generatorOutput.split(separator: "\n").first {
@@ -84,18 +86,16 @@ func buildSDK(_ logger: Logger, scratchPath: String, withArguments runArguments:
8486
).stem
8587
logger[metadataKey: "bundleName"] = "\(bundleName)"
8688

87-
logger.info("Checking installed Swift SDKs")
89+
// Make sure this bundle hasn't been installed already.
8890
let installedSDKs = try await Shell.readStdout("swift experimental-sdk list").components(
8991
separatedBy: "\n"
9092
)
91-
92-
// Make sure this bundle hasn't been installed already.
9393
if installedSDKs.contains(bundleName) {
94-
logger.info("Removing existing Swift SDK")
94+
logger.info("Removing existing Swift SDK", metadata: ["bundleName": .string(bundleName)])
9595
try await Shell.run("swift experimental-sdk remove \(bundleName)")
9696
}
9797

98-
logger.info("Installing new Swift SDK")
98+
logger.info("Installing new Swift SDK", metadata: ["bundleName": .string(bundleName)])
9999
let installOutput = try await Shell.readStdout(String(installCommand))
100100
XCTAssertTrue(installOutput.contains("successfully installed"))
101101

@@ -262,7 +262,6 @@ func buildTestcase(_ logger: Logger, testcase: String, bundleName: String, tempD
262262

263263
// This is a workaround for if Swift 6.0 is used as the host toolchain to run the generator.
264264
// 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...")
266265
let package_swift = testPackageURL.appendingPathComponent("Package.swift")
267266
let text = try String(contentsOf: package_swift, encoding: .utf8)
268267
var lines = text.components(separatedBy: .newlines)
@@ -353,29 +352,37 @@ func buildTestcases(config: SDKConfiguration) async throws {
353352
withArguments: config.sdkGeneratorArguments
354353
)
355354
}
356-
357-
logger.info("Built Swift SDK")
355+
logger[metadataKey: "bundleName"] = .string(bundleName)
358356

359357
// Cleanup
360358
func cleanupSDK() async {
361359
logger.info("Removing Swift SDK to clean up...")
362360
try? await Shell.run("swift experimental-sdk remove \(bundleName)")
363361
}
364362

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
375385
}
376-
} catch {
377-
await cleanupSDK()
378-
throw error
379386
}
380387
}
381388

0 commit comments

Comments
 (0)