@@ -24,49 +24,92 @@ class AlgoliaRetryStrategyTests: XCTestCase {
2424 func testHostsRotation( ) {
2525
2626 let strategy = AlgoliaRetryStrategy ( hosts: [ host1, host2, host3, host4, host5] )
27-
28- XCTAssertEqual ( strategy. host ( for: . write) ? . url. absoluteString, " algolia1.com " )
29- XCTAssertEqual ( strategy. host ( for: . read) ? . url. absoluteString, " algolia3.com " )
30-
27+
28+ let writeHosts = strategy. retryableHosts ( for: . write)
29+ let readHosts = strategy. retryableHosts ( for: . read)
30+
31+ // Fresh state, first read and write hosts are available
32+ XCTAssertEqual ( writeHosts. next ( ) ? . url. absoluteString, " algolia1.com " )
33+ XCTAssertEqual ( readHosts. next ( ) ? . url. absoluteString, " algolia3.com " )
34+
35+ // First write host failed
3136 XCTAssertNoThrow ( strategy. notify ( host: host1, result: retryableErrorResult) )
32- XCTAssertEqual ( strategy. host ( for: . write) ? . url. absoluteString, " algolia2.com " )
33- XCTAssertEqual ( strategy. host ( for: . read) ? . url. absoluteString, " algolia3.com " )
37+ // Second write host is available now
38+ XCTAssertEqual ( writeHosts. next ( ) ? . url. absoluteString, " algolia2.com " )
39+ // First read host is still available
40+ XCTAssertEqual ( readHosts. next ( ) ? . url. absoluteString, " algolia3.com " )
3441
42+ // Second write host failed
3543 _ = strategy. notify ( host: host2, result: retryableErrorResult)
36- XCTAssertEqual ( strategy. host ( for: . write) ? . url. absoluteString, " algolia1.com " )
37- XCTAssertEqual ( strategy. host ( for: . read) ? . url. absoluteString, " algolia3.com " )
44+ // No more writable hosts available
45+ XCTAssertEqual ( writeHosts. next ( ) ? . url. absoluteString, nil )
46+ // First read host is still available
47+ XCTAssertEqual ( readHosts. next ( ) ? . url. absoluteString, " algolia3.com " )
3848
49+ // First read host failed
3950 _ = strategy. notify ( host: host3, result: retryableErrorResult)
40- XCTAssertEqual ( strategy. host ( for: . write) ? . url. absoluteString, " algolia1.com " )
41- XCTAssertEqual ( strategy. host ( for: . read) ? . url. absoluteString, " algolia4.com " )
51+ // No more writable hosts available
52+ XCTAssertEqual ( writeHosts. next ( ) ? . url. absoluteString, nil )
53+ // Second read host is available
54+ XCTAssertEqual ( readHosts. next ( ) ? . url. absoluteString, " algolia4.com " )
4255
56+ // Second read host failed
4357 _ = strategy. notify ( host: host4, result: retryableErrorResult)
44- XCTAssertEqual ( strategy. host ( for: . write) ? . url. absoluteString, " algolia1.com " )
45- XCTAssertEqual ( strategy. host ( for: . read) ? . url. absoluteString, " algolia5.com " )
58+ // No more writable hosts available
59+ XCTAssertEqual ( writeHosts. next ( ) ? . url. absoluteString, nil )
60+ // Third read host is available
61+ XCTAssertEqual ( readHosts. next ( ) ? . url. absoluteString, " algolia5.com " )
4662
63+ // Third read host failed
4764 _ = strategy. notify ( host: host5, result: retryableErrorResult)
48- XCTAssertEqual ( strategy. host ( for: . write) ? . url. absoluteString, " algolia1.com " )
49- XCTAssertEqual ( strategy. host ( for: . read) ? . url. absoluteString, " algolia3.com " )
65+ // No more writable hosts available
66+ XCTAssertEqual ( writeHosts. next ( ) ? . url. absoluteString, nil )
67+ // No more writable hosts available
68+ XCTAssertEqual ( readHosts. next ( ) ? . url. absoluteString, nil )
69+
70+ // When got new write hosts, all the write hosts reseted
71+ let newWriteHosts = strategy. retryableHosts ( for: . write)
72+ XCTAssertEqual ( newWriteHosts. next ( ) ? . url. absoluteString, " algolia1.com " )
73+
74+ // Previous write iterator is updated as well as it uses the weak reference to the same retry strategy
75+ XCTAssertEqual ( writeHosts. next ( ) ? . url. absoluteString, " algolia1.com " )
76+
77+ // Still no read host available
78+ XCTAssertEqual ( readHosts. next ( ) ? . url. absoluteString, nil )
79+
80+
81+ // When got new read hosts, all the read hosts reseted
82+ let newReadHosts = strategy. retryableHosts ( for: . read)
83+ XCTAssertEqual ( newReadHosts. next ( ) ? . url. absoluteString, " algolia3.com " )
84+
85+ // Previous read iterator is updated as well as it uses the weak reference to the same retry strategy
86+ XCTAssertEqual ( readHosts. next ( ) ? . url. absoluteString, " algolia3.com " )
87+
88+ // Same state kept for write hosts iterators
89+ XCTAssertEqual ( writeHosts. next ( ) ? . url. absoluteString, " algolia1.com " )
90+ XCTAssertEqual ( newWriteHosts. next ( ) ? . url. absoluteString, " algolia1.com " )
91+
5092
5193 }
5294
5395 func testTimeout( ) {
5496
5597 let strategy = AlgoliaRetryStrategy ( hosts: [ host3, host4, host5] )
56-
98+ let readHosts = strategy. retryableHosts ( for: . read)
99+
57100 var host : RetryableHost ?
58- var lastUpdate : Date ? = strategy . host ( for : . read ) ? . lastUpdated
101+ var lastUpdate : Date ? = readHosts . next ( ) ? . lastUpdated
59102
60103 _ = strategy. notify ( host: host3, result: timeoutErrorResult)
61- host = strategy . host ( for : . read )
104+ host = readHosts . next ( )
62105 XCTAssertGreaterThan ( host!. lastUpdated. timeIntervalSince1970, lastUpdate!. timeIntervalSince1970)
63106 lastUpdate = host? . lastUpdated
64107 XCTAssertNotNil ( host)
65108 XCTAssertTrue ( host!. isUp)
66109 XCTAssertEqual ( host!. retryCount, 1 )
67110
68111 _ = strategy. notify ( host: host3, result: timeoutErrorResult)
69- host = strategy . host ( for : . read )
112+ host = readHosts . next ( )
70113 XCTAssertGreaterThan ( host!. lastUpdated. timeIntervalSince1970, lastUpdate!. timeIntervalSince1970)
71114 XCTAssertNotNil ( host)
72115 XCTAssertTrue ( host!. isUp)
@@ -77,14 +120,17 @@ class AlgoliaRetryStrategyTests: XCTestCase {
77120 func testResetExpired( ) {
78121 let expirationDelay : TimeInterval = 3
79122 let strategy = AlgoliaRetryStrategy ( hosts: [ host3, host4, host5] , hostsExpirationDelay: expirationDelay)
80-
123+ _ = strategy. retryableHosts ( for: . read)
124+
81125 _ = strategy. notify ( host: host3, result: retryableErrorResult)
82126 _ = strategy. notify ( host: host4, result: retryableErrorResult)
83127 _ = strategy. notify ( host: host5, result: retryableErrorResult)
84128
85129 sleep ( UInt32 ( expirationDelay) )
130+
131+ let newReadHosts = strategy. retryableHosts ( for: . read)
86132
87- XCTAssertEqual ( strategy . host ( for : . read ) ? . url. absoluteString, " algolia3.com " )
133+ XCTAssertEqual ( newReadHosts . next ( ) ? . url. absoluteString, " algolia3.com " )
88134 }
89135
90136}
0 commit comments