Fix flaky HealthCheck test (#20741)
This commit is contained in:
parent
3c1bd093e9
commit
2b7b79f4db
|
|
@ -1,4 +1,4 @@
|
||||||
// Copyright (c) .NET Foundation. All rights reserved.
|
// Copyright (c) .NET Foundation. All rights reserved.
|
||||||
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
||||||
|
|
||||||
using System;
|
using System;
|
||||||
|
|
@ -22,6 +22,7 @@ namespace Microsoft.Extensions.Diagnostics.HealthChecks
|
||||||
|
|
||||||
private CancellationTokenSource _stopping;
|
private CancellationTokenSource _stopping;
|
||||||
private Timer _timer;
|
private Timer _timer;
|
||||||
|
private CancellationTokenSource _runTokenSource;
|
||||||
|
|
||||||
public HealthCheckPublisherHostedService(
|
public HealthCheckPublisherHostedService(
|
||||||
HealthCheckService healthCheckService,
|
HealthCheckService healthCheckService,
|
||||||
|
|
@ -69,7 +70,7 @@ namespace Microsoft.Extensions.Diagnostics.HealthChecks
|
||||||
}
|
}
|
||||||
|
|
||||||
// IMPORTANT - make sure this is the last thing that happens in this method. The timer can
|
// IMPORTANT - make sure this is the last thing that happens in this method. The timer can
|
||||||
// fire before other code runs.
|
// fire before other code runs.
|
||||||
_timer = NonCapturingTimer.Create(Timer_Tick, null, dueTime: _options.Value.Delay, period: _options.Value.Period);
|
_timer = NonCapturingTimer.Create(Timer_Tick, null, dueTime: _options.Value.Delay, period: _options.Value.Period);
|
||||||
|
|
||||||
return Task.CompletedTask;
|
return Task.CompletedTask;
|
||||||
|
|
@ -104,6 +105,12 @@ namespace Microsoft.Extensions.Diagnostics.HealthChecks
|
||||||
await RunAsync();
|
await RunAsync();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Internal for testing
|
||||||
|
internal void CancelToken()
|
||||||
|
{
|
||||||
|
_runTokenSource.Cancel();
|
||||||
|
}
|
||||||
|
|
||||||
// Internal for testing
|
// Internal for testing
|
||||||
internal async Task RunAsync()
|
internal async Task RunAsync()
|
||||||
{
|
{
|
||||||
|
|
@ -116,6 +123,7 @@ namespace Microsoft.Extensions.Diagnostics.HealthChecks
|
||||||
var timeout = _options.Value.Timeout;
|
var timeout = _options.Value.Timeout;
|
||||||
|
|
||||||
cancellation = CancellationTokenSource.CreateLinkedTokenSource(_stopping.Token);
|
cancellation = CancellationTokenSource.CreateLinkedTokenSource(_stopping.Token);
|
||||||
|
_runTokenSource = cancellation;
|
||||||
cancellation.CancelAfter(timeout);
|
cancellation.CancelAfter(timeout);
|
||||||
|
|
||||||
await RunAsyncCore(cancellation.Token);
|
await RunAsyncCore(cancellation.Token);
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
// Copyright (c) .NET Foundation. All rights reserved.
|
// Copyright (c) .NET Foundation. All rights reserved.
|
||||||
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
||||||
|
|
||||||
using System;
|
using System;
|
||||||
|
|
@ -145,7 +145,7 @@ namespace Microsoft.Extensions.Diagnostics.HealthChecks
|
||||||
await service.StopAsync(); // Trigger cancellation
|
await service.StopAsync(); // Trigger cancellation
|
||||||
|
|
||||||
// Assert
|
// Assert
|
||||||
await AssertCancelledAsync(publishers[0].Entries[0].cancellationToken);
|
await AssertCanceledAsync(publishers[0].Entries[0].cancellationToken);
|
||||||
Assert.False(service.IsTimerRunning);
|
Assert.False(service.IsTimerRunning);
|
||||||
Assert.True(service.IsStopping);
|
Assert.True(service.IsStopping);
|
||||||
|
|
||||||
|
|
@ -286,10 +286,7 @@ namespace Microsoft.Extensions.Diagnostics.HealthChecks
|
||||||
new TestPublisher() { Wait = unblock.Task, },
|
new TestPublisher() { Wait = unblock.Task, },
|
||||||
};
|
};
|
||||||
|
|
||||||
var service = CreateService(publishers, sink: sink, configure: (options) =>
|
var service = CreateService(publishers, sink: sink);
|
||||||
{
|
|
||||||
options.Timeout = TimeSpan.FromMilliseconds(50);
|
|
||||||
});
|
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
|
@ -300,7 +297,9 @@ namespace Microsoft.Extensions.Diagnostics.HealthChecks
|
||||||
|
|
||||||
await publishers[0].Started.TimeoutAfter(TimeSpan.FromSeconds(10));
|
await publishers[0].Started.TimeoutAfter(TimeSpan.FromSeconds(10));
|
||||||
|
|
||||||
await AssertCancelledAsync(publishers[0].Entries[0].cancellationToken);
|
service.CancelToken();
|
||||||
|
|
||||||
|
await AssertCanceledAsync(publishers[0].Entries[0].cancellationToken);
|
||||||
|
|
||||||
unblock.SetResult(null);
|
unblock.SetResult(null);
|
||||||
|
|
||||||
|
|
@ -483,7 +482,7 @@ namespace Microsoft.Extensions.Diagnostics.HealthChecks
|
||||||
return services.GetServices<IHostedService>().OfType< HealthCheckPublisherHostedService>().Single();
|
return services.GetServices<IHostedService>().OfType< HealthCheckPublisherHostedService>().Single();
|
||||||
}
|
}
|
||||||
|
|
||||||
private static async Task AssertCancelledAsync(CancellationToken cancellationToken)
|
private static async Task AssertCanceledAsync(CancellationToken cancellationToken)
|
||||||
{
|
{
|
||||||
await Assert.ThrowsAsync<TaskCanceledException>(() => Task.Delay(TimeSpan.FromSeconds(10), cancellationToken));
|
await Assert.ThrowsAsync<TaskCanceledException>(() => Task.Delay(TimeSpan.FromSeconds(10), cancellationToken));
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue