File: AsyncUtilsTests.swift

package info (click to toggle)
swiftlang 6.1.3-1
  • links: PTS, VCS
  • area: main
  • in suites: forky
  • size: 2,791,532 kB
  • sloc: cpp: 9,901,743; ansic: 2,201,431; asm: 1,091,827; python: 308,252; objc: 82,166; f90: 80,126; lisp: 38,358; pascal: 25,559; sh: 20,429; ml: 5,058; perl: 4,745; makefile: 4,484; awk: 3,535; javascript: 3,018; xml: 918; fortran: 664; cs: 573; ruby: 396
file content (72 lines) | stat: -rw-r--r-- 2,349 bytes parent folder | download | duplicates (2)
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
//===----------------------------------------------------------------------===//
//
// This source file is part of the Swift.org open source project
//
// Copyright (c) 2014 - 2018 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 the list of Swift project authors
//
//===----------------------------------------------------------------------===//

import SKLogging
import SKTestSupport
import SwiftExtensions
import XCTest

#if os(Windows)
import WinSDK
#elseif canImport(Android)
import Android
#endif

final class AsyncUtilsTests: XCTestCase {
  func testWithTimeout() async throws {
    let expectation = self.expectation(description: "withTimeout body finished")
    await assertThrowsError(
      try await withTimeout(.seconds(0.1)) {
        try? await Task.sleep(for: .seconds(10))
        XCTAssert(Task.isCancelled)
        expectation.fulfill()
      }
    ) { error in
      XCTAssert(error is TimeoutError, "Received unexpected error \(error)")
    }
    try await fulfillmentOfOrThrow([expectation])
  }

  func testWithTimeoutReturnsImmediatelyEvenIfBodyDoesntCooperateInCancellation() async throws {
    let start = Date()
    await assertThrowsError(
      try await withTimeout(.seconds(0.1)) {
        #if os(Windows)
        Sleep(10_000 /*ms*/)
        #else
        sleep(10 /*s*/)
        #endif
      }
    ) { error in
      XCTAssert(error is TimeoutError, "Received unexpected error \(error)")
    }
    XCTAssert(Date().timeIntervalSince(start) < 5)
  }

  func testWithTimeoutEscalatesPriority() async throws {
    let expectation = self.expectation(description: "Timeout started")
    let task = Task(priority: .background) {
      // We don't actually hit the timeout. It's just a large value.
      try await withTimeout(.seconds(defaultTimeout * 2)) {
        expectation.fulfill()
        try await repeatUntilExpectedResult(sleepInterval: .seconds(0.1)) {
          logger.debug("Current priority: \(Task.currentPriority.rawValue)")
          return Task.currentPriority > .background
        }
      }
    }
    try await fulfillmentOfOrThrow([expectation])
    try await Task(priority: .high) {
      try await task.value
    }.value
  }
}