Ver código fonte

Write tests for Throttler

Signed-off-by: Álvaro Brey Vilas <alvaro.brey@nextcloud.com>

Write tests for Throttler

Signed-off-by: Álvaro Brey Vilas <alvaro.brey@nextcloud.com>
Álvaro Brey Vilas 3 anos atrás
pai
commit
11b6420446

+ 2 - 4
src/main/java/com/owncloud/android/utils/Throttler.kt

@@ -20,10 +20,8 @@
  */
 package com.owncloud.android.utils
 
-import android.util.ArrayMap
 import com.nextcloud.client.core.Clock
 
-// TODO write tests
 /**
  * Simple throttler that just discards new calls until interval has passed.
  *
@@ -36,7 +34,7 @@ class Throttler(private val clock: Clock) {
      */
     @Suppress("MagicNumber")
     var intervalMillis = 150L
-    private val timestamps: MutableMap<String, Long> = ArrayMap()
+    private val timestamps: MutableMap<String, Long> = mutableMapOf()
 
     @Synchronized
     fun run(key: String, runnable: Runnable) {
@@ -44,7 +42,7 @@ class Throttler(private val clock: Clock) {
         val lastCallTimestamp = timestamps[key] ?: 0
         if (time - lastCallTimestamp > intervalMillis) {
             runnable.run()
+            timestamps[key] = time
         }
-        timestamps[key] = time
     }
 }

+ 81 - 0
src/test/java/com/owncloud/android/utils/ThrottlerTest.kt

@@ -0,0 +1,81 @@
+package com.owncloud.android.utils
+
+import com.nextcloud.client.core.Clock
+import io.mockk.*
+import io.mockk.impl.annotations.MockK
+import org.junit.Before
+import org.junit.Test
+
+class ThrottlerTest {
+    companion object {
+        private const val KEY = "TEST"
+    }
+
+    @MockK
+    lateinit var runnable: Runnable
+
+    @MockK
+    lateinit var clock: Clock
+
+    @Before
+    fun setUp() {
+        MockKAnnotations.init(this, relaxed = true)
+        every { runnable.run() } just Runs
+    }
+
+    private fun runWithThrottler(throttler: Throttler) {
+        throttler.run(KEY, runnable)
+    }
+
+    @Test
+    fun unchangingTime_multipleCalls_calledExactlyOnce() {
+        // given
+        every { clock.currentTime } returns 300
+
+        val sut = Throttler(clock).apply {
+            intervalMillis = 150
+        }
+
+        // when
+        repeat(10) {
+            runWithThrottler(sut)
+        }
+
+        // then
+        verify(exactly = 1) { runnable.run() }
+    }
+
+    @Test
+    fun spacedCalls_noThrottle() {
+        // given
+        val sut = Throttler(clock).apply {
+            intervalMillis = 150
+        }
+        every { clock.currentTime } returnsMany listOf(200, 400, 600, 800)
+
+        // when
+        repeat(4) {
+            runWithThrottler(sut)
+        }
+
+        // then
+        verify(exactly = 4) { runnable.run() }
+    }
+
+    @Test
+    fun mixedIntervals_sometimesThrottled() {
+        // given
+        val sut = Throttler(clock).apply {
+            intervalMillis = 150
+        }
+        every { clock.currentTime } returnsMany listOf(200, 300, 400, 500)
+
+        // when
+        repeat(4) {
+            runWithThrottler(sut)
+        }
+
+        // then
+        verify(exactly = 2) { runnable.run() }
+    }
+}