static void TestTransitionBrokenStateAfterTimeOutPeriodBackToABrokenStateOnAFailedSingleCallByThread() { var validThreshold = 3; var validTimeSpan = TimeSpan.FromMilliseconds(400); var circuitBreaker = new CircuitBreaker(validThreshold, validTimeSpan); var testMethodCall = new TestMethodCall(); CircuitBreaker actual = null; for (var errorCount = 1; errorCount <= circuitBreaker.Threshold; errorCount++) { actual = circuitBreaker.TryInvoke(() => testMethodCall.ErrorProneMethod()); } Thread.Sleep(validTimeSpan); actual.Should().NotBeNull(); var beforeInvokeCallCount = 0; actual.BeforeInvoke += (sender, args) => { actual.IsMendingAndHalfway.Should().BeTrue(); beforeInvokeCallCount++; }; actual = actual.TryInvoke(() => testMethodCall.ErrorProneMethod()); testMethodCall.FailingMethodCallCount.Should().Be(4); actual.Failures.Should().Be(4); beforeInvokeCallCount.Should().Be(1); actual.IsMendingAndHalfway.Should().BeFalse(); actual.IsHealthyAndClosed.Should().BeFalse(); actual.IsBrokenAndOpen.Should().BeTrue(); actual.IsThresholdReached.Should().BeTrue(); actual.LastError.Should().NotBeNull(); Debug.WriteLine(Thread.CurrentThread.Name); }
public CircuitBreakerShould() { validThreshold = 3; validTimeSpan = TimeSpan.FromMilliseconds(400); circuitBreaker = new CircuitBreaker(validThreshold, validTimeSpan); this.testMethodCall = new TestMethodCall(); }