@@ -275,12 +275,41 @@ public void GetDrainStatus_HostRunning_ReturnsExpected(int outstandingRetries, i
275
275
Assert . Equal ( outstandingInvocations , resultStatus . OutstandingInvocations ) ;
276
276
}
277
277
278
+ [ Fact ]
279
+ public async Task GetDrain_HostRunning_BeginsDrain ( )
280
+ {
281
+ var scriptHostManagerMock = new Mock < IScriptHostManager > ( MockBehavior . Strict ) ;
282
+ var drainModeManager = new Mock < IDrainModeManager > ( MockBehavior . Strict ) ;
283
+ drainModeManager . Setup ( m => m . EnableDrainModeAsync ( default ) ) . Returns ( Task . CompletedTask ) ;
284
+ var serviceProviderMock = scriptHostManagerMock . As < IServiceProvider > ( ) ;
285
+ serviceProviderMock . Setup ( x => x . GetService ( typeof ( IDrainModeManager ) ) ) . Returns ( drainModeManager . Object ) ;
286
+
287
+ var result = ( AcceptedResult ) await _hostController . Drain ( scriptHostManagerMock . Object , default ) ;
288
+ Assert . Equal ( StatusCodes . Status202Accepted , result . StatusCode ) ;
289
+ drainModeManager . Verify ( x => x . EnableDrainModeAsync ( default ) , Times . Once ( ) ) ;
290
+ }
291
+
292
+ [ Fact ]
293
+ public async Task GetDrain_HostRunning_ClientDisconnect_DoesNotDrain ( )
294
+ {
295
+ var scriptHostManagerMock = new Mock < IScriptHostManager > ( MockBehavior . Strict ) ;
296
+ var drainModeManager = new Mock < IDrainModeManager > ( MockBehavior . Strict ) ;
297
+ var serviceProviderMock = scriptHostManagerMock . As < IServiceProvider > ( ) ;
298
+ serviceProviderMock . Setup ( x => x . GetService ( typeof ( IDrainModeManager ) ) ) . Returns ( drainModeManager . Object ) ;
299
+
300
+ using var cts = new CancellationTokenSource ( ) ;
301
+ cts . Cancel ( ) ;
302
+
303
+ await Assert . ThrowsAnyAsync < OperationCanceledException > ( ( ) => _hostController . Drain ( scriptHostManagerMock . Object , cts . Token ) ) ;
304
+ drainModeManager . Verify ( x => x . EnableDrainModeAsync ( default ) , Times . Never ) ;
305
+ }
306
+
278
307
[ Fact ]
279
308
public async Task GetDrain_HostNotRunning_ReturnsServiceUnavailable ( )
280
309
{
281
310
var scriptHostManagerMock = new Mock < IScriptHostManager > ( MockBehavior . Strict ) ;
282
311
283
- var result = ( StatusCodeResult ) await _hostController . Drain ( scriptHostManagerMock . Object ) ;
312
+ var result = ( StatusCodeResult ) await _hostController . Drain ( scriptHostManagerMock . Object , default ) ;
284
313
Assert . Equal ( StatusCodes . Status503ServiceUnavailable , result . StatusCode ) ;
285
314
}
286
315
@@ -318,7 +347,7 @@ public async Task ResumeHost_HostNotRunning_ReturnsExpected(ScriptHostState host
318
347
scriptHostManagerMock . SetupGet ( p => p . State ) . Returns ( hostStatus ) ;
319
348
drainModeManager . Setup ( x => x . IsDrainModeEnabled ) . Returns ( drainModeEnabled ) ;
320
349
321
- var result = ( StatusCodeResult ) await _hostController . Resume ( scriptHostManagerMock . Object ) ;
350
+ var result = ( StatusCodeResult ) await _hostController . Resume ( scriptHostManagerMock . Object , default ) ;
322
351
Assert . Equal ( expectedCode , result . StatusCode ) ;
323
352
scriptHostManagerMock . Verify ( p => p . RestartHostAsync ( It . IsAny < CancellationToken > ( ) ) , Times . Never ( ) ) ;
324
353
}
@@ -336,7 +365,7 @@ public async Task ResumeHost_HostRunning_DrainModeEnabled_StartNewHostSuccessful
336
365
drainModeManager . Setup ( x => x . IsDrainModeEnabled ) . Returns ( true ) ;
337
366
338
367
var expectedBody = new ResumeStatus { State = ScriptHostState . Running } ;
339
- var result = ( OkObjectResult ) await _hostController . Resume ( scriptHostManagerMock . Object ) ;
368
+ var result = ( OkObjectResult ) await _hostController . Resume ( scriptHostManagerMock . Object , default ) ;
340
369
341
370
Assert . Equal ( StatusCodes . Status200OK , result . StatusCode ) ;
342
371
Assert . Equal ( expectedBody . State , ( result . Value as ResumeStatus ) . State ) ;
@@ -355,11 +384,21 @@ public async Task ResumeHost_HostRunning_DrainModeNotEnabled_DoesNotStartNewHost
355
384
drainModeManager . Setup ( x => x . IsDrainModeEnabled ) . Returns ( false ) ;
356
385
357
386
var expectedBody = new ResumeStatus { State = ScriptHostState . Running } ;
358
- var result = ( OkObjectResult ) await _hostController . Resume ( scriptHostManagerMock . Object ) ;
387
+ var result = ( OkObjectResult ) await _hostController . Resume ( scriptHostManagerMock . Object , default ) ;
359
388
360
389
Assert . Equal ( StatusCodes . Status200OK , result . StatusCode ) ;
361
390
Assert . Equal ( expectedBody . State , ( result . Value as ResumeStatus ) . State ) ;
362
391
scriptHostManagerMock . Verify ( p => p . RestartHostAsync ( It . IsAny < CancellationToken > ( ) ) , Times . Never ( ) ) ;
363
392
}
393
+
394
+ [ Fact ]
395
+ public async Task ResumeHost_HostRunning_ClientDisconnect_DoesNotStartNewHost ( )
396
+ {
397
+ var scriptHostManagerMock = new Mock < IScriptHostManager > ( MockBehavior . Strict ) ;
398
+ using var cts = new CancellationTokenSource ( ) ;
399
+ cts . Cancel ( ) ;
400
+ await Assert . ThrowsAnyAsync < OperationCanceledException > ( ( ) => _hostController . Resume ( scriptHostManagerMock . Object , cts . Token ) ) ;
401
+ scriptHostManagerMock . Verify ( p => p . RestartHostAsync ( It . IsAny < CancellationToken > ( ) ) , Times . Never ( ) ) ;
402
+ }
364
403
}
365
404
}
0 commit comments