mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
In debug configurations, fatal error messages include file & line number information. This update presents this information in a format matching the diagnostic conventions used by the compiler, which can be a slight productivity boost.
Code compiled with optimizations enabled (which is most production code) does not output this information, so it isn’t affected by this change.
Original format:
Fatal error: A suffusion of yellow: file calc.swift, line 5
New format:
calc.swift:5: Fatal error: A suffusion of yellow
Resolves rdar://68484891
191 lines
6.1 KiB
Swift
191 lines
6.1 KiB
Swift
// RUN: %target-run-simple-swift 2>&1 | %FileCheck %s
|
|
// REQUIRES: executable_test
|
|
// FIXME: this test is failing for watchos <rdar://problem/29997033>
|
|
// UNSUPPORTED: OS=watchos
|
|
|
|
import StdlibUnittest
|
|
|
|
#if os(Windows)
|
|
// HACK: It seems that other platforms might be lucky and the stdout and stderr
|
|
// are being sent to the parent process in the order they are used. However, in
|
|
// Windows the result of a print followed by a fatalError is not always ordered
|
|
// the same in the parent. To avoid a random order, we add Sleep(1) before the
|
|
// fatalError calls, which yields enough time to other threads so the output is
|
|
// ordered like in other platforms.
|
|
import WinSDK
|
|
#endif
|
|
|
|
|
|
_setOverrideOSVersion(.osx(major: 10, minor: 9, bugFix: 3))
|
|
_setTestSuiteFailedCallback() { print("abort()") }
|
|
|
|
private func fatalErrorWithDelayIfNeeded(
|
|
_ message: @autoclosure () -> String = String(),
|
|
file: StaticString = #file, line: UInt = #line
|
|
) -> Never {
|
|
#if os(Windows)
|
|
Sleep(1)
|
|
#endif
|
|
fatalError(message, file: file, line: line)
|
|
}
|
|
|
|
//
|
|
// Test that harness aborts when a test crashes during a test run.
|
|
//
|
|
|
|
var TestSuiteCrashes = TestSuite("TestSuiteCrashes")
|
|
|
|
TestSuiteCrashes.test("crashesUnexpectedly1") {
|
|
print("crashesUnexpectedly1")
|
|
fatalErrorWithDelayIfNeeded("This should crash")
|
|
}
|
|
// CHECK: stdout>>> crashesUnexpectedly1
|
|
// CHECK: stderr>>> {{.*}}Fatal error: This should crash
|
|
// CHECK: stderr>>> CRASHED: SIG
|
|
// CHECK: [ FAIL ] TestSuiteCrashes.crashesUnexpectedly1
|
|
|
|
TestSuiteCrashes.test("passes1") {
|
|
print("passes1")
|
|
expectEqual(1, 1)
|
|
}
|
|
// CHECK: stdout>>> passes1
|
|
// CHECK: [ OK ] TestSuiteCrashes.passes1
|
|
|
|
TestSuiteCrashes.test("fails1") {
|
|
print("fails1")
|
|
expectEqual(1, 2)
|
|
}
|
|
// CHECK: stdout>>> fails1
|
|
// CHECK: stdout>>> check failed
|
|
// CHECK: [ FAIL ] TestSuiteCrashes.fails1
|
|
|
|
TestSuiteCrashes.test("crashesUnexpectedly2") {
|
|
print("crashesUnexpectedly2")
|
|
fatalErrorWithDelayIfNeeded("This should crash")
|
|
}
|
|
// CHECK: stdout>>> crashesUnexpectedly2
|
|
// CHECK: stderr>>> {{.*}}Fatal error: This should crash
|
|
// CHECK: stderr>>> CRASHED: SIG
|
|
// CHECK: [ FAIL ] TestSuiteCrashes.crashesUnexpectedly2
|
|
|
|
TestSuiteCrashes.test("passes2") {
|
|
print("passes2")
|
|
expectEqual(1, 1)
|
|
}
|
|
// CHECK: stdout>>> passes2
|
|
// CHECK: [ OK ] TestSuiteCrashes.passes2
|
|
|
|
TestSuiteCrashes.test("fails2") {
|
|
print("fails2")
|
|
expectEqual(1, 2)
|
|
}
|
|
// CHECK: stdout>>> fails2
|
|
// CHECK: stdout>>> check failed
|
|
// CHECK: [ FAIL ] TestSuiteCrashes.fails2
|
|
|
|
TestSuiteCrashes.test("crashesAsExpected1") {
|
|
print("crashesAsExpected1")
|
|
expectCrashLater()
|
|
fatalErrorWithDelayIfNeeded("This should crash")
|
|
}
|
|
// CHECK: stdout>>> crashesAsExpected1
|
|
// CHECK: stderr>>> {{.*}}Fatal error: This should crash
|
|
// CHECK: stderr>>> OK: saw expected "crashed: sig
|
|
// CHECK: [ OK ] TestSuiteCrashes.crashesAsExpected1
|
|
|
|
TestSuiteCrashes.test("passes3") {
|
|
print("passes3")
|
|
expectEqual(1, 1)
|
|
}
|
|
// CHECK: stdout>>> passes3
|
|
// CHECK: [ OK ] TestSuiteCrashes.passes3
|
|
|
|
TestSuiteCrashes.test("fails3") {
|
|
print("fails3")
|
|
expectEqual(1, 2)
|
|
}
|
|
// CHECK: stdout>>> fails3
|
|
// CHECK: stdout>>> check failed
|
|
// CHECK: [ FAIL ] TestSuiteCrashes.fails3
|
|
|
|
TestSuiteCrashes.test("crashesUnexpectedlyXfail")
|
|
.xfail(.osxBugFix(10, 9, 3, reason: "")).code {
|
|
print("crashesUnexpectedlyXfail")
|
|
fatalErrorWithDelayIfNeeded("This should crash")
|
|
}
|
|
// CHECK: stdout>>> crashesUnexpectedlyXfail
|
|
// CHECK: stderr>>> {{.*}}Fatal error: This should crash
|
|
// CHECK: stderr>>> CRASHED: SIG
|
|
// CHECK: [ XFAIL ] TestSuiteCrashes.crashesUnexpectedlyXfail
|
|
|
|
TestSuiteCrashes.test("crashesAsExpectedXfail")
|
|
.xfail(.osxBugFix(10, 9, 3, reason: "")).code {
|
|
print("crashesAsExpectedXfail")
|
|
expectCrashLater()
|
|
fatalErrorWithDelayIfNeeded("This should crash")
|
|
}
|
|
// CHECK: stdout>>> crashesAsExpectedXfail
|
|
// CHECK: stderr>>> {{.*}}Fatal error: This should crash
|
|
// CHECK: stderr>>> OK: saw expected "crashed: sig
|
|
// CHECK: [ UXPASS ] TestSuiteCrashes.crashesAsExpectedXfail
|
|
|
|
TestSuiteCrashes.test("crashesWithMessagePasses")
|
|
.crashOutputMatches("This should crash").code {
|
|
print("abcd")
|
|
expectCrashLater()
|
|
fatalErrorWithDelayIfNeeded("This should crash")
|
|
}
|
|
// CHECK: stdout>>> abcd
|
|
// CHECK: stderr>>> {{.*}}Fatal error: This should crash
|
|
// CHECK: stderr>>> OK: saw expected "crashed: sig
|
|
// CHECK: [ OK ] TestSuiteCrashes.crashesWithMessagePasses
|
|
|
|
TestSuiteCrashes.test("crashesWithMessageFails")
|
|
.crashOutputMatches("This should crash").code {
|
|
print("This should crash")
|
|
expectCrashLater()
|
|
fatalErrorWithDelayIfNeeded("unexpected message")
|
|
}
|
|
// CHECK: stdout>>> This should crash
|
|
// CHECK: stderr>>> {{.*}}Fatal error: unexpected message
|
|
// CHECK: stderr>>> OK: saw expected "crashed: sig
|
|
// CHECK: did not find expected string after crash: "This should crash"
|
|
// CHECK: [ FAIL ] TestSuiteCrashes.crashesWithMessageFails
|
|
|
|
TestSuiteCrashes.test("crashesWithMultipleMessagesPasses")
|
|
.crashOutputMatches("little dog")
|
|
.crashOutputMatches("This should crash")
|
|
.crashOutputMatches("too")
|
|
.code {
|
|
print("abcd")
|
|
expectCrashLater()
|
|
fatalErrorWithDelayIfNeeded("This should crash and your little dog too")
|
|
}
|
|
// CHECK: stdout>>> abcd
|
|
// CHECK: stderr>>> {{.*}}Fatal error: This should crash and your little dog too
|
|
// CHECK: stderr>>> OK: saw expected "crashed: sig
|
|
// CHECK: [ OK ] TestSuiteCrashes.crashesWithMultipleMessagesPasses
|
|
|
|
TestSuiteCrashes.test("crashesWithMultipleMessagesFails")
|
|
.crashOutputMatches("unexpected message")
|
|
.crashOutputMatches("This should crash")
|
|
.crashOutputMatches("big dog")
|
|
.crashOutputMatches("and your little dog too")
|
|
.code {
|
|
print("This should crash")
|
|
expectCrashLater()
|
|
fatalErrorWithDelayIfNeeded("unexpected message and your little dog too")
|
|
}
|
|
// CHECK: stdout>>> This should crash
|
|
// CHECK: stderr>>> {{.*}}Fatal error: unexpected message and your little dog too
|
|
// CHECK: stderr>>> OK: saw expected "crashed: sig
|
|
// CHECK: did not find expected string after crash: "This should crash"
|
|
// CHECK: did not find expected string after crash: "big dog"
|
|
// CHECK: [ FAIL ] TestSuiteCrashes.crashesWithMultipleMessagesFails
|
|
|
|
// CHECK: TestSuiteCrashes: Some tests failed, aborting
|
|
// CHECK: abort()
|
|
|
|
runAllTests()
|
|
|