-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathRetryPolicyServiceLoggerTests.swift
More file actions
143 lines (113 loc) · 3.88 KB
/
RetryPolicyServiceLoggerTests.swift
File metadata and controls
143 lines (113 loc) · 3.88 KB
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
//
// Typhoon
// Copyright © 2026 Space Code. All rights reserved.
//
import Foundation
@testable import Typhoon
import XCTest
// MARK: - RetryPolicyServiceLoggerTests
final class RetryPolicyServiceLoggerTests: XCTestCase {
private var logger: MockLogger!
override func setUp() {
super.setUp()
logger = MockLogger()
}
override func tearDown() {
logger = nil
super.tearDown()
}
// MARK: - Tests
func test_logsNothing_onFirstAttemptSuccess() async throws {
// given
let sut = makeSUT()
// when
_ = try await sut.retry(strategy: nil, onFailure: nil) { 42 }
// then
XCTAssertTrue(logger.entries.isEmpty)
}
func test_logsWarning_onEachFailedAttempt() async {
// given
let sut = makeSUT(retry: 3)
let attempt = Counter()
// when
_ = try? await sut.retry(strategy: nil, onFailure: nil) {
attempt.increment()
if attempt.value < 3 { throw URLError(.notConnectedToInternet) }
return 42
}
// then
XCTAssertEqual(logger.warningMessages.count, 2)
XCTAssertTrue(logger.warningMessages.allSatisfy { $0.contains("[RetryPolicy]") })
}
func test_logsInfo_onSuccessAfterRetry() async throws {
let sut = makeSUT(retry: 3)
let attempt = Counter()
_ = try await sut.retry(strategy: nil, onFailure: nil) {
attempt.increment()
if attempt.value < 2 { throw URLError(.notConnectedToInternet) }
return 42
}
XCTAssertTrue(logger.infoMessages.contains { $0.contains("Succeeded after 2 attempt(s)") })
}
func test_logsError_onRetryLimitExceeded() async {
// given
let sut = makeSUT(retry: 2)
// when
_ = try? await sut.retry(strategy: nil, onFailure: nil) {
throw URLError(.notConnectedToInternet)
}
// then
XCTAssertTrue(logger.errorMessages.contains { $0.contains("Retry limit exceeded") })
}
func test_logsWarning_whenOnFailureStopsRetrying() async {
// given
let sut = makeSUT(retry: 5)
// when
_ = try? await sut.retry(
strategy: nil,
onFailure: { _ in false }
) {
throw URLError(.badServerResponse)
}
// then
XCTAssertTrue(logger.warningMessages.contains { $0.contains("onFailure returned false") })
}
func test_logsError_onTotalDurationExceeded() async {
// given
let sut = makeSUT(retry: 10, maxTotalDuration: .milliseconds(1))
// when
try? await Task.sleep(nanoseconds: 2_000_000)
_ = try? await sut.retry(strategy: nil, onFailure: nil) {
throw URLError(.timedOut)
}
// then
XCTAssertTrue(logger.errorMessages.contains { $0.contains("Total duration exceeded") })
}
func test_logsWarning_withFailedAttemptNumber() async {
// given
let sut = makeSUT(retry: 3)
let attempt = Counter()
// when
_ = try? await sut.retry(strategy: nil, onFailure: nil) {
attempt.increment()
throw URLError(.notConnectedToInternet)
}
// then
XCTAssertTrue(logger.warningMessages.first?.contains("Attempt 1") == true)
XCTAssertTrue(logger.warningMessages.dropFirst().first?.contains("Attempt 2") == true)
XCTAssertTrue(logger.warningMessages.dropFirst(2).first?.contains("Attempt 3") == true)
}
}
// MARK: - Helpers
private extension RetryPolicyServiceLoggerTests {
func makeSUT(
retry: UInt = 3,
maxTotalDuration: DispatchTimeInterval? = nil
) -> RetryPolicyService {
RetryPolicyService(
strategy: .constant(retry: retry, dispatchDuration: .milliseconds(1)),
maxTotalDuration: maxTotalDuration,
logger: logger
)
}
}