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 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190
|
// 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()
|