2022-12-23 02:00:37 -08:00
|
|
|
package cash.z.wallet.sdk.sample.demoapp.ui.common
|
|
|
|
|
|
|
|
import androidx.test.filters.FlakyTest
|
|
|
|
import androidx.test.filters.SmallTest
|
|
|
|
import cash.z.ecc.android.sdk.demoapp.ui.common.throttle
|
|
|
|
import kotlinx.coroutines.ExperimentalCoroutinesApi
|
|
|
|
import kotlinx.coroutines.flow.asFlow
|
|
|
|
import kotlinx.coroutines.flow.flow
|
|
|
|
import kotlinx.coroutines.runBlocking
|
|
|
|
import kotlinx.coroutines.test.runTest
|
|
|
|
import org.junit.Test
|
|
|
|
import kotlin.test.assertTrue
|
|
|
|
import kotlin.time.Duration
|
|
|
|
import kotlin.time.Duration.Companion.seconds
|
|
|
|
import kotlin.time.ExperimentalTime
|
|
|
|
import kotlin.time.TimeMark
|
|
|
|
import kotlin.time.TimeSource
|
|
|
|
|
|
|
|
class FlowExtTest {
|
|
|
|
@OptIn(ExperimentalTime::class, ExperimentalCoroutinesApi::class)
|
|
|
|
@Test
|
|
|
|
@SmallTest
|
2024-01-04 12:21:32 -08:00
|
|
|
fun throttle_one_sec() =
|
|
|
|
runTest {
|
|
|
|
val timer = TimeSource.Monotonic.markNow()
|
|
|
|
val flow =
|
|
|
|
flow {
|
|
|
|
while (timer.elapsedNow() <= 5.seconds) {
|
|
|
|
emit(1)
|
|
|
|
}
|
|
|
|
}.throttle(1.seconds)
|
2022-12-23 02:00:37 -08:00
|
|
|
|
2024-01-04 12:21:32 -08:00
|
|
|
var timeMark: TimeMark? = null
|
|
|
|
flow.collect {
|
|
|
|
if (timeMark == null) {
|
|
|
|
timeMark = TimeSource.Monotonic.markNow()
|
|
|
|
} else {
|
|
|
|
assert(timeMark!!.elapsedNow() >= 1.seconds)
|
|
|
|
timeMark = TimeSource.Monotonic.markNow()
|
|
|
|
}
|
2022-12-23 02:00:37 -08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@OptIn(ExperimentalTime::class)
|
2024-01-04 12:21:32 -08:00
|
|
|
private fun raceConditionTest(duration: Duration): Boolean =
|
|
|
|
runBlocking {
|
|
|
|
val flow = (0..1000).asFlow().throttle(duration)
|
2022-12-23 02:00:37 -08:00
|
|
|
|
2024-01-04 12:21:32 -08:00
|
|
|
val values = mutableListOf<Int>()
|
|
|
|
flow.collect {
|
|
|
|
values.add(it)
|
|
|
|
}
|
2022-12-23 02:00:37 -08:00
|
|
|
|
2024-01-04 12:21:32 -08:00
|
|
|
return@runBlocking values.zipWithNext().all { it.first <= it.second }
|
|
|
|
}
|
2022-12-23 02:00:37 -08:00
|
|
|
|
|
|
|
@FlakyTest
|
|
|
|
@Test
|
2024-01-04 12:21:32 -08:00
|
|
|
fun stressTest() =
|
|
|
|
runBlocking {
|
|
|
|
for (i in 0..10) {
|
|
|
|
assertTrue { raceConditionTest(0.001.seconds) }
|
|
|
|
}
|
|
|
|
for (i in 0..10) {
|
|
|
|
assertTrue { raceConditionTest(0.0001.seconds) }
|
|
|
|
}
|
|
|
|
for (i in 0..10) {
|
|
|
|
assertTrue { raceConditionTest(0.00001.seconds) }
|
|
|
|
}
|
2022-12-23 02:00:37 -08:00
|
|
|
}
|
|
|
|
}
|