11
11
using Microsoft . AspNetCore . Server . Kestrel . Core . Internal . Infrastructure ;
12
12
using Microsoft . AspNetCore . Testing ;
13
13
using Microsoft . AspNetCore . Testing . xunit ;
14
+ using Microsoft . Extensions . Logging . Testing ;
14
15
using Microsoft . Net . Http . Headers ;
15
16
using Moq ;
16
17
using Xunit ;
@@ -193,11 +194,13 @@ public async Task ResponseDrain_SlowerThanMinimumDataRate_AbortsConnection()
193
194
}
194
195
195
196
[ Theory ]
196
- [ Flaky ( "https://github.com/aspnet/AspNetCore-Internal/issues/1879" , FlakyOn . All ) ]
197
+ [ Repeat ( 20 ) ]
197
198
[ InlineData ( ( int ) Http2FrameType . DATA ) ]
198
199
[ InlineData ( ( int ) Http2FrameType . CONTINUATION ) ]
199
200
public async Task AbortedStream_ResetsAndDrainsRequest_RefusesFramesAfterCooldownExpires ( int intFinalFrameType )
200
201
{
202
+ var closeLock = new object ( ) ;
203
+ var closed = false ;
201
204
var finalFrameType = ( Http2FrameType ) intFinalFrameType ;
202
205
// Remove callback that completes _pair.Application.Output on abort.
203
206
_mockConnectionContext . Reset ( ) ;
@@ -216,8 +219,6 @@ public async Task AbortedStream_ResetsAndDrainsRequest_RefusesFramesAfterCooldow
216
219
217
220
await WaitForStreamErrorAsync ( 1 , Http2ErrorCode . INTERNAL_ERROR , "The connection was aborted by the application." ) ;
218
221
219
- var cts = new CancellationTokenSource ( ) ;
220
-
221
222
async Task AdvanceClockAndSendFrames ( )
222
223
{
223
224
if ( finalFrameType == Http2FrameType . CONTINUATION )
@@ -227,7 +228,7 @@ async Task AdvanceClockAndSendFrames()
227
228
}
228
229
229
230
// There's a race when the appfunc is exiting about how soon it unregisters the stream, so retry until success.
230
- while ( ! cts . Token . IsCancellationRequested )
231
+ while ( ! closed )
231
232
{
232
233
// Just past the timeout
233
234
mockSystemClock . UtcNow += Constants . RequestBodyDrainTimeout + TimeSpan . FromTicks ( 1 ) ;
@@ -247,24 +248,24 @@ async Task AdvanceClockAndSendFrames()
247
248
throw new NotImplementedException ( finalFrameType . ToString ( ) ) ;
248
249
}
249
250
250
- if ( ! cts . Token . IsCancellationRequested )
251
- {
252
- await Task . Delay ( 10 ) ;
253
- }
251
+ // TODO how do I force a function to go async?
252
+ await Task . Delay ( 1 ) ;
254
253
}
255
254
}
256
255
257
256
var sendTask = AdvanceClockAndSendFrames ( ) ;
258
257
259
- await WaitForConnectionErrorAsync < Http2ConnectionErrorException > (
258
+ await WaitForConnectionErrorAsyncDoNotCloseTransport < Http2ConnectionErrorException > (
260
259
ignoreNonGoAwayFrames : false ,
261
260
expectedLastStreamId : 1 ,
262
261
Http2ErrorCode . STREAM_CLOSED ,
263
262
CoreStrings . FormatHttp2ErrorStreamClosed ( finalFrameType , 1 ) ) ;
264
263
265
- cts . Cancel ( ) ;
264
+ closed = true ;
266
265
267
266
await sendTask . DefaultTimeout ( ) ;
267
+
268
+ _pair . Application . Output . Complete ( ) ;
268
269
}
269
270
270
271
[ Fact ]
0 commit comments