Home | History | Annotate | Download | only in mockitoutil
      1 package org.mockitoutil;
      2 
      3 import static java.lang.String.format;
      4 import static java.lang.System.nanoTime;
      5 import static java.util.concurrent.TimeUnit.NANOSECONDS;
      6 
      7 import java.util.concurrent.TimeUnit;
      8 import org.mockito.exceptions.base.MockitoAssertionError;
      9 
     10 /**
     11  * This class can be uses as stopwatch to assert that a given time is elapsed or not.
     12  */
     13 public class Stopwatch {
     14 
     15     /**
     16      * The start time in nano seconds or <code>null</code> if this stop watch was not started yet
     17      */
     18     private Long startNanos = null;
     19 
     20     /**
     21      * To create an instance use {@link #createNotStarted()}
     22      */
     23     private Stopwatch() {
     24     }
     25 
     26     /**
     27      * Return a new and not started {@link Stopwatch}.
     28      */
     29     public static Stopwatch createNotStarted() {
     30         return new Stopwatch();
     31     }
     32 
     33     public void start() {
     34         if (startNanos != null)
     35             throw new IllegalStateException("This stop watch is already started!");
     36 
     37         startNanos = nanoTime();
     38     }
     39 
     40     public void assertElapsedTimeIsMoreThan(long expected, TimeUnit unit) {
     41         long elapsedNanos = elapsedNanos();
     42         long expectedNanos = unit.toNanos(expected);
     43 
     44         if (elapsedNanos <= expectedNanos)
     45             fail("Expected that more than %dms elapsed! But was: %dms", expectedNanos, elapsedNanos);
     46     }
     47 
     48     public void assertElapsedTimeIsLessThan(long expected, TimeUnit unit) {
     49         long elapsedNanos = elapsedNanos();
     50         long expectedNanos = unit.toNanos(expected);
     51 
     52         if (elapsedNanos >= expectedNanos)
     53             fail("Expected that less than %dms elapsed! But was: %dms", expectedNanos, elapsedNanos);
     54     }
     55 
     56     private long elapsedNanos() {
     57         if (startNanos == null)
     58             throw new IllegalStateException("This stop watch is not started!");
     59         return nanoTime() - startNanos;
     60     }
     61 
     62     private static void fail(String message, long expectedNanos, long elapsedNanos) {
     63         throw new MockitoAssertionError(format(message, NANOSECONDS.toMillis(expectedNanos), NANOSECONDS.toMillis(elapsedNanos)));
     64     }
     65 }
     66