blob: 16b423a3a761b53c3434441d302b1e2afdeb5f98 [file] [log] [blame]
/*=========================================================================
* Copyright (c) 2002-2014 Pivotal Software, Inc. All Rights Reserved.
* This product is protected by U.S. and international copyright
* and intellectual property laws. Pivotal products are covered by
* more patents listed at http://www.pivotal.io/patents.
*========================================================================
*/
package com.gemstone.gemfire.internal;
import static org.junit.Assert.*;
import org.junit.Test;
import org.junit.experimental.categories.Category;
import com.gemstone.gemfire.internal.util.StopWatch;
import com.gemstone.gemfire.test.junit.categories.UnitTest;
/**
* Unit tests for NanoTimer. This is in addition to NanoTimer2JUnitTest which is
* an older a JUnit test case for NanoTimer.
*
* @author Kirk Lund
* @since 7.0
* @see NanoTimer2JUnitTest
*/
@Category(UnitTest.class)
public class NanoTimerJUnitTest {
@Test
public void testGetTimeIsPositive() {
long lastTime = 0;
for (int i = 0; i < 1000; i++) {
final long time = NanoTimer.getTime();
assertTrue(time >= 0);
assertTrue(time >= lastTime);
lastTime = time;
}
}
@Test
public void testGetTimeIncreases() {
final long startNanos = NanoTimer.getTime();
final long startMillis = System.currentTimeMillis();
waitMillis(10);
final long endMillis = System.currentTimeMillis();
final long endNanos = NanoTimer.getTime();
long elapsedMillis = endMillis - startMillis;
long elapsedNanos = endNanos - startNanos;
assertTrue(elapsedMillis > 10);
assertTrue(endNanos > NanoTimer.NANOS_PER_MILLISECOND * 10);
assertTrue(elapsedNanos * NanoTimer.NANOS_PER_MILLISECOND >= elapsedMillis);
}
@Test
public void testInitialTimes() {
final long nanoTime = NanoTimer.getTime();
final NanoTimer timer = new NanoTimer();
assertEquals(timer.getConstructionTime(), timer.getLastResetTime());
assertTrue(timer.getTimeSinceConstruction() <= timer.getTimeSinceReset());
assertTrue(timer.getLastResetTime() >= nanoTime);
assertTrue(timer.getConstructionTime() >= nanoTime);
assertTrue(NanoTimer.getTime() >= nanoTime);
final long nanosOne = NanoTimer.getTime();
waitMillis(10);
assertTrue(timer.getTimeSinceConstruction() > NanoTimer.NANOS_PER_MILLISECOND * 10);
assertTrue(timer.getTimeSinceConstruction() <= NanoTimer.getTime());
final long nanosTwo = NanoTimer.getTime();
assertTrue(timer.getTimeSinceConstruction() >= nanosTwo - nanosOne);
}
@Test
public void testReset() {
final NanoTimer timer = new NanoTimer();
final long nanosOne = NanoTimer.getTime();
waitMillis(10);
assertEquals(timer.getConstructionTime(), timer.getLastResetTime());
assertTrue(timer.getTimeSinceConstruction() <= timer.getTimeSinceReset());
final long nanosTwo = NanoTimer.getTime();
final long resetOne = timer.reset();
assertTrue(resetOne >= nanosTwo - nanosOne);
assertFalse(timer.getConstructionTime() == timer.getLastResetTime());
final long nanosThree = NanoTimer.getTime();
waitMillis(10);
assertTrue(timer.getLastResetTime() >= nanosTwo);
assertTrue(timer.getTimeSinceReset() < timer.getTimeSinceConstruction());
assertTrue(timer.getLastResetTime() <= nanosThree);
assertTrue(timer.getTimeSinceReset() < NanoTimer.getTime());
assertTrue(timer.getTimeSinceReset() <= NanoTimer.getTime() - timer.getLastResetTime());
final long nanosFour = NanoTimer.getTime();
final long resetTwo = timer.reset();
assertTrue(resetTwo >= nanosFour - nanosThree);
waitMillis(10);
assertTrue(timer.getLastResetTime() >= nanosFour);
assertTrue(timer.getTimeSinceReset() < timer.getTimeSinceConstruction());
assertTrue(timer.getLastResetTime() <= NanoTimer.getTime());
assertTrue(timer.getTimeSinceReset() <= NanoTimer.getTime() - timer.getLastResetTime());
}
/**
* Waits for the specified milliseconds to pass as measured by
* {@link java.lang.System#currentTimeMillis()}.
*/
private void waitMillis(final long millis) {
long began = System.currentTimeMillis();
boolean done = false;
try {
for (StopWatch time = new StopWatch(true); !done && time.elapsedTimeMillis() < millis; done = (System.currentTimeMillis() - began > millis)) {
Thread.sleep(1000);
}
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
assertTrue("waiting " + millis + " millis", done);
}
}