Esempio n. 1
0
def test_transition_events(storage):
    """It should call the appropriate functions on every state transition."""
    class Listener(CircuitBreakerListener):
        def __init__(self):
            self.out = []

        def state_change(self, breaker, old, new):
            assert breaker
            self.out.append((old.state, new.state))

    listener = Listener()
    breaker = CircuitBreaker(listeners=(listener, ), state_storage=storage)
    assert CircuitBreakerState.CLOSED == breaker.current_state

    breaker.open()
    assert CircuitBreakerState.OPEN == breaker.current_state

    breaker.half_open()
    assert CircuitBreakerState.HALF_OPEN == breaker.current_state

    breaker.close()
    assert CircuitBreakerState.CLOSED == breaker.current_state

    assert [(CircuitBreakerState.CLOSED, CircuitBreakerState.OPEN),
            (CircuitBreakerState.OPEN, CircuitBreakerState.HALF_OPEN),
            (CircuitBreakerState.HALF_OPEN, CircuitBreakerState.CLOSED)
            ] == listener.out
Esempio n. 2
0
def test_successful_call_when_half_open(storage):
    """It should close the circuit when a call succeeds in half-open state."""

    breaker = CircuitBreaker(state_storage=storage)

    breaker.half_open()
    assert 0 == breaker.fail_counter
    assert CircuitBreakerState.HALF_OPEN == breaker.current_state

    # Circuit should open
    assert breaker.call(func_succeed)
    assert 0 == breaker.fail_counter
    assert CircuitBreakerState.CLOSED == breaker.current_state
Esempio n. 3
0
def test_failed_call_when_half_open(storage):
    """It should open the circuit when a call fails in half-open state."""

    breaker = CircuitBreaker(state_storage=storage)

    breaker.half_open()
    assert 0 == breaker.fail_counter
    assert CircuitBreakerState.HALF_OPEN == breaker.current_state

    with raises(CircuitBreakerError):
        breaker.call(func_exception)

    assert 1 == breaker.fail_counter
    assert CircuitBreakerState.OPEN == breaker.current_state