package au.com.vaadinutils.errorHandling;
import static org.junit.Assert.assertTrue;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
import org.junit.Test;
import com.google.common.base.Stopwatch;
public class ErrorRateControllerTest
{
private static final int RATE = 5;
private static final int BURST = 20;
@Test
public void test() throws InterruptedException
{
ErrorRateController errorRateController = new ErrorRateController(BURST, RATE, TimeUnit.SECONDS);
Stopwatch timer = Stopwatch.createStarted();
int counter = runRateTest(errorRateController, 100);
final long expected = expected(timer);
assertTrue("exptected " + expected + " got " + counter, Math.abs(counter - expected) <= RATE);
}
@Test
public void testBurst() throws InterruptedException
{
ErrorRateController errorRateController = new ErrorRateController(BURST, RATE, TimeUnit.SECONDS);
int counter = runRateTest(errorRateController, 0);
Thread.sleep(2000);
counter += runRateTest(errorRateController, 0);
assertTrue("exptected " + (BURST + (RATE * 2)) + " got " + counter,
Math.abs(counter - (BURST + (RATE * 2))) <= RATE);
}
private int runRateTest(ErrorRateController errorRateController, long delay) throws InterruptedException
{
int counter = 0;
for (int i = 0; i < 60; i++)
{
if (errorRateController.acquire())
{
counter++;
System.out.println("Got a permit " + counter);
}
Thread.sleep(delay);
}
return counter;
}
@Test
public void multiThreadTest() throws InterruptedException
{
final ErrorRateController errorRateController = new ErrorRateController(BURST, RATE, TimeUnit.SECONDS);
Stopwatch timer = Stopwatch.createStarted();
final AtomicInteger count = new AtomicInteger();
final CountDownLatch latch = new CountDownLatch(10);
for (int i = 0; i < 10; i++)
{
Runnable r = new Runnable()
{
@Override
public void run()
{
try
{
count.addAndGet(runRateTest(errorRateController, 100));
latch.countDown();
}
catch (InterruptedException e)
{
e.printStackTrace();
}
}
};
new Thread(r).start();
}
latch.await();
final long expected = expected(timer);
assertTrue("exptected " + expected + " got " + count.get(), Math.abs(count.get() - expected) <= RATE);
}
// Logger logger = LogManager.getLogger();
private long expected(Stopwatch timer)
{
return 20 + (timer.elapsed(TimeUnit.SECONDS) * RATE);
}
}