package com.workshare.msnos.soup.time; import static org.junit.Assert.assertEquals; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.reset; import static org.mockito.Mockito.verifyZeroInteractions; import static org.mockito.Mockito.when; import org.junit.Before; import org.junit.Test; import com.workshare.msnos.soup.time.NTPCachedTimeSource; import com.workshare.msnos.soup.time.NTPClient; public class NTPCachedTimeSourceTest { private NTPClient ntp; private NTPCachedTimeSource source; private Long millis = null; private Long nanos = null; @Before public void before() { ntp = mock(NTPClient.class); source = new NTPCachedTimeSource(ntp) { @Override protected long sysMillis() { return millis != null ? millis : super.sysMillis(); } @Override protected long sysNanos() { return nanos != null ? nanos : super.sysNanos(); } }; } @Test public void shouldReturnNTPTimeOnFirstTimeSuccess() throws Exception { when(ntp.getTime()).thenReturn(123L); assertEquals(123L, source.millis()); } @Test public void shouldReturnMillisOnFirstTimeFailure() throws Exception { fakeSysMillis(999L); when(ntp.getTime()).thenThrow(new RuntimeException("boom!")); assertEquals(999L, source.millis()); } @Test public void shouldNotCallNTPTimeAfterFirstTime() throws Exception { fakeSysNanos(1100); when(ntp.getTime()).thenReturn(1000L); assertEquals(1000L, source.millis()); reset(ntp); fakeSysNanos(1300); assertEquals(1200L, source.millis()); fakeSysNanos(1500); assertEquals(1400L, source.millis()); verifyZeroInteractions(ntp); } private void fakeSysMillis(final long millis) { this.millis = millis; } private void fakeSysNanos(final long millis) { this.nanos = toNanos(millis); } private Long toNanos(long millis) { return millis * 1000l * 1000l; } }