public static HealthCheckBuilder AddValueTaskCheck(this HealthCheckBuilder builder, string name, Func <CancellationToken, ValueTask <IHealthCheckResult> > check, TimeSpan cacheDuration) { Guard.ArgumentNotNull(nameof(builder), builder); return(builder.AddCheck(name, HealthCheck.FromValueTaskCheck(check), cacheDuration)); }
public static HealthCheckBuilder AddValueTaskCheck(this HealthCheckBuilder builder, string name, Func <ValueTask <IHealthCheckResult> > check) { Guard.ArgumentNotNull(nameof(builder), builder); return(builder.AddCheck(name, HealthCheck.FromValueTaskCheck(check), builder.DefaultCacheDuration)); }
public async void MultipleCallersDuringRefreshPeriodOnlyResultInASingleValue() { var checkResult1 = Substitute.For <IHealthCheckResult>(); var checkResult2 = Substitute.For <IHealthCheckResult>(); var check = Substitute.For <Func <CancellationToken, ValueTask <IHealthCheckResult> > >(); var waiter = new TaskCompletionSource <int>(); var firstTask = new ValueTask <IHealthCheckResult>(((Func <Task <IHealthCheckResult> >)(async() => { await waiter.Task; return(checkResult1); }))()); var secondTask = new ValueTask <IHealthCheckResult>(checkResult2); check(default(CancellationToken)).ReturnsForAnyArgs(firstTask, secondTask); var cachedCheck = new TestableCachedHealthCheck(check: HealthCheck.FromValueTaskCheck(check), cacheDuration: TimeSpan.FromSeconds(1)); var task1 = cachedCheck.RunAsync(_serviceProvider); var task2 = cachedCheck.RunAsync(_serviceProvider); waiter.SetResult(0); var result1 = await task1; var result2 = await task2; Assert.Same(checkResult1, result1); Assert.Same(checkResult1, result2); }
public async void FirstCallReadsCheck() { var checkResult = Substitute.For <IHealthCheckResult>(); var check = Substitute.For <Func <CancellationToken, ValueTask <IHealthCheckResult> > >(); check(default(CancellationToken)).ReturnsForAnyArgs(new ValueTask <IHealthCheckResult>(checkResult)); var cachedCheck = new TestableCachedHealthCheck(check: HealthCheck.FromValueTaskCheck(check)); var result = await cachedCheck.RunAsync(_serviceProvider); Assert.Same(checkResult, result); }
public async void SecondCallUsesCachedValue() { var checkResult1 = Substitute.For <IHealthCheckResult>(); var checkResult2 = Substitute.For <IHealthCheckResult>(); var check = Substitute.For <Func <CancellationToken, ValueTask <IHealthCheckResult> > >(); check(default(CancellationToken)).ReturnsForAnyArgs(new ValueTask <IHealthCheckResult>(checkResult1), new ValueTask <IHealthCheckResult>(checkResult2)); var cachedCheck = new TestableCachedHealthCheck(check: HealthCheck.FromValueTaskCheck(check), cacheDuration: TimeSpan.FromSeconds(1)); var result1 = await cachedCheck.RunAsync(_serviceProvider); var result2 = await cachedCheck.RunAsync(_serviceProvider); Assert.Same(checkResult1, result1); Assert.Same(checkResult1, result2); }
public async void CachedValueRefreshedAfterTimeout() { var checkResult1 = Substitute.For <IHealthCheckResult>(); var checkResult2 = Substitute.For <IHealthCheckResult>(); var check = Substitute.For <Func <CancellationToken, ValueTask <IHealthCheckResult> > >(); check(default(CancellationToken)).ReturnsForAnyArgs(new ValueTask <IHealthCheckResult>(checkResult1), new ValueTask <IHealthCheckResult>(checkResult2)); var cachedCheck = new TestableCachedHealthCheck(check: HealthCheck.FromValueTaskCheck(check), cacheDuration: TimeSpan.FromSeconds(1)); var now = DateTimeOffset.UtcNow; cachedCheck.SetUtcNow(now); var result1 = await cachedCheck.RunAsync(_serviceProvider); cachedCheck.SetUtcNow(now + TimeSpan.FromSeconds(1)); var result2 = await cachedCheck.RunAsync(_serviceProvider); Assert.Same(checkResult1, result1); Assert.Same(checkResult2, result2); }