// Copyright © 2011-2014, Esko Luontola <www.orfjackal.net> // This software is released under the Apache License 2.0. // The license text is at http://www.apache.org/licenses/LICENSE-2.0 package fi.jumi.core.ipc.channel; import org.junit.Test; import java.util.*; import static java.util.Arrays.asList; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.is; public class ProgressiveSleepWaitStrategyTest { private final List<String> spy = new ArrayList<>(); private ProgressiveSleepWaitStrategy waitStrategy; @Test public void at_first_yields() { waitStrategy = new SpiedProgressiveSleepWaitStrategy(3, 1, 10); for (int i = 0; i < 3; i++) { waitStrategy.snooze(); } assertThat(spy, is(asList("yield", "yield", "yield"))); } @Test public void sleeps_progressively_longer_times() { waitStrategy = new SpiedProgressiveSleepWaitStrategy(0, 1, 10); for (int i = 0; i < 3; i++) { waitStrategy.snooze(); } assertThat(spy, is(asList("sleep 1", "sleep 2", "sleep 3"))); } @Test public void the_initial_sleep_time_is_configurable() { waitStrategy = new SpiedProgressiveSleepWaitStrategy(0, 5, 10); for (int i = 0; i < 3; i++) { waitStrategy.snooze(); } assertThat(spy, is(asList("sleep 5", "sleep 6", "sleep 7"))); } @Test public void sleeps_at_most_the_maximum_sleep_time() { waitStrategy = new SpiedProgressiveSleepWaitStrategy(0, 1, 10); for (int i = 0; i < 9; i++) { waitStrategy.snooze(); } spy.clear(); for (int i = 0; i < 3; i++) { waitStrategy.snooze(); } assertThat(spy, is(asList("sleep 10", "sleep 10", "sleep 10"))); } @Test public void on_reset_goes_back_to_beginning() { waitStrategy = new SpiedProgressiveSleepWaitStrategy(1, 1, 10); for (int i = 0; i < 9; i++) { waitStrategy.snooze(); } spy.clear(); waitStrategy.reset(); for (int i = 0; i < 3; i++) { waitStrategy.snooze(); } assertThat(spy, is(asList("yield", "sleep 1", "sleep 2"))); } private class SpiedProgressiveSleepWaitStrategy extends ProgressiveSleepWaitStrategy { public SpiedProgressiveSleepWaitStrategy(int yieldCount, int initialSleepMillis, int maxSleepMillis) { super(yieldCount, initialSleepMillis, maxSleepMillis); } @Override protected void yield() { spy.add("yield"); } @Override protected void sleep(int millis) { spy.add("sleep " + millis); } } }