@@ -275,12 +275,41 @@ public void GetDrainStatus_HostRunning_ReturnsExpected(int outstandingRetries, i
275275 Assert . Equal ( outstandingInvocations , resultStatus . OutstandingInvocations ) ;
276276 }
277277
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+
278307 [ Fact ]
279308 public async Task GetDrain_HostNotRunning_ReturnsServiceUnavailable ( )
280309 {
281310 var scriptHostManagerMock = new Mock < IScriptHostManager > ( MockBehavior . Strict ) ;
282311
283- var result = ( StatusCodeResult ) await _hostController . Drain ( scriptHostManagerMock . Object ) ;
312+ var result = ( StatusCodeResult ) await _hostController . Drain ( scriptHostManagerMock . Object , default ) ;
284313 Assert . Equal ( StatusCodes . Status503ServiceUnavailable , result . StatusCode ) ;
285314 }
286315
@@ -318,7 +347,7 @@ public async Task ResumeHost_HostNotRunning_ReturnsExpected(ScriptHostState host
318347 scriptHostManagerMock . SetupGet ( p => p . State ) . Returns ( hostStatus ) ;
319348 drainModeManager . Setup ( x => x . IsDrainModeEnabled ) . Returns ( drainModeEnabled ) ;
320349
321- var result = ( StatusCodeResult ) await _hostController . Resume ( scriptHostManagerMock . Object ) ;
350+ var result = ( StatusCodeResult ) await _hostController . Resume ( scriptHostManagerMock . Object , default ) ;
322351 Assert . Equal ( expectedCode , result . StatusCode ) ;
323352 scriptHostManagerMock . Verify ( p => p . RestartHostAsync ( It . IsAny < CancellationToken > ( ) ) , Times . Never ( ) ) ;
324353 }
@@ -336,7 +365,7 @@ public async Task ResumeHost_HostRunning_DrainModeEnabled_StartNewHostSuccessful
336365 drainModeManager . Setup ( x => x . IsDrainModeEnabled ) . Returns ( true ) ;
337366
338367 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 ) ;
340369
341370 Assert . Equal ( StatusCodes . Status200OK , result . StatusCode ) ;
342371 Assert . Equal ( expectedBody . State , ( result . Value as ResumeStatus ) . State ) ;
@@ -355,11 +384,21 @@ public async Task ResumeHost_HostRunning_DrainModeNotEnabled_DoesNotStartNewHost
355384 drainModeManager . Setup ( x => x . IsDrainModeEnabled ) . Returns ( false ) ;
356385
357386 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 ) ;
359388
360389 Assert . Equal ( StatusCodes . Status200OK , result . StatusCode ) ;
361390 Assert . Equal ( expectedBody . State , ( result . Value as ResumeStatus ) . State ) ;
362391 scriptHostManagerMock . Verify ( p => p . RestartHostAsync ( It . IsAny < CancellationToken > ( ) ) , Times . Never ( ) ) ;
363392 }
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+ }
364403 }
365404}
0 commit comments