package uk.co.acuminous.julez.scenario.source;
import static java.util.concurrent.TimeUnit.SECONDS;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import static uk.co.acuminous.julez.util.JulezSugar.SCENARIOS_ARE_DEQUEUED_BUT_NOT_STARTED;
import static uk.co.acuminous.julez.util.JulezSugar.THREADS;
import org.junit.Test;
import uk.co.acuminous.julez.event.pipe.PassThroughPipe;
import uk.co.acuminous.julez.runner.ConcurrentScenarioRunner;
import uk.co.acuminous.julez.scenario.Scenario;
import uk.co.acuminous.julez.scenario.ScenarioEventFactory;
import uk.co.acuminous.julez.scenario.ScenarioSource;
import uk.co.acuminous.julez.scenario.limiter.InLimboLimiter;
import uk.co.acuminous.julez.test.NoOpScenario;
import uk.co.acuminous.julez.test.SleepingScenario;
import uk.co.acuminous.julez.util.ConcurrencyUtils;
public class InLimboLimiterTest {
@Test
public void providesScenariosWhileBelowOrAtSpecifiedLimit() {
ScenarioSource scenarios = new ScenarioRepeater(new NoOpScenario());
InLimboLimiter limiter = new InLimboLimiter().block(scenarios).when(2, SCENARIOS_ARE_DEQUEUED_BUT_NOT_STARTED);
long startTime = System.currentTimeMillis();
assertNotNull(limiter.next());
assertNotNull(limiter.next());
assertNotNull(limiter.next());
Long duration = System.currentTimeMillis() - startTime;
assertTrue(duration < 1000);
}
@Test
public void blocksScenariosWhileAboveSpecifiedLimit() {
ScenarioSource scenarios = new ScenarioRepeater(new NoOpScenario());
final InLimboLimiter limiter = new InLimboLimiter().block(scenarios).when(2, SCENARIOS_ARE_DEQUEUED_BUT_NOT_STARTED);
limiter.next();
limiter.next();
limiter.next();
ConcurrencyUtils.start(new Runnable() {
@Override public void run() {
ConcurrencyUtils.sleep(1, SECONDS);
limiter.onEvent(new ScenarioEventFactory().end());
}
});
long startTime = System.currentTimeMillis();
assertNotNull(limiter.next());
long duration = System.currentTimeMillis() - startTime;
assertTrue("Inflight Limiter did not block after limit was exceeded", duration >= 1000);
}
@Test
public void preventsOutOfMemoryErrors() {
final PassThroughPipe passThroughPipe = new PassThroughPipe();
ScenarioSource scenarios = new ScenarioSource() {
@Override public Scenario next() {
SleepingScenario scenario = new SleepingScenario(5, SECONDS) {
@SuppressWarnings("unused")
String lotsOfData = String.format("%10000d", System.currentTimeMillis());
};
scenario.register(passThroughPipe);
return scenario;
}
};
InLimboLimiter limiter = new InLimboLimiter().block(scenarios).when(100, SCENARIOS_ARE_DEQUEUED_BUT_NOT_STARTED);
passThroughPipe.register(limiter);
new ConcurrentScenarioRunner().queue(limiter).allocate(4, THREADS).runFor(5, SECONDS).go();
}
}