File: LockTests.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 (62 lines) | stat: -rw-r--r-- 1,592 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
//
// This source file is part of the Swift.org open source project
//
// Copyright (c) 2023 Apple Inc. and the Swift project authors
// Licensed under Apache License v2.0 with Runtime Library Exception
//
// See https://swift.org/LICENSE.txt for license information
// See https://swift.org/CONTRIBUTORS.txt for Swift project authors
//

@testable import Testing
private import _TestingInternals

@Suite("Locked Tests")
struct LockTests {
  func testLock<L>(_ lock: LockedWith<L, Int>) {
    #expect(lock.rawValue == 0)
    lock.withLock { value in
      value = 1
    }
    #expect(lock.rawValue == 1)
  }

  @Test("Platform-default lock")
  func locking() {
    testLock(Locked(rawValue: 0))
  }

#if SWT_TARGET_OS_APPLE && !SWT_NO_OS_UNFAIR_LOCK
  @Test("pthread_mutex_t (Darwin alternate)")
  func lockingWith_pthread_mutex_t() {
    testLock(LockedWith<pthread_mutex_t, Int>(rawValue: 0))
  }
#endif

  @Test("No lock")
  func noLock() async {
    let lock = LockedWith<Never, Int>(rawValue: 0)
    await withTaskGroup { taskGroup in
      for _ in 0 ..< 100_000 {
        taskGroup.addTask {
          lock.increment()
        }
      }
    }
    #expect(lock.rawValue != 100_000)
  }

  @Test("Get the underlying lock")
  func underlyingLock() {
    let lock = Locked(rawValue: 0)
    testLock(lock)
    lock.withUnsafeUnderlyingLock { underlyingLock, _ in
      DefaultLock.unsafelyRelinquishLock(at: underlyingLock)
      lock.withLock { value in
        value += 1000
      }
      DefaultLock.unsafelyAcquireLock(at: underlyingLock)
    }
    #expect(lock.rawValue == 1001)
  }
}