HADOOP-14827. Allow StopWatch to accept a Timer parameter for tests. Contributed by Erik Krogen

This commit is contained in:
Jason Lowe 2017-09-06 16:04:30 -05:00
parent 704267cb49
commit dd814946f6
1 changed files with 14 additions and 3 deletions

View File

@ -25,11 +25,22 @@ import java.util.concurrent.TimeUnit;
* A simplified StopWatch implementation which can measure times in nanoseconds. * A simplified StopWatch implementation which can measure times in nanoseconds.
*/ */
public class StopWatch implements Closeable { public class StopWatch implements Closeable {
private final Timer timer;
private boolean isStarted; private boolean isStarted;
private long startNanos; private long startNanos;
private long currentElapsedNanos; private long currentElapsedNanos;
public StopWatch() { public StopWatch() {
this(new Timer());
}
/**
* Used for tests to be able to create a StopWatch which does not follow real
* time.
* @param timer The timer to base this StopWatch's timekeeping off of.
*/
public StopWatch(Timer timer) {
this.timer = timer;
} }
/** /**
@ -49,7 +60,7 @@ public class StopWatch implements Closeable {
throw new IllegalStateException("StopWatch is already running"); throw new IllegalStateException("StopWatch is already running");
} }
isStarted = true; isStarted = true;
startNanos = System.nanoTime(); startNanos = timer.monotonicNowNanos();
return this; return this;
} }
@ -61,7 +72,7 @@ public class StopWatch implements Closeable {
if (!isStarted) { if (!isStarted) {
throw new IllegalStateException("StopWatch is already stopped"); throw new IllegalStateException("StopWatch is already stopped");
} }
long now = System.nanoTime(); long now = timer.monotonicNowNanos();
isStarted = false; isStarted = false;
currentElapsedNanos += now - startNanos; currentElapsedNanos += now - startNanos;
return this; return this;
@ -90,7 +101,7 @@ public class StopWatch implements Closeable {
*/ */
public long now() { public long now() {
return isStarted ? return isStarted ?
System.nanoTime() - startNanos + currentElapsedNanos : timer.monotonicNowNanos() - startNanos + currentElapsedNanos :
currentElapsedNanos; currentElapsedNanos;
} }