From f97c52e0f670282cd3ae986a256e87d55dedff9b Mon Sep 17 00:00:00 2001 From: Artur Dryomov Date: Mon, 23 Nov 2020 20:49:12 +0300 Subject: [PATCH] Remove initialization state from the SNTP service --- .../com/lyft/kronos/internal/ntp/SntpService.kt | 5 ++--- .../lyft/kronos/internal/ntp/SntpServiceTest.kt | 15 +++++++++++++++ 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/kronos-java/src/main/java/com/lyft/kronos/internal/ntp/SntpService.kt b/kronos-java/src/main/java/com/lyft/kronos/internal/ntp/SntpService.kt index 6d6a9b7..e682ee8 100644 --- a/kronos-java/src/main/java/com/lyft/kronos/internal/ntp/SntpService.kt +++ b/kronos-java/src/main/java/com/lyft/kronos/internal/ntp/SntpService.kt @@ -69,14 +69,14 @@ internal class SntpServiceImpl @JvmOverloads constructor(private val sntpClient: private val cacheExpirationMs: Long = CACHE_EXPIRATION_MS, private val maxNtpResponseTimeMs: Long = MAX_NTP_RESPONSE_TIME_MS) : SntpService { - private val state = AtomicReference(State.INIT) + private val state = AtomicReference(State.IDLE) private val cachedSyncTime = AtomicLong(0) private val executor = Executors.newSingleThreadExecutor { Thread(it, "kronos-android") } private val response: SntpClient.Response? get() { val response = responseCache.get() - val isCachedFromPreviousBoot = state.compareAndSet(State.INIT, State.IDLE) && response != null && !response.isFromSameBoot + val isCachedFromPreviousBoot = state.get() == State.IDLE && response != null && !response.isFromSameBoot return if (isCachedFromPreviousBoot) { responseCache.clear() null @@ -89,7 +89,6 @@ internal class SntpServiceImpl @JvmOverloads constructor(private val sntpClient: get() = deviceClock.getElapsedTimeMs() - cachedSyncTime.get() private enum class State { - INIT, IDLE, SYNCING, STOPPED diff --git a/kronos-java/src/test/java/com/lyft/kronos/internal/ntp/SntpServiceTest.kt b/kronos-java/src/test/java/com/lyft/kronos/internal/ntp/SntpServiceTest.kt index 71ea7e9..5501dbd 100644 --- a/kronos-java/src/test/java/com/lyft/kronos/internal/ntp/SntpServiceTest.kt +++ b/kronos-java/src/test/java/com/lyft/kronos/internal/ntp/SntpServiceTest.kt @@ -94,4 +94,19 @@ class SntpServiceTest { verify(sntpSyncListener, times(1)).onError(eq("1.fake.pool.ntp.org"), any()) verify(sntpSyncListener, times(1)).onError(eq("2.fake.pool.ntp.org"), any()) } + + @Test + fun shouldClearCacheWhenSyncFailsAndGettingCurrentTime() { + whenever(sntpClient.requestTime("1.fake.pool.ntp.org", TIMEOUT_MS)).thenReturn(mockResponse) + whenever(sntpClient.requestTime("2.fake.pool.ntp.org", TIMEOUT_MS)).thenReturn(mockResponse) + whenever(mockResponse.currentTimeMs).thenReturn(-1) + whenever(mockResponse.isFromSameBoot).thenReturn(false) + whenever(responseCache.get()).thenReturn(mockResponse) + + assertThat(sntpService.sync()).isFalse + + sntpService.currentTime() + + verify(responseCache, times(1)).clear() + } }