mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
107 lines
2.7 KiB
Swift
107 lines
2.7 KiB
Swift
// RUN: %target-build-swift -Xfrontend -disable-access-control -module-name a %s -o %t.out
|
|
// RUN: %target-run %t.out | FileCheck %s
|
|
|
|
import StdlibUnittest
|
|
|
|
// Also import modules which are used by StdlibUnittest internally. This
|
|
// workaround is needed to link all required libraries in case we compile
|
|
// StdlibUnittest with -sil-serialize-all.
|
|
import SwiftPrivate
|
|
import SwiftPrivatePthreadExtras
|
|
#if _runtime(_ObjC)
|
|
import ObjectiveC
|
|
#endif
|
|
|
|
_setTestSuiteFailedCallback() { print("abort()") }
|
|
|
|
struct RaceTest1 : RaceTestWithPerTrialData {
|
|
static var shouldPass: Bool = true
|
|
static var iterationCountdown: _stdlib_AtomicInt = _stdlib_AtomicInt(8)
|
|
|
|
class RaceData {
|
|
init() {}
|
|
}
|
|
|
|
typealias ThreadLocalData = Void
|
|
typealias Observation = Observation1UInt
|
|
|
|
func makeRaceData() -> RaceData {
|
|
return RaceData()
|
|
}
|
|
|
|
func makeThreadLocalData() -> Void {
|
|
return Void()
|
|
}
|
|
|
|
func thread1(
|
|
raceData: RaceData, _ threadLocalData: inout ThreadLocalData
|
|
) -> Observation {
|
|
switch RaceTest1.iterationCountdown.fetchAndAdd(-1) {
|
|
case 0:
|
|
return Observation(0x1)
|
|
|
|
case 1:
|
|
return Observation(RaceTest1.shouldPass ? 0x1 : 0xffff)
|
|
|
|
case 1, 2:
|
|
return Observation(0x2)
|
|
|
|
case 3, 4, 5:
|
|
return Observation(RaceTest1.shouldPass ? 0x2 : 0xfffe)
|
|
|
|
default:
|
|
return Observation(0x1)
|
|
}
|
|
}
|
|
|
|
func evaluateObservations(
|
|
observations: [Observation],
|
|
_ sink: (RaceTestObservationEvaluation) -> Void
|
|
) {
|
|
for observation in observations {
|
|
switch observation {
|
|
case Observation(0x1):
|
|
sink(.pass)
|
|
case Observation(0x2):
|
|
sink(.passInteresting(String(observation)))
|
|
case Observation(0xffff):
|
|
sink(.failure)
|
|
case Observation(0xfffe):
|
|
sink(.failureInteresting(String(observation)))
|
|
default:
|
|
fatalError("should not happen")
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
var RaceTestSuite = TestSuite("Race")
|
|
|
|
RaceTestSuite.test("passes") {
|
|
RaceTest1.shouldPass = true
|
|
RaceTest1.iterationCountdown = _stdlib_AtomicInt(8)
|
|
runRaceTest(RaceTest1.self, trials: 10)
|
|
}
|
|
// CHECK: [ RUN ] Race.passes
|
|
// CHECK: out>>> Pass: {{.*}} times
|
|
// CHECK: out>>> Pass (2): 4 times
|
|
// CHECK: out>>> Failure: 0 times
|
|
// CHECK: [ OK ] Race.passes
|
|
|
|
RaceTestSuite.test("fails") {
|
|
RaceTest1.shouldPass = false
|
|
RaceTest1.iterationCountdown = _stdlib_AtomicInt(8)
|
|
runRaceTest(RaceTest1.self, trials: 10)
|
|
}
|
|
// CHECK: [ RUN ] Race.fails
|
|
// REQUIRES: executable_test
|
|
// CHECK: out>>> Pass: {{.*}} times
|
|
// CHECK: out>>> Pass (2): 1 times
|
|
// CHECK: out>>> Failure: 1 times
|
|
// CHECK: out>>> Failure (65534): 3 times
|
|
// CHECK: [ FAIL ] Race.fails
|
|
// CHECK: Race: Some tests failed, aborting
|
|
|
|
runAllTests()
|
|
|