feat: exponential backoff policy for webview reload

This commit is contained in:
Arnie via Claude
2026-06-12 12:25:51 +02:00
parent 57aa0ab57b
commit af5d4aa76a
3 changed files with 61 additions and 0 deletions
+3
View File
@@ -0,0 +1,3 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
</manifest>
@@ -0,0 +1,19 @@
package cz.c3c.webviewkiosk
class BackoffPolicy(
private val initialDelayMs: Long,
private val maxDelayMs: Long,
private val factor: Double = 2.0,
) {
private var nextMs = initialDelayMs
fun nextDelayMs(): Long {
val current = nextMs
nextMs = (nextMs * factor).toLong().coerceAtMost(maxDelayMs)
return current
}
fun reset() {
nextMs = initialDelayMs
}
}
@@ -0,0 +1,39 @@
package cz.c3c.webviewkiosk
import org.junit.Assert.assertEquals
import org.junit.Test
class BackoffPolicyTest {
@Test
fun firstDelayIsInitial() {
val b = BackoffPolicy(initialDelayMs = 2_000, maxDelayMs = 60_000)
assertEquals(2_000, b.nextDelayMs())
}
@Test
fun delayDoublesOnEachCall() {
val b = BackoffPolicy(initialDelayMs = 2_000, maxDelayMs = 60_000)
b.nextDelayMs()
assertEquals(4_000, b.nextDelayMs())
assertEquals(8_000, b.nextDelayMs())
}
@Test
fun delayCapsAtMax() {
val b = BackoffPolicy(initialDelayMs = 2_000, maxDelayMs = 5_000)
b.nextDelayMs() // 2000
b.nextDelayMs() // 4000
assertEquals(5_000, b.nextDelayMs())
assertEquals(5_000, b.nextDelayMs())
}
@Test
fun resetReturnsToInitial() {
val b = BackoffPolicy(initialDelayMs = 2_000, maxDelayMs = 60_000)
b.nextDelayMs()
b.nextDelayMs()
b.reset()
assertEquals(2_000, b.nextDelayMs())
}
}