public void requestComplete(boolean success) { servingRequests.decrementAndGet(); circuitBreaker.requestComplete(success); }
@Test public void testHasFailed() { for (int i = 0; i < CircuitBreakerState.HISTORY_SIZE - 1; i++) { breaker.requestComplete(false); assertThat(breaker.canServeRequests(false)).isTrue(); } breaker.requestComplete(false); assertThat(breaker.canServeRequests(false)).isFalse(); }
@Test public void intermittentFailuresDontTrip() { for (int i = 0; i < 10; i++) { assertThat(breaker.canServeRequests(false)).isTrue(); breaker.requestComplete(true); assertThat(breaker.canServeRequests(false)).isTrue(); breaker.requestComplete(false); } assertThat(breaker.canServeRequests(false)).isTrue(); }
@Test public void primaryProbeToHealthy() { breaker.requestComplete(false); breaker.requestComplete(false); breaker.requestComplete(false); assertThat(breaker.getState()).isEqualTo(PRIMARY_TRIPPED); executor.tick(PRIMARY_TRIP_TIME); assertThat(breaker.getState()).isEqualTo(PRIMARY_PROBE); breaker.requestComplete(true); assertThat(breaker.getState()).isEqualTo(SECONDARY_HEALTHY); executor.tick(PRIMARY_TRIP_TIME); assertThat(breaker.getState()).isEqualTo(PRIMARY_HEALTHY); }
@Test public void healthyToTripped() { breaker.requestComplete(false); breaker.requestComplete(false); breaker.requestComplete(false); assertThat(breaker.getState()).isEqualTo(PRIMARY_TRIPPED); executor.tick(PRIMARY_TRIP_TIME); assertThat(breaker.getState()).isEqualTo(PRIMARY_PROBE); breaker.requestComplete(false); assertThat(breaker.getState()).isEqualTo(SECONDARY_TRIPPED); executor.tick(SECONDARY_TRIP_TIME); assertThat(breaker.getState()).isEqualTo(SECONDARY_PROBE); breaker.requestComplete(true); assertThat(breaker.getState()).isEqualTo(SECONDARY_HEALTHY); breaker.requestComplete(false); breaker.requestComplete(false); breaker.requestComplete(false); assertThat(breaker.getState()).isEqualTo(SECONDARY_TRIPPED); executor.tick(SECONDARY_TRIP_TIME); assertThat(breaker.getState()).isEqualTo(SECONDARY_PROBE); breaker.requestComplete(false); assertThat(breaker.getState()).isEqualTo(TERTIARY_TRIPPED); executor.tick(TERTIARY_TRIP_TIME); assertThat(breaker.getState()).isEqualTo(TERTIARY_PROBE); breaker.requestComplete(true); assertThat(breaker.getState()).isEqualTo(TERTIARY_HEALTHY); breaker.requestComplete(false); breaker.requestComplete(false); breaker.requestComplete(false); assertThat(breaker.getState()).isEqualTo(TERTIARY_TRIPPED);
@Test public void stateChangerRespectsFailures() { breaker.requestComplete(false); breaker.requestComplete(false); breaker.requestComplete(false); assertThat(breaker.getState()).isEqualTo(PRIMARY_TRIPPED); executor.tick(PRIMARY_TRIP_TIME); assertThat(breaker.getState()).isEqualTo(PRIMARY_PROBE); breaker.requestComplete(false); assertThat(breaker.getState()).isEqualTo(SECONDARY_TRIPPED); executor.tick(SECONDARY_TRIP_TIME); assertThat(breaker.getState()).isEqualTo(SECONDARY_PROBE); breaker.requestComplete(true); assertThat(breaker.getState()).isEqualTo(SECONDARY_HEALTHY); breaker.requestComplete(false); breaker.requestComplete(false); breaker.requestComplete(false); executor.tick(PRIMARY_TRIP_TIME); assertThat(executor.scheduledTasks).hasSize(2); executor.tick(PRIMARY_TRIP_TIME); assertThat(breaker.getState()).isEqualTo(SECONDARY_PROBE); breaker.requestComplete(false); assertThat(breaker.getState()).isEqualTo(TERTIARY_TRIPPED); executor.tick(TERTIARY_TRIP_TIME); assertThat(breaker.getState()).isEqualTo(TERTIARY_PROBE); breaker.requestComplete(true); assertThat(breaker.getState()).isEqualTo(TERTIARY_HEALTHY); breaker.requestComplete(false); breaker.requestComplete(false); breaker.requestComplete(false);
for (int i = 0; i < 3; i++) { assertThat(breaker.getState()).isEqualTo(PRIMARY_HEALTHY); breaker.requestComplete(false); breaker.requestComplete(false); assertThat(breaker.getState()).isEqualTo(PRIMARY_HEALTHY); breaker.requestComplete(false); assertThat(breaker.getState()).isEqualTo(PRIMARY_TRIPPED); executor.tick(PRIMARY_TRIP_TIME - 1); executor.tick(1); assertThat(breaker.getState()).isEqualTo(PRIMARY_PROBE); breaker.requestComplete(false); assertThat(breaker.getState()).isEqualTo(SECONDARY_TRIPPED); executor.tick(SECONDARY_TRIP_TIME - 1); executor.tick(1); assertThat(breaker.getState()).isEqualTo(SECONDARY_PROBE); breaker.requestComplete(false); assertThat(breaker.getState()).isEqualTo(TERTIARY_TRIPPED); executor.tick(TERTIARY_TRIP_TIME - 1); executor.tick(1); assertThat(breaker.getState()).isEqualTo(TERTIARY_PROBE); breaker.requestComplete(false); assertThat(breaker.getState()).isEqualTo(TERTIARY_TRIPPED); executor.tick(TERTIARY_TRIP_TIME); assertThat(breaker.getState()).isEqualTo(TERTIARY_PROBE); breaker.requestComplete(true); assertThat(breaker.getState()).isEqualTo(TERTIARY_HEALTHY);