package com.linkedin.parseq.retry;
import static com.linkedin.parseq.Task.withRetryPolicy;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertTrue;
import java.io.IOException;
import java.util.concurrent.TimeoutException;
import java.util.function.Function;
import org.testng.annotations.Test;
import com.linkedin.parseq.BaseEngineTest;
import com.linkedin.parseq.Task;
import com.linkedin.parseq.retry.termination.TerminationPolicy;
public class TestRetriableTask extends BaseEngineTest {
@Test
public void testSuccessfulTask()
{
Task<String> task = withRetryPolicy(RetryPolicy.attempts(3, 0), attempt -> Task.value("successful attempt " + attempt));
runAndWait(task);
assertTrue(task.isDone());
assertEquals(task.get(), "successful attempt 0");
}
@Test
public void testSimpleRetryPolicy()
{
Task<Void> task = withRetryPolicy("testSimpleRetryPolicy", RetryPolicy.attempts(3, 0),
attempt -> Task.failure(new RuntimeException("current attempt: " + attempt)));
runAndWaitException(task, RuntimeException.class);
assertTrue(task.isDone());
assertEquals(task.getError().getMessage(), "current attempt: 2");
}
@Test
public void testErrorClassification()
{
Function<Throwable, ErrorClassification> errorClassifier = error -> error instanceof TimeoutException ? ErrorClassification.RECOVERABLE : ErrorClassification.UNRECOVERABLE;
RetryPolicy retryPolicy = new RetryPolicyBuilder().
setTerminationPolicy(TerminationPolicy.limitAttempts(3)).
setErrorClassifier(errorClassifier).
build();
assertEquals(retryPolicy.getName(), "RetryPolicy.LimitAttempts");
Task<Void> task1 = withRetryPolicy("testErrorClassification", retryPolicy, attempt -> Task.failure(new TimeoutException("current attempt: " + attempt)));
runAndWaitException(task1, TimeoutException.class);
assertTrue(task1.isDone());
assertEquals(task1.getError().getMessage(), "current attempt: 2");
Task<Void> task2 = withRetryPolicy("testErrorClassification", retryPolicy, attempt -> Task.failure(new IllegalArgumentException("current attempt: " + attempt)));
runAndWaitException(task2, IllegalArgumentException.class);
assertTrue(task2.isDone());
assertEquals(task2.getError().getMessage(), "current attempt: 0");
}
@Test
public void testFailingTaskSupplier()
{
Task<Void> task = withRetryPolicy("testFailingTaskSupplier", RetryPolicy.attempts(3, 0),
attempt -> { throw new IOException("ups"); });
runAndWaitException(task, IOException.class);
assertTrue(task.isDone());
}
}