@@ -41,10 +41,9 @@ public FlowSelectAsyncUnorderedSpec(ITestOutputHelper helper) : base(helper)
41
41
}
42
42
43
43
[ WindowsFact ( Skip = "Racy in Linux" ) ]
44
- public void A_Flow_with_SelectAsyncUnordered_must_produce_task_elements_in_the_order_they_are_ready ( )
44
+ public async Task A_Flow_with_SelectAsyncUnordered_must_produce_task_elements_in_the_order_they_are_ready ( )
45
45
{
46
- this . AssertAllStagesStopped ( ( ) =>
47
- {
46
+ await this . AssertAllStagesStoppedAsync ( async ( ) => {
48
47
var c = this . CreateManualSubscriberProbe < int > ( ) ;
49
48
var latch = Enumerable . Range ( 0 , 4 ) . Select ( _ => new TestLatch ( 1 ) ) . ToArray ( ) ;
50
49
@@ -53,28 +52,28 @@ public void A_Flow_with_SelectAsyncUnordered_must_produce_task_elements_in_the_o
53
52
latch [ n ] . Ready ( TimeSpan . FromSeconds ( 5 ) ) ;
54
53
return n ;
55
54
} ) ) . To ( Sink . FromSubscriber ( c ) ) . Run ( Materializer ) ;
56
- var sub = c . ExpectSubscription ( ) ;
55
+ var sub = await c . ExpectSubscriptionAsync ( ) ;
57
56
sub . Request ( 5 ) ;
58
57
59
58
latch [ 1 ] . CountDown ( ) ;
60
- c . ExpectNext ( 1 ) ;
59
+ await c . ExpectNextAsync ( 1 ) ;
61
60
62
61
latch [ 3 ] . CountDown ( ) ;
63
- c . ExpectNext ( 3 ) ;
62
+ await c . ExpectNextAsync ( 3 ) ;
64
63
65
64
latch [ 2 ] . CountDown ( ) ;
66
- c . ExpectNext ( 2 ) ;
65
+ await c . ExpectNextAsync ( 2 ) ;
67
66
68
67
latch [ 0 ] . CountDown ( ) ;
69
- c . ExpectNext ( 0 ) ;
68
+ await c . ExpectNextAsync ( 0 ) ;
70
69
71
- c . ExpectComplete ( ) ;
70
+ await c . ExpectCompleteAsync ( ) ;
72
71
} , Materializer ) ;
73
72
74
73
}
75
74
76
75
[ LocalFact ( SkipLocal = "Racy on Azure DevOps" ) ]
77
- public void A_Flow_with_SelectAsyncUnordered_must_not_run_more_futures_than_requested_elements ( )
76
+ public async Task A_Flow_with_SelectAsyncUnordered_must_not_run_more_futures_than_requested_elements ( )
78
77
{
79
78
var probe = CreateTestProbe ( ) ;
80
79
var c = this . CreateManualSubscriberProbe < int > ( ) ;
@@ -94,29 +93,32 @@ public void A_Flow_with_SelectAsyncUnordered_must_not_run_more_futures_than_requ
94
93
} ) ;
95
94
} )
96
95
. To ( Sink . FromSubscriber ( c ) ) . Run ( Materializer ) ;
97
- var sub = c . ExpectSubscription ( ) ;
98
- c . ExpectNoMsg ( TimeSpan . FromMilliseconds ( 200 ) ) ;
99
- probe . ExpectNoMsg ( TimeSpan . Zero ) ;
96
+ var sub = await c . ExpectSubscriptionAsync ( ) ;
97
+ await c . ExpectNoMsgAsync ( TimeSpan . FromMilliseconds ( 200 ) ) ;
98
+ await probe . ExpectNoMsgAsync ( TimeSpan . Zero ) ;
100
99
sub . Request ( 1 ) ;
101
100
var got = new List < int > { c . ExpectNext ( ) } ;
102
101
probe . ExpectMsgAllOf ( new [ ] { 1 , 2 , 3 , 4 , 5 } ) ;
103
- probe . ExpectNoMsg ( TimeSpan . FromMilliseconds ( 500 ) ) ;
102
+ await probe . ExpectNoMsgAsync ( TimeSpan . FromMilliseconds ( 500 ) ) ;
104
103
sub . Request ( 25 ) ;
105
104
probe . ExpectMsgAllOf ( Enumerable . Range ( 6 , 15 ) . ToArray ( ) ) ;
106
- c . Within ( TimeSpan . FromSeconds ( 3 ) , ( ) =>
105
+ await c . WithinAsync ( TimeSpan . FromSeconds ( 3 ) , async ( ) =>
107
106
{
108
- Enumerable . Range ( 2 , 19 ) . ForEach ( _ => got . Add ( c . ExpectNext ( ) ) ) ;
107
+ foreach ( var i in Enumerable . Range ( 2 , 19 ) )
108
+ {
109
+ got . Add ( await c . ExpectNextAsync ( ) ) ;
110
+ }
111
+ //Enumerable.Range(2, 19).ForEach(_ => got.Add(c.ExpectNext()));
109
112
return NotUsed . Instance ;
110
113
} ) ;
111
114
got . Should ( ) . BeEquivalentTo ( Enumerable . Range ( 1 , 20 ) ) ;
112
- c . ExpectComplete ( ) ;
115
+ await c . ExpectCompleteAsync ( ) ;
113
116
}
114
117
115
118
[ LocalFact ( SkipLocal = "Racy on Azure DevOps" ) ]
116
- public void A_Flow_with_SelectAsyncUnordered_must_signal_task_failure ( )
119
+ public async Task A_Flow_with_SelectAsyncUnordered_must_signal_task_failure ( )
117
120
{
118
- this . AssertAllStagesStopped ( ( ) =>
119
- {
121
+ await this . AssertAllStagesStoppedAsync ( async ( ) => {
120
122
var latch = new TestLatch ( 1 ) ;
121
123
var c = this . CreateManualSubscriberProbe < int > ( ) ;
122
124
Source . From ( Enumerable . Range ( 1 , 5 ) )
@@ -129,7 +131,7 @@ public void A_Flow_with_SelectAsyncUnordered_must_signal_task_failure()
129
131
return n ;
130
132
} ) )
131
133
. To ( Sink . FromSubscriber ( c ) ) . Run ( Materializer ) ;
132
- var sub = c . ExpectSubscription ( ) ;
134
+ var sub = await c . ExpectSubscriptionAsync ( ) ;
133
135
sub . Request ( 10 ) ;
134
136
c . ExpectError ( ) . InnerException . Message . Should ( ) . Be ( "err1" ) ;
135
137
latch . CountDown ( ) ;
@@ -138,10 +140,9 @@ public void A_Flow_with_SelectAsyncUnordered_must_signal_task_failure()
138
140
139
141
140
142
[ Fact ]
141
- public void A_Flow_with_SelectAsyncUnordered_must_signal_task_failure_asap ( )
143
+ public async Task A_Flow_with_SelectAsyncUnordered_must_signal_task_failure_asap ( )
142
144
{
143
- this . AssertAllStagesStopped ( ( ) =>
144
- {
145
+ await this . AssertAllStagesStoppedAsync ( ( ) => {
145
146
var latch = CreateTestLatch ( ) ;
146
147
var done = Source . From ( Enumerable . Range ( 1 , 5 ) )
147
148
. Select ( n =>
@@ -166,14 +167,14 @@ public void A_Flow_with_SelectAsyncUnordered_must_signal_task_failure_asap()
166
167
167
168
done . Invoking ( d => d . Wait ( RemainingOrDefault ) ) . Should ( ) . Throw < Exception > ( ) . WithMessage ( "err1" ) ;
168
169
latch . CountDown ( ) ;
170
+ return Task . CompletedTask ;
169
171
} , Materializer ) ;
170
172
}
171
173
172
174
[ Fact ]
173
- public void A_Flow_with_SelectAsyncUnordered_must_signal_error_from_SelectAsyncUnordered ( )
175
+ public async Task A_Flow_with_SelectAsyncUnordered_must_signal_error_from_SelectAsyncUnordered ( )
174
176
{
175
- this . AssertAllStagesStopped ( ( ) =>
176
- {
177
+ await this . AssertAllStagesStoppedAsync ( async ( ) => {
177
178
var latch = new TestLatch ( 1 ) ;
178
179
var c = this . CreateManualSubscriberProbe < int > ( ) ;
179
180
Source . From ( Enumerable . Range ( 1 , 5 ) )
@@ -189,40 +190,39 @@ public void A_Flow_with_SelectAsyncUnordered_must_signal_error_from_SelectAsyncU
189
190
} ) ;
190
191
} )
191
192
. RunWith ( Sink . FromSubscriber ( c ) , Materializer ) ;
192
- var sub = c . ExpectSubscription ( ) ;
193
+ var sub = await c . ExpectSubscriptionAsync ( ) ;
193
194
sub . Request ( 10 ) ;
194
195
c . ExpectError ( ) . Message . Should ( ) . Be ( "err2" ) ;
195
196
latch . CountDown ( ) ;
196
197
} , Materializer ) ;
197
198
}
198
199
199
200
[ Fact ]
200
- public void A_Flow_with_SelectAsyncUnordered_must_resume_after_task_failure ( )
201
+ public async Task A_Flow_with_SelectAsyncUnordered_must_resume_after_task_failure ( )
201
202
{
202
- this . AssertAllStagesStopped ( ( ) =>
203
+ await this . AssertAllStagesStoppedAsync ( async ( ) =>
203
204
{
204
- this . AssertAllStagesStopped ( ( ) =>
205
- {
206
- Source . From ( Enumerable . Range ( 1 , 5 ) )
207
- . SelectAsyncUnordered ( 4 , n => Task . Run ( ( ) =>
208
- {
209
- if ( n == 3 )
210
- throw new TestException ( "err3" ) ;
211
- return n ;
212
- } ) )
213
- . WithAttributes ( ActorAttributes . CreateSupervisionStrategy ( Deciders . ResumingDecider ) )
214
- . RunWith ( this . SinkProbe < int > ( ) , Materializer )
215
- . Request ( 10 )
216
- . ExpectNextUnordered ( 1 , 2 , 4 , 5 )
217
- . ExpectComplete ( ) ;
205
+ await this . AssertAllStagesStoppedAsync ( async ( ) => {
206
+ await Source . From ( Enumerable . Range ( 1 , 5 ) )
207
+ . SelectAsyncUnordered ( 4 , n => Task . Run ( ( ) =>
208
+ {
209
+ if ( n == 3 )
210
+ throw new TestException ( "err3" ) ;
211
+ return n ;
212
+ } ) )
213
+ . WithAttributes ( ActorAttributes . CreateSupervisionStrategy ( Deciders . ResumingDecider ) )
214
+ . RunWith ( this . SinkProbe < int > ( ) , Materializer )
215
+ . Request ( 10 )
216
+ . ExpectNextUnordered ( 1 , 2 , 4 , 5 )
217
+ . ExpectCompleteAsync ( ) ;
218
218
} , Materializer ) ;
219
219
} , Materializer ) ;
220
220
}
221
221
222
222
[ Fact ]
223
- public void A_Flow_with_SelectAsyncUnordered_must_resume_after_multiple_failures ( )
223
+ public async Task A_Flow_with_SelectAsyncUnordered_must_resume_after_multiple_failures ( )
224
224
{
225
- this . AssertAllStagesStopped ( async ( ) =>
225
+ await this . AssertAllStagesStoppedAsync ( async ( ) =>
226
226
{
227
227
var futures = new [ ]
228
228
{
@@ -245,30 +245,29 @@ public void A_Flow_with_SelectAsyncUnordered_must_resume_after_multiple_failures
245
245
}
246
246
247
247
[ Fact ]
248
- public void A_Flow_with_SelectAsyncUnordered_must_finish_after_task_failure ( )
248
+ public async Task A_Flow_with_SelectAsyncUnordered_must_finish_after_task_failure ( )
249
249
{
250
- this . AssertAllStagesStopped ( ( ) =>
251
- {
252
- var t = Source . From ( Enumerable . Range ( 1 , 3 ) )
253
- . SelectAsyncUnordered ( 1 , n => Task . Run ( ( ) =>
254
- {
255
- if ( n == 3 )
256
- throw new TestException ( "err3b" ) ;
257
- return n ;
258
- } ) )
259
- . WithAttributes ( ActorAttributes . CreateSupervisionStrategy ( Deciders . ResumingDecider ) )
260
- . Grouped ( 10 )
261
- . RunWith ( Sink . First < IEnumerable < int > > ( ) , Materializer ) ;
262
-
250
+ await this . AssertAllStagesStoppedAsync ( ( ) => {
251
+ var t = Source . From ( Enumerable . Range ( 1 , 3 ) )
252
+ . SelectAsyncUnordered ( 1 , n => Task . Run ( ( ) =>
253
+ {
254
+ if ( n == 3 )
255
+ throw new TestException ( "err3b" ) ;
256
+ return n ;
257
+ } ) )
258
+ . WithAttributes ( ActorAttributes . CreateSupervisionStrategy ( Deciders . ResumingDecider ) )
259
+ . Grouped ( 10 )
260
+ . RunWith ( Sink . First < IEnumerable < int > > ( ) , Materializer ) ;
263
261
t . Wait ( TimeSpan . FromSeconds ( 1 ) ) . Should ( ) . BeTrue ( ) ;
264
- t . Result . Should ( ) . BeEquivalentTo ( new [ ] { 1 , 2 } ) ;
262
+ t . Result . Should ( ) . BeEquivalentTo ( new [ ] { 1 , 2 } ) ;
263
+ return Task . CompletedTask ;
265
264
} , Materializer ) ;
266
265
}
267
266
268
267
[ Fact ]
269
- public void A_Flow_with_SelectAsyncUnordered_must_resume_when_SelectAsyncUnordered_throws ( )
268
+ public async Task A_Flow_with_SelectAsyncUnordered_must_resume_when_SelectAsyncUnordered_throws ( )
270
269
{
271
- Source . From ( Enumerable . Range ( 1 , 5 ) )
270
+ await Source . From ( Enumerable . Range ( 1 , 5 ) )
272
271
. SelectAsyncUnordered ( 4 , n =>
273
272
{
274
273
if ( n == 3 )
@@ -279,63 +278,61 @@ public void A_Flow_with_SelectAsyncUnordered_must_resume_when_SelectAsyncUnorder
279
278
. RunWith ( this . SinkProbe < int > ( ) , Materializer )
280
279
. Request ( 10 )
281
280
. ExpectNextUnordered ( 1 , 2 , 4 , 5 )
282
- . ExpectComplete ( ) ;
281
+ . ExpectCompleteAsync ( ) ;
283
282
}
284
283
285
284
[ Fact ]
286
- public void A_Flow_with_SelectAsyncUnordered_must_signal_NPE_when_task_is_completed_with_null ( )
285
+ public async Task A_Flow_with_SelectAsyncUnordered_must_signal_NPE_when_task_is_completed_with_null ( )
287
286
{
288
287
var c = this . CreateManualSubscriberProbe < string > ( ) ;
289
288
290
289
Source . From ( new [ ] { "a" , "b" } )
291
290
. SelectAsyncUnordered ( 4 , _ => Task . FromResult ( null as string ) )
292
291
. To ( Sink . FromSubscriber ( c ) ) . Run ( Materializer ) ;
293
292
294
- var sub = c . ExpectSubscription ( ) ;
293
+ var sub = await c . ExpectSubscriptionAsync ( ) ;
295
294
sub . Request ( 10 ) ;
296
295
c . ExpectError ( ) . Message . Should ( ) . StartWith ( ReactiveStreamsCompliance . ElementMustNotBeNullMsg ) ;
297
296
}
298
297
299
298
[ Fact ]
300
- public void A_Flow_with_SelectAsyncUnordered_must_resume_when_task_is_completed_with_null ( )
299
+ public async Task A_Flow_with_SelectAsyncUnordered_must_resume_when_task_is_completed_with_null ( )
301
300
{
302
301
var c = this . CreateManualSubscriberProbe < string > ( ) ;
303
302
Source . From ( new [ ] { "a" , "b" , "c" } )
304
303
. SelectAsyncUnordered ( 4 , s => s . Equals ( "b" ) ? Task . FromResult ( null as string ) : Task . FromResult ( s ) )
305
304
. WithAttributes ( ActorAttributes . CreateSupervisionStrategy ( Deciders . ResumingDecider ) )
306
305
. To ( Sink . FromSubscriber ( c ) ) . Run ( Materializer ) ;
307
- var sub = c . ExpectSubscription ( ) ;
306
+ var sub = await c . ExpectSubscriptionAsync ( ) ;
308
307
sub . Request ( 10 ) ;
309
308
c . ExpectNextUnordered ( "a" , "c" ) ;
310
- c . ExpectComplete ( ) ;
309
+ await c . ExpectCompleteAsync ( ) ;
311
310
}
312
311
313
312
[ Fact ]
314
- public void A_Flow_with_SelectAsyncUnordered_must_handle_cancel_properly ( )
313
+ public async Task A_Flow_with_SelectAsyncUnordered_must_handle_cancel_properly ( )
315
314
{
316
- this . AssertAllStagesStopped ( ( ) =>
317
- {
315
+ await this . AssertAllStagesStoppedAsync ( async ( ) => {
318
316
var pub = this . CreateManualPublisherProbe < int > ( ) ;
319
317
var sub = this . CreateManualSubscriberProbe < int > ( ) ;
320
318
321
319
Source . FromPublisher ( pub )
322
320
. SelectAsyncUnordered ( 4 , _ => Task . FromResult ( 0 ) )
323
321
. RunWith ( Sink . FromSubscriber ( sub ) , Materializer ) ;
324
322
325
- var upstream = pub . ExpectSubscription ( ) ;
326
- upstream . ExpectRequest ( ) ;
323
+ var upstream = await pub . ExpectSubscriptionAsync ( ) ;
324
+ await upstream . ExpectRequestAsync ( ) ;
327
325
328
- sub . ExpectSubscription ( ) . Cancel ( ) ;
326
+ ( await sub . ExpectSubscriptionAsync ( ) ) . Cancel ( ) ;
329
327
330
- upstream . ExpectCancellation ( ) ;
328
+ await upstream . ExpectCancellationAsync ( ) ;
331
329
} , Materializer ) ;
332
330
}
333
331
334
332
[ LocalFact ( SkipLocal = "Racy on Azure DevOps" ) ]
335
- public void A_Flow_with_SelectAsyncUnordered_must_not_run_more_futures_than_configured ( )
333
+ public async Task A_Flow_with_SelectAsyncUnordered_must_not_run_more_futures_than_configured ( )
336
334
{
337
- this . AssertAllStagesStopped ( ( ) =>
338
- {
335
+ await this . AssertAllStagesStoppedAsync ( ( ) => {
339
336
const int parallelism = 8 ;
340
337
var counter = new AtomicCounter ( ) ;
341
338
var queue = new BlockingQueue < ( TaskCompletionSource < int > , long ) > ( ) ;
@@ -365,7 +362,7 @@ public void A_Flow_with_SelectAsyncUnordered_must_not_run_more_futures_than_conf
365
362
}
366
363
}
367
364
} , cancellation . Token ) ;
368
-
365
+
369
366
Func < Task < int > > deferred = ( ) =>
370
367
{
371
368
var promise = new TaskCompletionSource < int > ( ) ;
@@ -390,6 +387,8 @@ public void A_Flow_with_SelectAsyncUnordered_must_not_run_more_futures_than_conf
390
387
{
391
388
cancellation . Cancel ( false ) ;
392
389
}
390
+
391
+ return Task . CompletedTask ;
393
392
} , Materializer ) ;
394
393
}
395
394
}
0 commit comments