1+ using System . Diagnostics ;
12using Couchbase . AnalyticsClient . Async ;
23using Couchbase . AnalyticsClient . Exceptions ;
34using Couchbase . AnalyticsClient . FunctionalTests . Fixtures ;
@@ -33,17 +34,7 @@ public async Task Test_AsyncAnalytics_EndToEnd_Cluster()
3334 Assert . NotNull ( handle ) ;
3435
3536 // 2. Poll for the query status
36- QueryStatus ? queryStatus = null ;
37- for ( var i = 0 ; i < 20 ; i ++ )
38- {
39- queryStatus = await handle . FetchStatusAsync ( new FetchStatusOptions ( ) ) ;
40- _outputHelper . WriteLine ( $ "Status: { queryStatus } ") ;
41- if ( queryStatus . ResultsReady )
42- {
43- break ;
44- }
45- await Task . Delay ( 500 ) ;
46- }
37+ var queryStatus = await PollUntilReadyAsync ( handle , queryOptions . QueryTimeout ?? TimeSpan . FromSeconds ( 30 ) ) ;
4738
4839 Assert . NotNull ( queryStatus ) ;
4940 Assert . True ( queryStatus ! . ResultsReady ) ;
@@ -53,7 +44,7 @@ public async Task Test_AsyncAnalytics_EndToEnd_Cluster()
5344 Assert . NotNull ( resultHandle ) ;
5445
5546 // 4. Fetch the results
56- var results = await resultHandle . FetchResultsAsync ( new FetchResultsOptions ( ) ) ;
47+ await using var results = await resultHandle . FetchResultsAsync ( new FetchResultsOptions ( ) ) ;
5748 Assert . NotNull ( results ) ;
5849
5950 var count = 0 ;
@@ -86,7 +77,8 @@ public async Task Test_AsyncAnalytics_Cancellation_Cluster()
8677 // It's possible the cancel takes a brief moment to process gracefully on the server.
8778 var ex = await Record . ExceptionAsync ( async ( ) =>
8879 {
89- for ( var i = 0 ; i < 20 ; i ++ )
80+ var deadline = Stopwatch . StartNew ( ) ;
81+ while ( deadline . Elapsed < queryOptions . QueryTimeout )
9082 {
9183 var queryStatus = await handle . FetchStatusAsync ( new FetchStatusOptions ( ) ) ;
9284 if ( queryStatus . ResultsReady )
@@ -112,19 +104,11 @@ public async Task Test_AsyncAnalytics_Cancellation_Cluster()
112104 public async Task Test_AsyncAnalytics_DiscardResults_Cluster ( )
113105 {
114106 var statement = "select i from array_range(1, 5) as i;" ;
115- var handle = await _simpleFixture . Cluster . StartQueryAsync ( statement , new StartQueryOptions ( ) ) ;
107+ var queryOptions = new StartQueryOptions ( ) ;
108+ var handle = await _simpleFixture . Cluster . StartQueryAsync ( statement , queryOptions ) ;
116109
117110 // Poll for the query status
118- QueryStatus ? queryStatus = null ;
119- for ( var i = 0 ; i < 20 ; i ++ )
120- {
121- queryStatus = await handle . FetchStatusAsync ( new FetchStatusOptions ( ) ) ;
122- if ( queryStatus . ResultsReady )
123- {
124- break ;
125- }
126- await Task . Delay ( 500 ) ;
127- }
111+ var queryStatus = await PollUntilReadyAsync ( handle , TimeSpan . FromSeconds ( 30 ) ) ;
128112
129113 Assert . NotNull ( queryStatus ) ;
130114 Assert . True ( queryStatus ! . ResultsReady ) ;
@@ -159,16 +143,7 @@ public async Task Test_AsyncAnalytics_EndToEnd_Scope()
159143 Assert . NotNull ( handle ) ;
160144
161145 // 2. Poll for the query status
162- QueryStatus ? queryStatus = null ;
163- for ( var i = 0 ; i < 20 ; i ++ )
164- {
165- queryStatus = await handle . FetchStatusAsync ( new FetchStatusOptions ( ) ) ;
166- if ( queryStatus . ResultsReady )
167- {
168- break ;
169- }
170- await Task . Delay ( 500 ) ;
171- }
146+ var queryStatus = await PollUntilReadyAsync ( handle , queryOptions . QueryTimeout ?? TimeSpan . FromSeconds ( 30 ) ) ;
172147
173148 Assert . NotNull ( queryStatus ) ;
174149 Assert . True ( queryStatus ! . ResultsReady ) ;
@@ -177,7 +152,7 @@ public async Task Test_AsyncAnalytics_EndToEnd_Scope()
177152 var resultHandle = queryStatus . ResultHandle ( ) ;
178153 Assert . NotNull ( resultHandle ) ;
179154
180- var results = await resultHandle . FetchResultsAsync ( new FetchResultsOptions ( ) ) ;
155+ await using var results = await resultHandle . FetchResultsAsync ( new FetchResultsOptions ( ) ) ;
181156 Assert . NotNull ( results ) ;
182157
183158 var count = 0 ;
@@ -202,23 +177,13 @@ public async Task Test_AsyncAnalytics_Metadata_Cluster()
202177 var handle = await _simpleFixture . Cluster . StartQueryAsync ( statement , queryOptions ) ;
203178 Assert . NotNull ( handle ) ;
204179
205- QueryStatus ? queryStatus = null ;
206- for ( var i = 0 ; i < 20 ; i ++ )
207- {
208- queryStatus = await handle . FetchStatusAsync ( new FetchStatusOptions ( ) ) ;
209- _outputHelper . WriteLine ( $ "Status: { queryStatus } ") ;
210- if ( queryStatus . ResultsReady )
211- {
212- break ;
213- }
214- await Task . Delay ( 500 ) ;
215- }
180+ var queryStatus = await PollUntilReadyAsync ( handle , queryOptions . QueryTimeout ?? TimeSpan . FromSeconds ( 30 ) ) ;
216181
217182 Assert . NotNull ( queryStatus ) ;
218183 Assert . True ( queryStatus ! . ResultsReady ) ;
219184
220185 var resultHandle = queryStatus . ResultHandle ( ) ;
221- var results = await resultHandle . FetchResultsAsync ( new FetchResultsOptions ( ) ) ;
186+ await using var results = await resultHandle . FetchResultsAsync ( new FetchResultsOptions ( ) ) ;
222187
223188 // Consume all rows
224189 var count = 0 ;
@@ -227,11 +192,34 @@ public async Task Test_AsyncAnalytics_Metadata_Cluster()
227192 count ++ ;
228193 }
229194
195+ // Verify row count matches metrics
196+ Assert . Equal ( 99 , count ) ;
197+
230198 // Verify metrics
231199 Assert . NotNull ( results . MetaData ) ;
232200 Assert . NotNull ( results . MetaData . Metrics ) ;
233201 Assert . Equal ( 99 , results . MetaData . Metrics ! . ResultCount ) ;
234202 Assert . NotNull ( results . MetaData . Metrics . ElapsedTime ) ;
235203 Assert . NotNull ( results . MetaData . Metrics . ExecutionTime ) ;
236204 }
205+
206+ /// <summary>
207+ /// Polls the query handle until results are ready or the deadline is reached.
208+ /// </summary>
209+ private async Task < QueryStatus ? > PollUntilReadyAsync ( QueryHandle handle , TimeSpan timeout )
210+ {
211+ var deadline = Stopwatch . StartNew ( ) ;
212+ QueryStatus ? queryStatus = null ;
213+ while ( deadline . Elapsed < timeout )
214+ {
215+ queryStatus = await handle . FetchStatusAsync ( new FetchStatusOptions ( ) ) ;
216+ _outputHelper . WriteLine ( $ "Status: { queryStatus } ") ;
217+ if ( queryStatus . ResultsReady )
218+ {
219+ break ;
220+ }
221+ await Task . Delay ( 500 ) ;
222+ }
223+ return queryStatus ;
224+ }
237225}
0 commit comments