예제 #1
0
    def test_half_open_state_ratio(self):
        ratio = 0.2
        total_executions = 1000

        circuit_breaker = CircuitBreaker(half_open_ratio=ratio)
        circuit_breaker.half_open()

        results = []
        for i in range(0, total_executions):
            results.append(circuit_breaker.allows_execution())
            assert circuit_breaker.current_state == 'half-open'

        allowed_executions = list(filter(lambda x: x is True, results))

        assert len(results) == total_executions
        assert len(allowed_executions) == total_executions * ratio
예제 #2
0
    def test_circut_success_resets_failures_counter(self):
        circuit_breaker = CircuitBreaker(maximum_failures=3)
        circuit_breaker.record_failure()
        circuit_breaker.record_failure()
        circuit_breaker.record_success()
        circuit_breaker.record_failure()
        circuit_breaker.record_failure()

        assert circuit_breaker.current_state == 'closed'
예제 #3
0
    def test_circut_is_opened_after_failures(self):
        circuit_breaker = CircuitBreaker(maximum_failures=3)
        circuit_breaker.record_failure()
        circuit_breaker.record_failure()
        circuit_breaker.record_failure()

        assert circuit_breaker.current_state == 'open'
예제 #4
0
    def test_circuit_stays_open_upon_failure_after_half_opening(self, monotonic_mock):
        circuit_breaker = CircuitBreaker(maximum_failures=1, reset_timeout_seconds=20)

        assert circuit_breaker.allows_execution() is True
        assert circuit_breaker.current_state == 'closed'

        monotonic_mock.return_value = 100

        circuit_breaker.record_failure()

        assert circuit_breaker.allows_execution() is False
        assert circuit_breaker.current_state == 'open'

        monotonic_mock.return_value = 130

        assert circuit_breaker.allows_execution() is True
        assert circuit_breaker.current_state == 'half-open'

        circuit_breaker.record_failure()

        assert circuit_breaker.allows_execution() is False
        assert circuit_breaker.current_state == 'open'
예제 #5
0
    def test_circut_stays_closed_after_less_failures_then_limit(self):
        circuit_breaker = CircuitBreaker(maximum_failures=3)
        circuit_breaker.record_failure()
        circuit_breaker.record_failure()

        assert circuit_breaker.current_state == 'closed'
예제 #6
0
 def test_open_circuit_does_not_allow_execution(self):
     circuit_breaker = CircuitBreaker(maximum_failures=1)
     circuit_breaker.record_failure()
     assert circuit_breaker.current_state == 'open'
     assert circuit_breaker.allows_execution() is False
예제 #7
0
 def test_closed_circuit_allows_execution(self):
     circuit_breaker = CircuitBreaker()
     assert circuit_breaker.current_state == 'closed'
     assert circuit_breaker.allows_execution() is True
예제 #8
0
 def test_initial_state_is_closed(self):
     circuit_breaker = CircuitBreaker()
     assert circuit_breaker.current_state == 'closed'