package net.jodah.failsafe.issues;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.fail;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import org.testng.annotations.Test;
import net.jodah.concurrentunit.Waiter;
import net.jodah.failsafe.Failsafe;
import net.jodah.failsafe.FailsafeException;
import net.jodah.failsafe.RetryPolicy;
@Test
public class Issue76 {
public void shouldAbortOnSyncError() throws Exception {
AssertionError error = new AssertionError();
try {
Failsafe.with(new RetryPolicy().abortOn(AssertionError.class)).run(() -> {
throw error;
});
fail();
} catch (FailsafeException e) {
assertEquals(e.getCause(), error);
}
}
public void shouldAbortOnAsyncError() throws Exception {
final AssertionError error = new AssertionError();
Waiter waiter = new Waiter();
Future<?> future = Failsafe.with(new RetryPolicy().abortOn(AssertionError.class))
.with(Executors.newSingleThreadScheduledExecutor())
.onAbort(e -> {
waiter.assertEquals(e, error);
waiter.resume();
})
.run(() -> {
throw error;
});
waiter.await(1000);
try {
future.get();
fail();
} catch (ExecutionException e) {
assertEquals(e.getCause(), error);
}
}
}