diff options
Diffstat (limited to 'robolectric/src/test/java/org/robolectric/shadows/ShadowPausedSystemClockTest.java')
-rw-r--r-- | robolectric/src/test/java/org/robolectric/shadows/ShadowPausedSystemClockTest.java | 75 |
1 files changed, 72 insertions, 3 deletions
diff --git a/robolectric/src/test/java/org/robolectric/shadows/ShadowPausedSystemClockTest.java b/robolectric/src/test/java/org/robolectric/shadows/ShadowPausedSystemClockTest.java index b0261527d..7eaa98896 100644 --- a/robolectric/src/test/java/org/robolectric/shadows/ShadowPausedSystemClockTest.java +++ b/robolectric/src/test/java/org/robolectric/shadows/ShadowPausedSystemClockTest.java @@ -1,6 +1,5 @@ package org.robolectric.shadows; -import static android.os.Build.VERSION_CODES.JELLY_BEAN_MR1; import static android.os.Build.VERSION_CODES.P; import static android.os.Build.VERSION_CODES.Q; import static com.google.common.truth.Truth.assertThat; @@ -12,6 +11,7 @@ import static org.robolectric.annotation.LooperMode.Mode.PAUSED; import android.os.SystemClock; import androidx.test.ext.junit.runners.AndroidJUnit4; import java.time.DateTimeException; +import java.time.Duration; import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; @@ -32,6 +32,7 @@ public class ShadowPausedSystemClockTest { assertTrue(SystemClock.setCurrentTimeMillis(1000)); SystemClock.sleep(34); assertThat(SystemClock.uptimeMillis()).isEqualTo(1034); + assertThat(SystemClock.elapsedRealtime()).isEqualTo(1034); } @Test @@ -69,11 +70,58 @@ public class ShadowPausedSystemClockTest { } @Test + public void deepSleep_advancesOnlyRealtime() { + assertTrue(SystemClock.setCurrentTimeMillis(1000)); + + ShadowPausedSystemClock.deepSleep(34); + + assertThat(SystemClock.uptimeMillis()).isEqualTo(1000); + assertThat(SystemClock.elapsedRealtime()).isEqualTo(1034); + } + + @Test + public void deepSleep_notifiesListener() { + AtomicBoolean listenerCalled = new AtomicBoolean(); + ShadowPausedSystemClock.addListener(() -> listenerCalled.set(true)); + + ShadowPausedSystemClock.deepSleep(100); + + assertThat(listenerCalled.get()).isTrue(); + } + + @SuppressWarnings("FutureReturnValueIgnored") + @Test + public void deepSleep_concurrentAccess_doesNotCorruptData() throws Exception { + SystemClock.setCurrentTimeMillis(100); + ExecutorService executor = Executors.newFixedThreadPool(2); + try { + int numToExecute = 10000; + CountDownLatch latch = new CountDownLatch(numToExecute); + + for (int i = 0; i < numToExecute; i++) { + executor.submit( + () -> { + ShadowPausedSystemClock.deepSleep(100); + latch.countDown(); + }); + } + latch.await(); + + assertThat(SystemClock.uptimeMillis()).isEqualTo(100); + assertThat(SystemClock.elapsedRealtime()).isEqualTo(100 + numToExecute * 100); + } finally { + executor.shutdown(); + } + } + + @Test public void testSetCurrentTime() { assertTrue(SystemClock.setCurrentTimeMillis(1034)); + assertThat(SystemClock.elapsedRealtime()).isEqualTo(1034); assertThat(SystemClock.uptimeMillis()).isEqualTo(1034); assertThat(SystemClock.currentThreadTimeMillis()).isEqualTo(1034); assertFalse(SystemClock.setCurrentTimeMillis(1000)); + assertThat(SystemClock.elapsedRealtime()).isEqualTo(1034); assertThat(SystemClock.uptimeMillis()).isEqualTo(1034); } @@ -104,7 +152,7 @@ public class ShadowPausedSystemClockTest { latch.countDown(); }); latch.await(); - + assertThat(SystemClock.elapsedRealtime()).isEqualTo(300); assertThat(SystemClock.uptimeMillis()).isEqualTo(300); } finally { executor.shutdown(); @@ -112,13 +160,34 @@ public class ShadowPausedSystemClockTest { } @Test + public void advanceTimeBy_shouldAdvanceBothElapsedRealtimeAndUptimeMillis() { + SystemClock.setCurrentTimeMillis(1000); + + ShadowPausedSystemClock.advanceBy(Duration.ofMillis(100)); + + assertThat(SystemClock.uptimeMillis()).isEqualTo(1100); + assertThat(SystemClock.elapsedRealtime()).isEqualTo(1100); + assertThat(SystemClock.currentThreadTimeMillis()).isEqualTo(1100); + } + + @Test + public void simulateDeepSleep_shouldOnlyAdvanceElapsedRealtime() { + SystemClock.setCurrentTimeMillis(1000); + + ShadowPausedSystemClock.simulateDeepSleep(Duration.ofMillis(100)); + + assertThat(SystemClock.uptimeMillis()).isEqualTo(1000); + assertThat(SystemClock.currentThreadTimeMillis()).isEqualTo(1000); + assertThat(SystemClock.elapsedRealtime()).isEqualTo(1100); + } + + @Test public void testElapsedRealtime() { SystemClock.setCurrentTimeMillis(1000); assertThat(SystemClock.elapsedRealtime()).isEqualTo(1000); } @Test - @Config(minSdk = JELLY_BEAN_MR1) public void testElapsedRealtimeNanos() { SystemClock.setCurrentTimeMillis(1000); assertThat(SystemClock.elapsedRealtimeNanos()).isEqualTo(1000000000); |