package io.vivarium.util.concurrency;
import org.junit.Test;
import org.junit.experimental.categories.Category;
import com.johnuckele.vtest.Tester;
import io.vivarium.test.SlowTest;
import io.vivarium.test.UnitTest;
public class VoidFunctionSchedulerTest
{
@Test
@Category({ SlowTest.class, UnitTest.class })
public void testManualExecute() throws InterruptedException
{
Incrementer function = new Incrementer();
VoidFunctionScheduler scheduler = new VoidFunctionScheduler(function, Long.MAX_VALUE);
Tester.equal("Initial execute count is zero: ", function.getExecuteCount(), 0);
scheduler.start();
Thread.sleep(2);
Tester.equal("After start, count increments: ", function.getExecuteCount(), 1);
scheduler.execute();
Thread.sleep(2);
Tester.equal("After execution, count increments: ", function.getExecuteCount(), 2);
scheduler.stop();
}
@Test
@Category({ SlowTest.class, UnitTest.class })
public void testManualExecuteQueue() throws InterruptedException
{
SlowIncrementer function = new SlowIncrementer(4);
VoidFunctionScheduler scheduler = new VoidFunctionScheduler(function, Long.MAX_VALUE);
Tester.equal("Initial execute count is zero: ", function.getExecuteCount(), 0);
scheduler.start();
Thread.sleep(10);
Tester.equal("After start, count increments: ", function.getExecuteCount(), 1);
scheduler.execute();
scheduler.execute();
Tester.equal("Neither execute has been counted yet: ", function.getExecuteCount(), 1);
Thread.sleep(10);
Tester.equal("But both will be completed as soon as possible: ", function.getExecuteCount(), 3);
scheduler.execute();
scheduler.execute();
scheduler.execute();
Thread.sleep(10);
Tester.equal("The queue only stores a single extra execute though, additionals are lost: ",
function.getExecuteCount(), 5);
scheduler.stop();
}
@Test
@Category({ SlowTest.class, UnitTest.class })
public void testAutomaticExecution() throws InterruptedException
{
Incrementer function = new Incrementer();
VoidFunctionScheduler scheduler = new VoidFunctionScheduler(function, 4);
Tester.equal("Initial execute count is zero: ", function.getExecuteCount(), 0);
scheduler.start();
Thread.sleep(6);
Tester.equal("Wait for 1.5x scheduler period, count increments twice: ", function.getExecuteCount(), 2);
scheduler.stop();
}
private static class Incrementer implements VoidFunction
{
int _executeCount = 0;
@Override
public void execute()
{
_executeCount++;
}
public int getExecuteCount()
{
return _executeCount;
}
}
private static class SlowIncrementer implements VoidFunction
{
int _executeCount = 0;
final long _delay;
public SlowIncrementer(long delay)
{
this._delay = delay;
}
@Override
public void execute()
{
try
{
Thread.sleep(_delay);
_executeCount++;
}
catch (Exception e)
{
e.printStackTrace();
}
}
public int getExecuteCount()
{
return _executeCount;
}
}
}