1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86
|
import Foundation
import XCTest
struct TestSupport {
struct Configuration: Codable {
let hostSwiftExecutablePath: URL
let hostSdkRootPath: String?
static let `default`: Configuration? = {
let decoder = JSONDecoder()
let defaultsPath = URL(fileURLWithPath: #filePath)
.deletingLastPathComponent() // WITExtractorPluginTests
.deletingLastPathComponent() // Tests
.appendingPathComponent("default.json")
guard let bytes = try? Data(contentsOf: defaultsPath) else { return nil }
return try? decoder.decode(Configuration.self, from: bytes)
}()
}
static func withTemporaryDirectory<Result>(
_ body: (String) throws -> Result
) throws -> Result {
let tempdir = URL(fileURLWithPath: NSTemporaryDirectory())
let templatePath = tempdir.appendingPathComponent("WasmKit.XXXXXX")
var template = [UInt8](templatePath.path.utf8).map({ Int8($0) }) + [Int8(0)]
if mkdtemp(&template) == nil {
throw Error(errno: errno)
}
let path = String(cString: template)
defer { _ = try? FileManager.default.removeItem(atPath: path) }
return try body(path)
}
struct Error: Swift.Error, CustomStringConvertible {
let description: String
init(description: String) {
self.description = description
}
init(errno: Int32) {
self.init(description: String(cString: strerror(errno)))
}
}
}
func assertSwiftPackage(fixturePackage: String, _ trailingArguments: [String]) throws -> String {
guard let config = TestSupport.Configuration.default else {
throw XCTSkip("Please create 'Tests/default.json'")
}
let swiftExecutable = config.hostSwiftExecutablePath
let packagePath = URL(fileURLWithPath: #filePath)
.deletingLastPathComponent()
.appendingPathComponent("Fixtures")
.appendingPathComponent(fixturePackage)
return try TestSupport.withTemporaryDirectory { buildDir in
var arguments = ["package", "--package-path", packagePath.path, "--scratch-path", buildDir]
if let sdkRootPath = config.hostSdkRootPath {
arguments += ["--sdk", sdkRootPath]
}
arguments += trailingArguments
let stdoutPipe = Pipe()
let process = Process()
process.executableURL = URL(fileURLWithPath: swiftExecutable.path)
process.arguments = arguments
process.standardOutput = stdoutPipe
try process.run()
process.waitUntilExit()
guard process.terminationStatus == 0 else {
throw TestSupport.Error(
description: "Failed to execute \(([swiftExecutable.path] + arguments).joined(separator: " "))"
)
}
guard let stdoutBytes = try stdoutPipe.fileHandleForReading.readToEnd() else { return "" }
struct Output: Codable {
let witOutputPath: String
let swiftOutputPath: String
}
let jsonOutput = try JSONDecoder().decode(Output.self, from: stdoutBytes)
return try String(contentsOfFile: jsonOutput.witOutputPath)
}
}
|