@@ -124,6 +124,58 @@ struct PeerTests {
124124 typealias EphemeralHandler = MockEphemeralStreamHandler
125125 }
126126
127+ @Test
128+ func connectionRotationStrategy( ) async throws {
129+ var peers : [ Peer < MockStreamHandler > ] = [ ]
130+ var handlers : [ MockPresentStreamHandler ] = [ ]
131+ let centerPeer = try Peer (
132+ options: PeerOptions < MockStreamHandler > (
133+ role: . validator,
134+ listenAddress: NetAddr ( ipAddress: " 127.0.0.1 " , port: 0 ) !,
135+ genesisHeader: Data32 ( ) ,
136+ secretKey: Ed25519 . SecretKey ( from: Data32 . random ( ) ) ,
137+ presistentStreamHandler: MockPresentStreamHandler ( ) ,
138+ ephemeralStreamHandler: MockEphemeralStreamHandler ( ) ,
139+ serverSettings: . defaultSettings,
140+ clientSettings: . defaultSettings
141+ )
142+ )
143+ // Create 30 peer nodes
144+ for _ in 0 ..< 30 {
145+ let handler = MockPresentStreamHandler ( )
146+ handlers. append ( handler)
147+ let peer = try Peer (
148+ options: PeerOptions < MockStreamHandler > (
149+ role: . builder,
150+ listenAddress: NetAddr ( ipAddress: " 127.0.0.1 " , port: 0 ) !,
151+ genesisHeader: Data32 ( ) ,
152+ secretKey: Ed25519 . SecretKey ( from: Data32 . random ( ) ) ,
153+ presistentStreamHandler: handler,
154+ ephemeralStreamHandler: MockEphemeralStreamHandler ( ) ,
155+ serverSettings: . defaultSettings,
156+ clientSettings: . defaultSettings
157+ )
158+ )
159+ peers. append ( peer)
160+ }
161+
162+ // Make some connections
163+ for i in 0 ..< 30 {
164+ let peer = peers [ i]
165+ let con = try peer. connect ( to: centerPeer. listenAddress ( ) , role: . builder)
166+ try await con. ready ( )
167+ }
168+ // Simulate close connections 3~5s
169+ try ? await Task . sleep ( for: . milliseconds( 5000 ) )
170+ centerPeer. broadcast ( kind: . uniqueA, message: . init( kind: . uniqueA, data: Data ( " connection rotation strategy " . utf8) ) )
171+ try ? await Task . sleep ( for: . milliseconds( 1000 ) )
172+ var receivedCount = 0
173+ for handler in handlers {
174+ receivedCount += await handler. receivedData. count
175+ }
176+ #expect( receivedCount == PeerSettings . defaultSettings. maxBuilderConnections)
177+ }
178+
127179 @Test
128180 func mockHandshakeFailure( ) async throws {
129181 let mockPeerTest = try MockPeerEventTests ( )
0 commit comments