diff --git a/Package.swift b/Package.swift index 0f8ca7e..1f2bdfc 100644 --- a/Package.swift +++ b/Package.swift @@ -16,6 +16,8 @@ let package = Package( dependencies: ["CBacktrace"]), .target(name: "CBacktrace", dependencies: []), + .target(name: "Sample", + dependencies: ["Backtrace"]), .testTarget(name: "BacktraceTests", dependencies: ["Backtrace"]), ] diff --git a/Sources/Sample/main.swift b/Sources/Sample/main.swift new file mode 100644 index 0000000..2e1879a --- /dev/null +++ b/Sources/Sample/main.swift @@ -0,0 +1,19 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the SwiftLinuxBacktrace open source project +// +// Copyright (c) 2019-2020 Apple Inc. and the SwiftLinuxBacktrace project authors +// Licensed under Apache License v2.0 +// +// See LICENSE.txt for license information +// See CONTRIBUTORS.txt for the list of SwiftLinuxBacktrace project authors +// +// SPDX-License-Identifier: Apache-2.0 +// +//===----------------------------------------------------------------------===// + +import Backtrace + +let reason = CommandLine.arguments.count == 2 ? CommandLine.arguments[1] : "unknown" +Backtrace.install() +fatalError(reason) diff --git a/Tests/BacktraceTests/BacktraceTests+XCTest.swift b/Tests/BacktraceTests/BacktraceTests+XCTest.swift index 70f41ad..4c5f604 100644 --- a/Tests/BacktraceTests/BacktraceTests+XCTest.swift +++ b/Tests/BacktraceTests/BacktraceTests+XCTest.swift @@ -23,9 +23,9 @@ import XCTest /// extension BacktraceTests { - static var allTests: [(String, (BacktraceTests) -> () throws -> Void)] { + public static var allTests: [(String, (BacktraceTests) -> () throws -> Void)] { return [ - ("testExample", testExample), + ("testBacktrace", testBacktrace), ] } } diff --git a/Tests/BacktraceTests/BacktraceTests.swift b/Tests/BacktraceTests/BacktraceTests.swift index 5c748d7..2c7db36 100644 --- a/Tests/BacktraceTests/BacktraceTests.swift +++ b/Tests/BacktraceTests/BacktraceTests.swift @@ -12,14 +12,25 @@ // //===----------------------------------------------------------------------===// -@testable import Backtrace import XCTest -final class BacktraceTests: XCTestCase { - func testExample() { - // This is an example of a functional test case. - // Use XCTAssert and related functions to verify your tests produce the correct - // results. - XCTAssert(true) +public final class BacktraceTests: XCTestCase { + func testBacktrace() { + #if os(Linux) + let expectedError = UUID().uuidString + let pipe = Pipe() + let process = Process() + process.executableURL = URL(fileURLWithPath: "/usr/bin/swift") + process.arguments = ["run", "Sample", expectedError] + process.standardError = pipe + XCTAssertNoThrow(try process.run()) + if process.isRunning { + process.waitUntilExit() + } + let stderr = String(data: pipe.fileHandleForReading.readDataToEndOfFile(), encoding: .utf8) ?? "" + print(stderr) + XCTAssert(stderr.contains("Current stack trace:"), "expected stanard error to include backtrace") + XCTAssert(stderr.contains("Fatal error: \(expectedError)"), "expected stanard error to include error information") + #endif } } diff --git a/Tests/LinuxMain.swift b/Tests/LinuxMain.swift index 751c9c9..6d90d1f 100644 --- a/Tests/LinuxMain.swift +++ b/Tests/LinuxMain.swift @@ -23,7 +23,7 @@ import XCTest /// #if os(Linux) || os(FreeBSD) -@testable import BacktraceTests +import BacktraceTests XCTMain([ testCase(BacktraceTests.allTests), diff --git a/docker/docker-compose.yaml b/docker/docker-compose.yaml index c60f504..91ddf2c 100644 --- a/docker/docker-compose.yaml +++ b/docker/docker-compose.yaml @@ -28,7 +28,7 @@ services: test: <<: *common - command: /bin/bash -cl "swift test -Xswiftc -warnings-as-errors $${SANITIZER_ARG-}" + command: /bin/bash -cl "swift test -c release -Xswiftc -g -Xswiftc -warnings-as-errors $${SANITIZER_ARG-}" # util diff --git a/scripts/generate_linux_tests.rb b/scripts/generate_linux_tests.rb index 82b45e7..7249500 100755 --- a/scripts/generate_linux_tests.rb +++ b/scripts/generate_linux_tests.rb @@ -72,7 +72,7 @@ def createExtensionFile(fileName, classes) for classArray in classes file.write 'extension ' + classArray[0] + " {\n" - file.write ' static var allTests: [(String, (' + classArray[0] + ") -> () throws -> Void)] {\n" + file.write ' public static var allTests: [(String, (' + classArray[0] + ") -> () throws -> Void)] {\n" file.write " return [\n" for funcName in classArray[1] @@ -96,7 +96,7 @@ def createLinuxMain(testsDirectory, allTestSubDirectories, files) file.write "#if os(Linux) || os(FreeBSD)\n" for testSubDirectory in allTestSubDirectories.sort { |x, y| x <=> y } - file.write '@testable import ' + testSubDirectory + "\n" + file.write 'import ' + testSubDirectory + "\n" end file.write "\n" file.write "XCTMain([\n"