blob: c2140dd02c02586713203f3c9aa0e326d98692ce [file] [log] [blame]
/*
* Copyright (c) 2017 Mockito contributors
* This program is made available under the terms of the MIT License.
*/
package org.mockitoutil;
import org.mockito.exceptions.base.MockitoAssertionError;
import java.util.concurrent.TimeUnit;
import static java.lang.String.format;
import static java.lang.System.nanoTime;
import static java.util.concurrent.TimeUnit.NANOSECONDS;
/**
* This class can be uses as stopwatch to assert that a given time is elapsed or not.
*/
public class Stopwatch {
/**
* The start time in nano seconds or <code>null</code> if this stop watch was not started yet
*/
private Long startNanos = null;
/**
* To create an instance use {@link #createNotStarted()}
*/
private Stopwatch() {
}
/**
* Return a new and not started {@link Stopwatch}.
*/
public static Stopwatch createNotStarted() {
return new Stopwatch();
}
public void start() {
if (startNanos != null)
throw new IllegalStateException("This stop watch is already started!");
startNanos = nanoTime();
}
public void assertElapsedTimeIsMoreThan(long expected, TimeUnit unit) {
long elapsedNanos = elapsedNanos();
long expectedNanos = unit.toNanos(expected);
if (elapsedNanos <= expectedNanos)
fail("Expected that more than %dms elapsed! But was: %dms", expectedNanos, elapsedNanos);
}
public void assertElapsedTimeIsLessThan(long expected, TimeUnit unit) {
long elapsedNanos = elapsedNanos();
long expectedNanos = unit.toNanos(expected);
if (elapsedNanos >= expectedNanos)
fail("Expected that less than %dms elapsed! But was: %dms", expectedNanos, elapsedNanos);
}
private long elapsedNanos() {
if (startNanos == null)
throw new IllegalStateException("This stop watch is not started!");
return nanoTime() - startNanos;
}
private static void fail(String message, long expectedNanos, long elapsedNanos) {
throw new MockitoAssertionError(format(message, NANOSECONDS.toMillis(expectedNanos), NANOSECONDS.toMillis(elapsedNanos)));
}
/**
* Waits for specific amount of millis using 'Thread.sleep()'.
* Rethrows InterruptedException.
*/
public void waitFor(int millis) {
try {
Thread.sleep(millis);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
}