Esempio n. 1
0
        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);
            }
        }
Esempio n. 2
0
        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));
        }
Esempio n. 3
0
        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));
        }
Esempio n. 7
0
        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);
            }
        }
Esempio n. 8
0
 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));
 }