TestTimeUtil: Add methods for temporarily setting clock step

A test may want to use a different clock step or freeze time only for a
portion of a test method. Add some methods to make this easy with an
AutoCloseable.

Change-Id: Ie90504cceae73595dacc14a565179596fe3b96f3
This commit is contained in:
Dave Borowitz
2017-11-13 09:49:42 -05:00
parent eda010a7eb
commit 1033e51129

View File

@@ -62,6 +62,41 @@ public class TestTimeUtil {
TimeUtil.setCurrentMillisSupplier(() -> clockMs.getAndAdd(clockStepMs));
}
/** {@link AutoCloseable} handle returned by {@link #withClockStep(long, TimeUnit)}. */
public static class TempClockStep implements AutoCloseable {
private final long oldClockStepMs;
private TempClockStep(long clockStep, TimeUnit clockStepUnit) {
oldClockStepMs = clockStepMs;
setClockStep(clockStep, clockStepUnit);
}
@Override
public void close() {
setClockStep(oldClockStepMs, TimeUnit.MILLISECONDS);
}
}
/**
* Set a clock step only for the scope of a single try-with-resources block.
*
* @param clockStep amount to increment clock by on each lookup.
* @param clockStepUnit time unit for {@code clockStep}.
* @return {@link AutoCloseable} handle which resets the clock step to its old value on close.
*/
public static TempClockStep withClockStep(long clockStep, TimeUnit clockStepUnit) {
return new TempClockStep(clockStep, clockStepUnit);
}
/**
* Freeze the clock to stop moving only for the scope of a single try-with-resources block.
*
* @return {@link AutoCloseable} handle which resets the clock step to its old value on close.
*/
public static TempClockStep freezeClock() {
return withClockStep(0, TimeUnit.SECONDS);
}
/**
* Set the clock to a specific timestamp.
*