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'
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
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
def test_closed_circuit_allows_execution(self): circuit_breaker = CircuitBreaker() assert circuit_breaker.current_state == 'closed' assert circuit_breaker.allows_execution() is True