forked from retoor/devplacepy
Zo doen wijdat in oost
This commit is contained in:
@@ -0,0 +1,97 @@
|
||||
# retoor <retoor@molodetz.nl>
|
||||
|
||||
from devplacepy.services.nodes.circuit import CLOSED, HALF_OPEN, OPEN, CircuitBreaker
|
||||
|
||||
|
||||
class Clock:
|
||||
def __init__(self):
|
||||
self.now = 0.0
|
||||
|
||||
def __call__(self):
|
||||
return self.now
|
||||
|
||||
|
||||
def make(failures=3, open_seconds=60):
|
||||
clock = Clock()
|
||||
return CircuitBreaker(failures, open_seconds, clock), clock
|
||||
|
||||
|
||||
def test_unknown_keys_are_closed():
|
||||
breaker, _ = make()
|
||||
assert breaker.state("x") == CLOSED and breaker.allows("x")
|
||||
|
||||
|
||||
def test_it_opens_at_the_threshold_and_not_before():
|
||||
breaker, _ = make(failures=3)
|
||||
breaker.failure("x")
|
||||
breaker.failure("x")
|
||||
assert breaker.allows("x")
|
||||
breaker.failure("x")
|
||||
assert breaker.state("x") == OPEN and not breaker.allows("x")
|
||||
|
||||
|
||||
def test_a_success_resets_the_streak():
|
||||
breaker, _ = make(failures=3)
|
||||
breaker.failure("x")
|
||||
breaker.failure("x")
|
||||
breaker.success("x")
|
||||
breaker.failure("x")
|
||||
breaker.failure("x")
|
||||
assert breaker.allows("x")
|
||||
|
||||
|
||||
def test_it_goes_half_open_after_the_cooldown_and_admits_one_probe():
|
||||
breaker, clock = make(failures=1, open_seconds=60)
|
||||
breaker.failure("x")
|
||||
clock.now = 59
|
||||
assert breaker.state("x") == OPEN
|
||||
clock.now = 60
|
||||
assert breaker.state("x") == HALF_OPEN and breaker.allows("x")
|
||||
breaker.begin("x")
|
||||
assert not breaker.allows("x")
|
||||
|
||||
|
||||
def test_a_failed_probe_reopens_for_a_full_cooldown():
|
||||
breaker, clock = make(failures=1, open_seconds=60)
|
||||
breaker.failure("x")
|
||||
clock.now = 70
|
||||
breaker.begin("x")
|
||||
breaker.failure("x")
|
||||
assert breaker.state("x") == OPEN
|
||||
clock.now = 129
|
||||
assert breaker.state("x") == OPEN
|
||||
clock.now = 131
|
||||
assert breaker.state("x") == HALF_OPEN
|
||||
|
||||
|
||||
def test_a_successful_probe_closes_it():
|
||||
breaker, clock = make(failures=1)
|
||||
breaker.failure("x")
|
||||
clock.now = 100
|
||||
breaker.begin("x")
|
||||
breaker.success("x")
|
||||
assert breaker.state("x") == CLOSED and breaker.allows("x")
|
||||
|
||||
|
||||
def test_keys_are_independent():
|
||||
breaker, _ = make(failures=1)
|
||||
breaker.failure(("node", "a"))
|
||||
assert not breaker.allows(("node", "a"))
|
||||
assert breaker.allows(("node", "b"))
|
||||
assert breaker.allows(("destination", "a"))
|
||||
|
||||
|
||||
def test_open_count_and_forget():
|
||||
breaker, _ = make(failures=1)
|
||||
breaker.failure("a")
|
||||
breaker.failure("b")
|
||||
assert breaker.open_count() == 2
|
||||
breaker.forget("a")
|
||||
assert breaker.open_count() == 1
|
||||
|
||||
|
||||
def test_a_zero_threshold_still_needs_one_failure():
|
||||
breaker = CircuitBreaker(failures=0)
|
||||
assert breaker.allows("x")
|
||||
breaker.failure("x")
|
||||
assert not breaker.allows("x")
|
||||
Reference in New Issue
Block a user