File: TestSupport.swift

package info (click to toggle)
swiftlang 6.0.3-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 2,519,992 kB
  • sloc: cpp: 9,107,863; ansic: 2,040,022; asm: 1,135,751; python: 296,500; objc: 82,456; f90: 60,502; lisp: 34,951; pascal: 19,946; sh: 18,133; perl: 7,482; ml: 4,937; javascript: 4,117; makefile: 3,840; awk: 3,535; xml: 914; fortran: 619; cs: 573; ruby: 573
file content (86 lines) | stat: -rw-r--r-- 3,238 bytes parent folder | download
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)
    }
}