public void an_older_message_for_existing_breaker_is_ignored_by_update_and_returns_the_more_recent_state()
        {
            SystemTime.Is(second: 1, millisecond: 100);

            CircuitBreakerState original       = Helper.MakeBreakerState("a", messageSequenceNumber: 15);
            CircuitBreakerState originalResult = _set.ProcessCircuitStateMessage(original);
            CircuitBreakerState ignoredResult  =
                _set.ProcessCircuitStateMessage(Helper.MakeBreakerState("a", messageSequenceNumber: 14));


            Assert.That(ignoredResult.CircuitBreakerId, Is.EqualTo(originalResult.CircuitBreakerId), "CircuitBreakerId");
            Assert.That(ignoredResult.MessageSequenceNumber, Is.EqualTo(originalResult.MessageSequenceNumber), "RequestMessageSequenceNumber");
            Assert.That(ignoredResult.ProcessId, Is.EqualTo(originalResult.ProcessId), "ProcessID");
            Assert.That(ignoredResult.Status, Is.EqualTo(originalResult.Status), "Status");
            Assert.That(ignoredResult.MachineName, Is.EqualTo(originalResult.MachineName), "MachineName");
            Assert.That(ignoredResult.LastModifiedDate, Is.EqualTo(SystemTime.Now()), "LastModifiedDate should be now");
        }
        public void adding_an_unseen_circuit_returns_a_passthrough_message_stamped_with_current_time()
        {
            SystemTime.Is(millisecond: 100);
            CircuitBreakerState input = Helper.MakeBreakerState(messageSequenceNumber: 15);

            SystemTime.Is(millisecond: 200);
            CircuitBreakerState result = _set.ProcessCircuitStateMessage(input);


            Assert.That(result.CircuitBreakerId, Is.EqualTo(input.CircuitBreakerId), "CircuitBreakerId");
            Assert.That(result.MessageSequenceNumber, Is.EqualTo(input.MessageSequenceNumber), "RequestMessageSequenceNumber");
            Assert.That(result.ProcessId, Is.EqualTo(input.ProcessId), "ProcessID");
            Assert.That(result.Status, Is.EqualTo(input.Status), "Status");
            Assert.That(result.MachineName, Is.EqualTo(input.MachineName), "MachineName");
            Assert.That(result.LastModifiedDate, Is.EqualTo(input.LastModifiedDate.AddMilliseconds(100)), "LastModifiedDate");
            Assert.That(result.LastModifiedDate, Is.EqualTo(SystemTime.Now()), "LastModifiedDate should be now");
        }
        public void a_newer_message_number_for_existing_breaker_is_processed_for_update()
        {
            SystemTime.Is(second: 1, millisecond: 100);

            CircuitBreakerState original       = Helper.MakeBreakerState("a", messageSequenceNumber: 15);
            CircuitBreakerState originalResult = _set.ProcessCircuitStateMessage(original);

            SystemTime.Is(second: 2, millisecond: 200);
            CircuitBreakerState newResult =
                _set.ProcessCircuitStateMessage(Helper.MakeBreakerState("a", messageSequenceNumber: 16));


            Assert.That(newResult.CircuitBreakerId, Is.EqualTo(originalResult.CircuitBreakerId), "CircuitBreakerId");
            Assert.That(newResult.MessageSequenceNumber, Is.EqualTo(16), "RequestMessageSequenceNumber");
            Assert.That(newResult.ProcessId, Is.EqualTo(originalResult.ProcessId), "ProcessID");
            Assert.That(newResult.Status, Is.EqualTo(originalResult.Status), "Status");
            Assert.That(newResult.MachineName, Is.EqualTo(originalResult.MachineName), "MachineName");
            Assert.That(newResult.LastModifiedDate, Is.EqualTo(SystemTime.Now()), "LastModifiedDate should be now");
        }
        public void all_entries_older_than_expirydate_get_wiped_leaving_newer_ones_untouched()
        {
            for (int i = 0; i < 13; i++)
            {
                var dt = SystemTime.Is(i);
                var c  = Helper.AddRandomCircuit(_set);
                var cb = _set.TryGetCircuit(c);
                Assert.AreEqual(dt, cb.LastModifiedDate);
            }
            Assert.That(_set.Circuits().Length, Is.EqualTo(13));


            DateTime expiryDateTime = SystemTime.Is(10);

            _set.RemoveExpiredCircuitBreakers(expiryDateTime);

            Assert.That(_set.Circuits().Length, Is.EqualTo(2));
            foreach (var id in _set.Circuits())
            {
                var state = _set.TryGetCircuit(id);
                Assert.That(state.LastModifiedDate > expiryDateTime);
            }
        }