File: TestSupport.swift

package info (click to toggle)
swiftlang 6.2.3-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 2,856,264 kB
  • sloc: cpp: 9,995,718; ansic: 2,234,019; asm: 1,092,167; python: 313,940; objc: 82,726; f90: 80,126; lisp: 38,373; pascal: 25,580; sh: 20,378; ml: 5,058; perl: 4,751; makefile: 4,725; awk: 3,535; javascript: 3,018; xml: 918; fortran: 664; cs: 573; ruby: 396
file content (94 lines) | stat: -rw-r--r-- 3,676 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
87
88
89
90
91
92
93
94
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 {
            #if os(Android)
                throw Error(errno: __errno().pointee)
            #else
                throw Error(errno: errno)
            #endif
        }

        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 {
    #if os(iOS) || os(watchOS) || os(tvOS) || os(visionOS)
        throw XCTSkip("WITExtractor does not support platforms where Foundation.Process is unavailable")
    #else
        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)
        }
    #endif
}