def test_circuit_closes_again_after_timeout(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 == 'closed'
Esempio n. 2
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
Esempio n. 3
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
Esempio n. 4
0
 def test_closed_circuit_allows_execution(self):
     circuit_breaker = CircuitBreaker()
     assert circuit_breaker.current_state == 'closed'
     assert circuit_breaker.allows_execution() is True