package com.linkedin.parseq.retry;
import com.linkedin.parseq.BaseEngineTest;
import com.linkedin.parseq.retry.backoff.BackoffPolicy;
import org.testng.annotations.Test;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertTrue;
public class TestBackoffPolicy extends BaseEngineTest {
@Test
public void testConstantBackoff()
{
BackoffPolicy policy = BackoffPolicy.constant(100);
assertEquals(policy.nextBackoff(1, null), 100);
assertEquals(policy.nextBackoff(2, null), 100);
assertEquals(policy.nextBackoff(3, null), 100);
assertEquals(policy.nextBackoff(4, null), 100);
assertEquals(policy.nextBackoff(5, null), 100);
}
@Test
public void testLinearBackoff()
{
BackoffPolicy policy = BackoffPolicy.linear(100);
assertEquals(policy.nextBackoff(1, null), 100);
assertEquals(policy.nextBackoff(2, null), 200);
assertEquals(policy.nextBackoff(3, null), 300);
assertEquals(policy.nextBackoff(4, null), 400);
assertEquals(policy.nextBackoff(5, null), 500);
}
@Test
public void testExponentialBackoff()
{
BackoffPolicy policy = BackoffPolicy.exponential(100);
assertEquals(policy.nextBackoff(1, null), 100);
assertEquals(policy.nextBackoff(2, null), 200);
assertEquals(policy.nextBackoff(3, null), 400);
assertEquals(policy.nextBackoff(4, null), 800);
assertEquals(policy.nextBackoff(5, null), 1600);
}
@Test
public void testFibonacciBackoff()
{
BackoffPolicy policy = BackoffPolicy.fibonacci(100);
assertEquals(policy.nextBackoff(1, null), 100);
assertEquals(policy.nextBackoff(2, null), 160);
assertEquals(policy.nextBackoff(3, null), 256);
assertEquals(policy.nextBackoff(4, null), 410);
assertEquals(policy.nextBackoff(5, null), 655);
}
@Test
public void testRandomizedBackoff()
{
BackoffPolicy policy = BackoffPolicy.randomized(BackoffPolicy.exponential(100), -100, 100);
assertTrue(policy.nextBackoff(1, null) >= 0);
assertTrue(policy.nextBackoff(1, null) <= 200);
assertTrue(policy.nextBackoff(2, null) >= 100);
assertTrue(policy.nextBackoff(2, null) <= 300);
assertTrue(policy.nextBackoff(3, null) >= 300);
assertTrue(policy.nextBackoff(3, null) <= 500);
assertTrue(policy.nextBackoff(4, null) >= 700);
assertTrue(policy.nextBackoff(4, null) <= 900);
assertTrue(policy.nextBackoff(5, null) >= 1500);
assertTrue(policy.nextBackoff(5, null) <= 1700);
}
@Test
public void testSelectedBackoff()
{
BackoffPolicy policy = BackoffPolicy.selected(error -> error.getMessage().isEmpty() ? BackoffPolicy.constant(100) : BackoffPolicy.constant(200));
assertEquals(policy.nextBackoff(1, new RuntimeException("")), 100);
assertEquals(policy.nextBackoff(2, new RuntimeException("x")), 200);
assertEquals(policy.nextBackoff(3, new RuntimeException("")), 100);
assertEquals(policy.nextBackoff(4, new RuntimeException("x")), 200);
}
}