package net.jodah.failsafe.issues; import static org.testng.Assert.assertFalse; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; import java.util.concurrent.Executors; import java.util.concurrent.Future; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; import org.testng.annotations.Test; import net.jodah.failsafe.Asserts; import net.jodah.failsafe.CircuitBreaker; import net.jodah.failsafe.CircuitBreakerOpenException; import net.jodah.failsafe.Failsafe; @Test public class Issue84 { public void shouldHandleCircuitBreakerOpenException() throws Throwable { ScheduledExecutorService executor = Executors.newScheduledThreadPool(2); CircuitBreaker circuitBreaker = new CircuitBreaker().withDelay(10, TimeUnit.MINUTES).failWhen(false); circuitBreaker.open(); // Synchronous Asserts.assertThrows(() -> Failsafe.with(circuitBreaker).get(() -> true), CircuitBreakerOpenException.class); // Synchronous with fallback assertFalse(Failsafe.with(circuitBreaker).withFallback(false).get(() -> true)); // Asynchronous Future<Boolean> future1 = Failsafe.with(circuitBreaker).with(executor).get(() -> true); Asserts.assertThrows(() -> future1.get(), ExecutionException.class, CircuitBreakerOpenException.class); // Asynchronous with fallback Future<Boolean> future2 = Failsafe.with(circuitBreaker).with(executor).withFallback(false).get(() -> true); assertFalse(future2.get()); // Future Future<Boolean> future3 = Failsafe.with(circuitBreaker).with(executor).future(() -> CompletableFuture.completedFuture(false)); Asserts.assertThrows(() -> future3.get(), ExecutionException.class, CircuitBreakerOpenException.class); // Future with fallback Future<Boolean> future4 = Failsafe.with(circuitBreaker) .with(executor) .withFallback(false) .future(() -> CompletableFuture.completedFuture(false)); assertFalse(future4.get()); } }