@Test() public void shouldUseRecordFailureThrowablePredicate() { CircuitBreakerConfig circuitBreakerConfig = CircuitBreakerConfig.custom() .recordFailure(TEST_PREDICATE).build(); then(circuitBreakerConfig.getRecordFailurePredicate().test(new Error("test"))).isEqualTo(true); then(circuitBreakerConfig.getRecordFailurePredicate().test(new Error("fail"))).isEqualTo(false); then(circuitBreakerConfig.getRecordFailurePredicate().test(new RuntimeException("test"))).isEqualTo(true); then(circuitBreakerConfig.getRecordFailurePredicate().test(new Error())).isEqualTo(false); then(circuitBreakerConfig.getRecordFailurePredicate().test(new RuntimeException())).isEqualTo(false); }
@Test(expected = IllegalArgumentException.class) public void zeroWaitIntervalShouldFail() { CircuitBreakerConfig.custom().waitDurationInOpenState(Duration.ofMillis(0)).build(); }
@Test() public void shouldSetWaitInterval() { CircuitBreakerConfig circuitBreakerConfig = CircuitBreakerConfig.custom().waitDurationInOpenState(Duration.ofSeconds(1)).build(); then(circuitBreakerConfig.getWaitDurationInOpenState().getSeconds()).isEqualTo(1); }
@Test() public void shouldUseIgnoreExceptionToBuildPredicate() { CircuitBreakerConfig circuitBreakerConfig = CircuitBreakerConfig.custom() .ignoreExceptions(RuntimeException.class, ExtendsExtendsException.class).build(); final Predicate<? super Throwable> failurePredicate = circuitBreakerConfig.getRecordFailurePredicate(); then(failurePredicate.test(new Exception())).isEqualTo(true); // not explicitly excluded then(failurePredicate.test(new ExtendsError())).isEqualTo(true); // not explicitly excluded then(failurePredicate.test(new ExtendsException())).isEqualTo(true); // not explicitly excluded then(failurePredicate.test(new ExtendsException2())).isEqualTo(true); // not explicitly excluded then(failurePredicate.test(new RuntimeException())).isEqualTo(false); // explicitly excluded then(failurePredicate.test(new ExtendsRuntimeException())).isEqualTo(false); // inherits excluded from ExtendsException then(failurePredicate.test(new ExtendsExtendsException())).isEqualTo(false); // explicitly excluded }
@Test() public void shouldUseRecordExceptionToBuildPredicate() { CircuitBreakerConfig circuitBreakerConfig = CircuitBreakerConfig.custom() .recordExceptions(RuntimeException.class, ExtendsExtendsException.class).build(); final Predicate<? super Throwable> failurePredicate = circuitBreakerConfig.getRecordFailurePredicate(); then(failurePredicate.test(new Exception())).isEqualTo(false); // not explicitly included then(failurePredicate.test(new ExtendsError())).isEqualTo(false); // not explicitly included then(failurePredicate.test(new ExtendsException())).isEqualTo(false); // not explicitly included then(failurePredicate.test(new ExtendsException2())).isEqualTo(false); // not explicitly included then(failurePredicate.test(new RuntimeException())).isEqualTo(true); // explicitly included then(failurePredicate.test(new ExtendsRuntimeException())).isEqualTo(true); // inherits included from ExtendsException then(failurePredicate.test(new ExtendsExtendsException())).isEqualTo(true); // explicitly included }
@Test(expected = IllegalArgumentException.class) public void ringBufferSizeInHalfOpenStateBelowOneShouldFail() { CircuitBreakerConfig.custom().ringBufferSizeInHalfOpenState(0).build(); }
@Test(expected = IllegalArgumentException.class) public void ringBufferSizeInClosedStateBelowOneThenShouldFail() { CircuitBreakerConfig.custom().ringBufferSizeInClosedState(0).build(); }
@Test(expected = IllegalArgumentException.class) public void zeroMaxFailuresShouldFail() { CircuitBreakerConfig.custom().failureRateThreshold(0).build(); }
@Test(expected = IllegalArgumentException.class) public void failureRateThresholdAboveHundredShouldFail() { CircuitBreakerConfig.custom().failureRateThreshold(101).build(); }
@Test(expected = IllegalArgumentException.class) public void zeroFailureRateThresholdShouldFail() { CircuitBreakerConfig.custom().failureRateThreshold(0).build(); }
@Test() public void shouldSetRingBufferSizeInClosedState() { CircuitBreakerConfig circuitBreakerConfig = CircuitBreakerConfig.custom().ringBufferSizeInClosedState(1000).build(); then(circuitBreakerConfig.getRingBufferSizeInClosedState()).isEqualTo(1000); }
@Test() public void shouldSetRingBufferSizeInHalfOpenState() { CircuitBreakerConfig circuitBreakerConfig = CircuitBreakerConfig.custom().ringBufferSizeInHalfOpenState(100).build(); then(circuitBreakerConfig.getRingBufferSizeInHalfOpenState()).isEqualTo(100); }
@Test public void shouldConsumeOnStateTransitionEvent() { circuitBreaker = CircuitBreaker.of("test", CircuitBreakerConfig.custom() .ringBufferSizeInClosedState(1).build()); circuitBreaker.getEventPublisher() .onStateTransition(this::logEventType); circuitBreaker.onError(1000, new IOException("BAM!")); circuitBreaker.onError(1000, new IOException("BAM!")); then(logger).should(times(1)).info("STATE_TRANSITION"); }
@Test public void shouldConsumeCallNotPermittedEvent() { circuitBreaker = CircuitBreaker.of("test", CircuitBreakerConfig.custom() .ringBufferSizeInClosedState(1).build()); circuitBreaker.getEventPublisher() .onCallNotPermitted(this::logEventType); circuitBreaker.onError(1000, new IOException("BAM!")); circuitBreaker.onError(1000, new IOException("BAM!")); circuitBreaker.isCallPermitted(); then(logger).should(times(1)).info("NOT_PERMITTED"); }
@Test() public void shouldBuilderCreateConfigEveryTime() { final CircuitBreakerConfig.Builder builder = CircuitBreakerConfig.custom(); builder.ringBufferSizeInClosedState(5); final CircuitBreakerConfig config1 = builder.build(); builder.ringBufferSizeInClosedState(3); final CircuitBreakerConfig config2 = builder.build(); assertThat(config2.getRingBufferSizeInClosedState()).isEqualTo(3); assertThat(config1.getRingBufferSizeInClosedState()).isEqualTo(5); }
@Test() public void shouldSetFailureRateThreshold() { CircuitBreakerConfig circuitBreakerConfig = CircuitBreakerConfig.custom().failureRateThreshold(25).build(); then(circuitBreakerConfig.getFailureRateThreshold()).isEqualTo(25); }
@Test() public void shouldSetLowFailureRateThreshold() { CircuitBreakerConfig circuitBreakerConfig = CircuitBreakerConfig.custom().failureRateThreshold(0.001f).build(); then(circuitBreakerConfig.getFailureRateThreshold()).isEqualTo(0.001f); }
@Before public void setUp() { circuitBreaker = new CircuitBreakerStateMachine("testName", CircuitBreakerConfig.custom() .failureRateThreshold(50) .ringBufferSizeInClosedState(5) .ringBufferSizeInHalfOpenState(3) .waitDurationInOpenState(Duration.ofSeconds(1)) .recordFailure(error -> !(error instanceof NumberFormatException)) .build()); }
@Before public void setUp() throws Exception { CircuitBreakerConfig config = CircuitBreakerConfig.custom() .waitDurationInOpenState(Duration.ofSeconds(1)) .failureRateThreshold(50) .ringBufferSizeInHalfOpenState(3) .ringBufferSizeInClosedState(10) .build(); circuitBreaker = CircuitBreakerRegistry.ofDefaults().circuitBreaker("test", config); metricRegistry.registerAll(CircuitBreakerMetrics.ofCircuitBreaker(circuitBreaker)); }
@Test public void shouldConsumeIgnoredErrorEvent() { CircuitBreakerConfig circuitBreakerConfig = CircuitBreakerConfig.custom() .recordFailure(throwable -> Match(throwable).of( Case($(instanceOf(WebServiceException.class)), true), Case($(), false))) .build(); circuitBreaker = CircuitBreaker.of("test", circuitBreakerConfig); circuitBreaker.getEventPublisher() .onIgnoredError(this::logEventType) ; circuitBreaker.onError(1000, new IOException("BAM!")); then(logger).should(times(1)).info("IGNORED_ERROR"); }