package org.threadly.util; import static org.junit.Assert.*; import org.junit.AfterClass; import org.junit.Before; import org.junit.Test; import org.threadly.test.concurrent.TestCondition; import org.threadly.test.concurrent.TestUtils; @SuppressWarnings("javadoc") public class ClockTest { @AfterClass public static void cleanupClass() { Clock.startClockUpdateThread(); } @Before public void setup() { Clock.stopClockUpdateThread(); } @Test public void accurateTimeNanosTest() { long baseTime = System.nanoTime(); assertTrue(Clock.accurateTimeNanos() >= baseTime); } @Test public void lastKnownTimeNanosTest() { // verify clock is not updating long before = Clock.lastKnownTimeNanos(); TestUtils.blockTillClockAdvances(); // update clock long newTime = -1; assertTrue((newTime = Clock.accurateTimeNanos()) > before); // verify we get the new time again assertEquals(newTime, Clock.lastKnownTimeNanos()); } @Test public void startClockUpdateThreadTwiceTest() { Clock.startClockUpdateThread(); assertNotNull(Clock.clockUpdater); Runnable updater = Clock.clockUpdater; Clock.startClockUpdateThread(); // should point to the same reference assertTrue(updater == Clock.clockUpdater); } @Test public void lastKnownForwardProgressingMillisTest() { long timeSinceClockStartMillis = Clock.lastKnownForwardProgressingMillis(); assertTrue(timeSinceClockStartMillis >= 0); assertTrue(timeSinceClockStartMillis < 1000 * 60 * 15); // less than 15 min } @Test public void accurateForwardProgressingMillisTest() { final long timeSinceClockStartMillis = Clock.accurateForwardProgressingMillis(); assertTrue(timeSinceClockStartMillis >= 0); assertTrue(timeSinceClockStartMillis < 1000 * 60 * 15); // less than 15 min new TestCondition() { @Override public boolean get() { return Clock.accurateForwardProgressingMillis() > timeSinceClockStartMillis; } }.blockTillTrue(200); } @Test public void lastKnownForwardProgressingMillisAccurateTimeUpdateTest() { // verify clock is not updating long before = Clock.lastKnownForwardProgressingMillis(); TestUtils.blockTillClockAdvances(); // update clock long newTime = -1; assertTrue((newTime = Clock.accurateForwardProgressingMillis()) > before); // verify we get the new time again assertTrue(newTime == Clock.lastKnownForwardProgressingMillis()); } @Test public void automaticAlwaysProgressingUpdateTest() { Clock.startClockUpdateThread(); final long before = Clock.lastKnownForwardProgressingMillis(); new TestCondition(() -> Clock.lastKnownForwardProgressingMillis() > before).blockTillTrue(1000); } @Test public void accurateTimeMillisTest() { final long startTime = Clock.accurateTimeMillis(); new TestCondition(() -> Clock.accurateTimeMillis() > startTime).blockTillTrue(200); } @Test public void lastKnownTimeMillisTest() { // verify clock is not updating long before = Clock.lastKnownTimeMillis(); TestUtils.blockTillClockAdvances(); // update clock long newTime = -1; assertTrue((newTime = Clock.accurateTimeMillis()) > before); // verify we get the new time again assertEquals(newTime, Clock.lastKnownTimeMillis()); } @Test public void automaticUpdateTest() { final long before = Clock.lastKnownTimeMillis(); Clock.startClockUpdateThread(); new TestCondition(() -> Clock.lastKnownTimeMillis() > before).blockTillTrue(1000); } }