public void GetCircuitBreakerStatusAsyncDoesExistTest(CircuitBreakerStatus circuitBreakerStatus, int hoursInSate) { // Arrange SetupCalls(); var dummyCircuitBreakerDetails = new CircuitBreakerDetails() { CircuitBreakerStatus = circuitBreakerStatus, HalfOpenRetryCount = 2, LastCircuitOpenDate = DateTime.Now.AddHours(hoursInSate * -1) }; A.CallTo(() => fakeCircuitBreakerQueryRepository.GetBreakerDetails()).Returns(dummyCircuitBreakerDetails); A.CallTo(() => fakeCircuitBreakerCommandRepository.UpdateIfExistsAsync(A <CircuitBreakerDetails> ._)).Returns(true); // Act var accountService = new AccountsService(fakeApplicationLogger, fakeConfiguration, fakeAccountQueryRepository, fakeAuditCommandRepository, fakeCircuitBreakerQueryRepository, fakeCircuitBreakerCommandRepository); var result = accountService.GetCircuitBreakerStatusAsync().Result; // Assert if (circuitBreakerStatus == CircuitBreakerStatus.Open && hoursInSate > 24) { // if it was open and it been over 24 hours since then it gets reset A.CallTo(() => fakeCircuitBreakerCommandRepository.UpdateIfExistsAsync(A <CircuitBreakerDetails> ._)).MustHaveHappenedOnceExactly(); result.CircuitBreakerStatus.Should().Be(CircuitBreakerStatus.Closed); result.HalfOpenRetryCount.Should().Be(0); result.LastCircuitOpenDate.Should().BeCloseTo(DateTime.Now, 1000); } else { A.CallTo(() => fakeCircuitBreakerCommandRepository.UpdateIfExistsAsync(A <CircuitBreakerDetails> ._)).MustNotHaveHappened(); result.Should().BeEquivalentTo(dummyCircuitBreakerDetails); } }
public void when_a_circuitbreaker_exists_then_setting_forces_the_state_to_be_that_of_the_message( [Values(CircuitBreakerStatus.Open, CircuitBreakerStatus.HalfOpen, CircuitBreakerStatus.Closed, CircuitBreakerStatus.ForcedClosed, CircuitBreakerStatus.ForcedOpen)] CircuitBreakerStatus startingState, [Values(CircuitBreakerStatus.Open, CircuitBreakerStatus.HalfOpen, CircuitBreakerStatus.Closed, CircuitBreakerStatus.ForcedClosed, CircuitBreakerStatus.ForcedOpen)] CircuitBreakerStatus desiredState) { CircuitBreakerState state = Helper.MakeBreakerState(1, startingState); CircuitBreakerState originalState = _set.ProcessCircuitStateMessage(state); CircuitBreakerState result = _set.SetCircuitState(originalState.CircuitBreakerId, desiredState, SystemTime.Now()); CircuitBreakerState fetchedState = _set.TryGetCircuit(originalState.CircuitBreakerId); Assert.That(result, Is.Not.Null); Assert.That(result.Status, Is.EqualTo(desiredState)); Assert.That(result.MessageSequenceNumber, Is.EqualTo(originalState.MessageSequenceNumber)); // important that the sequence number does not change -> otherwise the next inbound messages will be discards by the dashboard. Assert.That(fetchedState, Is.Not.Null); Assert.That(fetchedState.Status, Is.EqualTo(desiredState)); Assert.That(fetchedState.MessageSequenceNumber, Is.EqualTo(originalState.MessageSequenceNumber)); Assert.That(_set.Circuits(), Contains.Item(originalState.CircuitBreakerId)); }
public void HalfOpenCircuitBreakerAsyncTest(CircuitBreakerStatus circuitBreakerStatus) { // Arrange SetupCalls(); var dummyCircuitBreakerDetails = new CircuitBreakerDetails() { CircuitBreakerStatus = circuitBreakerStatus, HalfOpenRetryCount = 0, LastCircuitOpenDate = DateTime.Now }; A.CallTo(() => fakeCircuitBreakerQueryRepository.GetBreakerDetails()).Returns(dummyCircuitBreakerDetails); A.CallTo(() => fakeCircuitBreakerCommandRepository.UpdateIfExistsAsync(A <CircuitBreakerDetails> ._)).Returns(true); // Act var accountService = new AccountsService(fakeApplicationLogger, fakeConfiguration, fakeAccountQueryRepository, fakeAuditCommandRepository, fakeCircuitBreakerQueryRepository, fakeCircuitBreakerCommandRepository); var result = accountService.HalfOpenCircuitBreakerAsync(); // Assert A.CallTo(() => fakeCircuitBreakerCommandRepository.UpdateIfExistsAsync(A <CircuitBreakerDetails> ._)).MustHaveHappened(); dummyCircuitBreakerDetails.CircuitBreakerStatus.Should().Be(CircuitBreakerStatus.HalfOpen); if (circuitBreakerStatus == CircuitBreakerStatus.HalfOpen) { dummyCircuitBreakerDetails.HalfOpenRetryCount.Should().Be(1); } }
public CircuitBreakerState(string circuitBreakerId, string machineName, int pid, CircuitBreakerStatus status, long messageSequenceNumber) : this(circuitBreakerId, machineName, pid) { Status = status; MessageSequenceNumber = messageSequenceNumber; InformationalPropertyBag = new Dictionary <string, string>(); UpdateablePropertyBag = new Dictionary <string, string>(); }
public void when_circuit_is_in_manual_mode_any_incoming_message_is_ignored_and_manual_state_maintained ( [Values(CircuitBreakerStatus.ForcedOpen, CircuitBreakerStatus.ForcedClosed)] CircuitBreakerStatus repoState, [Values(CircuitBreakerStatus.Open, CircuitBreakerStatus.HalfOpen, CircuitBreakerStatus.Closed, CircuitBreakerStatus.ForcedOpen, CircuitBreakerStatus.ForcedClosed)] CircuitBreakerStatus msgState) { var repomsg = Helper.MakeBreakerState(0, repoState); var message = Helper.MakeBreakerState(1, msgState); var result = _merger.Merge(message, repomsg); result.Matches(1, repoState); Assert.That(result.LastReceivedStatus, Is.EqualTo(msgState)); }
public void when_circuit_is_in_automatic_mode_an_update_with_state_change_then_the_message_sequence_number_and_state_are_adopted ( [Values(CircuitBreakerStatus.Open, CircuitBreakerStatus.HalfOpen, CircuitBreakerStatus.Closed)] CircuitBreakerStatus repoState, [Values(CircuitBreakerStatus.Open, CircuitBreakerStatus.HalfOpen, CircuitBreakerStatus.Closed)] CircuitBreakerStatus msgState) { var repomsg = Helper.MakeBreakerState(0, repoState); var message = Helper.MakeBreakerState(1, msgState); var result = _merger.Merge(message, repomsg); result.Matches(1, msgState); Assert.That(result.LastReceivedStatus, Is.EqualTo(msgState)); }
public CircuitBreakerState SetCircuitState(string circuitBreakerId, CircuitBreakerStatus status, DateTime lastModifiedDate) { lock (_circuitBreakerCollectionMonitor) { CircuitBreakerState dashboardBreakerState; if (!_circuitBreakers.TryGetValue(circuitBreakerId, out dashboardBreakerState)) { return(null); } dashboardBreakerState.Status = status; dashboardBreakerState.LastModifiedDate = lastModifiedDate; return(dashboardBreakerState); } }
public static CircuitBreakerState MakeBreakerState(int messageSequenceNumber, CircuitBreakerStatus status) { return(new CircuitBreakerState("someBreaker", "machine", 111) { MessageSequenceNumber = messageSequenceNumber, Status = status }); }
public static void Matches(this CircuitBreakerState result, long messageSequenceNumber, CircuitBreakerStatus status) { Assert.That(result.MessageSequenceNumber, Is.EqualTo(messageSequenceNumber)); Assert.That(result.Status, Is.EqualTo(status)); }