@@ -104,5 +104,90 @@ public void DeadNodesAreNotVisited()
104104 //var nowCall = A.CallTo(() => fake.Resolve<IDateTimeProvider>().Sniff(A<Uri>._, A<int>._));
105105 }
106106 }
107+
108+ [ Test ]
109+ public async void DeadNodesAreNotVisited_Async ( )
110+ {
111+ using ( var fake = new AutoFake ( ) )
112+ {
113+ var now = DateTime . UtcNow ;
114+ var dateTimeProvider = fake . Resolve < IDateTimeProvider > ( ) ;
115+ var nowCall = A . CallTo ( ( ) => dateTimeProvider . Now ( ) ) ;
116+ nowCall . ReturnsNextFromSequence (
117+ DateTime . UtcNow , //info 1
118+ DateTime . UtcNow , //info 2
119+ DateTime . UtcNow , //info 2 retry
120+ DateTime . UtcNow , //info 3
121+ DateTime . UtcNow , //info 4
122+ DateTime . UtcNow , //info 5 pass over node 3
123+ DateTime . UtcNow , //info 5
124+ DateTime . UtcNow , //info 6
125+ DateTime . UtcNow . AddMinutes ( 2 ) , //info 7
126+ DateTime . UtcNow . AddMinutes ( 2 ) , //info 8
127+ DateTime . UtcNow . AddMinutes ( 2 ) //info 9
128+ ) ;
129+ A . CallTo ( ( ) => dateTimeProvider . AliveTime ( A < Uri > . _ , A < int > . _ ) )
130+ . Returns ( new DateTime ( ) ) ;
131+ A . CallTo ( ( ) => dateTimeProvider . DeadTime ( A < Uri > . _ , A < int > . _ ) )
132+ . Returns ( DateTime . UtcNow . AddMinutes ( 1 ) ) ;
133+ //make sure the transport layer uses a different datetimeprovider
134+ fake . Provide < IDateTimeProvider > ( new DateTimeProvider ( ) ) ;
135+ var connectionPool = new StaticConnectionPool ( new [ ]
136+ {
137+ new Uri ( "http://localhost:9204" ) ,
138+ new Uri ( "http://localhost:9203" ) ,
139+ new Uri ( "http://localhost:9202" ) ,
140+ new Uri ( "http://localhost:9201" )
141+ } , randomizeOnStartup : false , dateTimeProvider : dateTimeProvider ) ;
142+ var config = new ConnectionConfiguration ( connectionPool ) ;
143+ fake . Provide < IConnectionConfigurationValues > ( config ) ;
144+ fake . Provide < ITransport > ( fake . Resolve < Transport > ( ) ) ;
145+ var connection = fake . Resolve < IConnection > ( ) ;
146+
147+ var ok = Task . FromResult ( ElasticsearchResponse . Create ( config , 200 , "GET" , "/" , null , null ) ) ;
148+ var bad = Task . FromResult ( ElasticsearchResponse . Create ( config , 503 , "GET" , "/" , null , null ) ) ;
149+
150+ var seenNodes = new List < Uri > ( ) ;
151+ var getCall = A . CallTo ( ( ) => connection . Get ( A < Uri > . _ ) ) ;
152+ getCall . ReturnsNextFromSequence (
153+ ok , //info 1 - 9204
154+ bad , //info 2 - 9203 DEAD
155+ ok , //info 2 retry - 9202
156+ ok , //info 3 - 9201
157+ ok , //info 4 - 9204
158+ ok , //info 5 - 9202
159+ ok , //info 6 - 9201
160+ ok , //info 7 - 9204
161+ ok , //info 8 - 9203 (Now > Timeout)
162+ ok //info 9 - 9202
163+ ) ;
164+ getCall . Invokes ( ( Uri u ) => seenNodes . Add ( u ) ) ;
165+
166+ var client1 = fake . Resolve < ElasticsearchClient > ( ) ;
167+ await client1 . InfoAsync ( ) ; //info call 1
168+ await client1 . InfoAsync ( ) ; //info call 2
169+ await client1 . InfoAsync ( ) ; //info call 3
170+ await client1 . InfoAsync ( ) ; //info call 4
171+ await client1 . InfoAsync ( ) ; //info call 5
172+ await client1 . InfoAsync ( ) ; //info call 6
173+ await client1 . InfoAsync ( ) ; //info call 7
174+ await client1 . InfoAsync ( ) ; //info call 8
175+ await client1 . InfoAsync ( ) ; //info call 9
176+
177+ seenNodes . Should ( ) . NotBeEmpty ( ) . And . HaveCount ( 10 ) ;
178+ seenNodes [ 0 ] . Port . Should ( ) . Be ( 9204 ) ;
179+ seenNodes [ 1 ] . Port . Should ( ) . Be ( 9203 ) ;
180+ //after sniff
181+ seenNodes [ 2 ] . Port . Should ( ) . Be ( 9202 ) ;
182+ seenNodes [ 3 ] . Port . Should ( ) . Be ( 9201 ) ;
183+ seenNodes [ 4 ] . Port . Should ( ) . Be ( 9204 ) ;
184+ seenNodes [ 5 ] . Port . Should ( ) . Be ( 9202 ) ;
185+ seenNodes [ 6 ] . Port . Should ( ) . Be ( 9201 ) ;
186+ seenNodes [ 7 ] . Port . Should ( ) . Be ( 9204 ) ;
187+ seenNodes [ 8 ] . Port . Should ( ) . Be ( 9203 ) ;
188+
189+ //var nowCall = A.CallTo(() => fake.Resolve<IDateTimeProvider>().Sniff(A<Uri>._, A<int>._));
190+ }
191+ }
107192 }
108193}
0 commit comments