mirror of
https://github.com/oxen-io/session-android.git
synced 2023-12-14 02:53:01 +01:00
60 lines
No EOL
1.6 KiB
Kotlin
60 lines
No EOL
1.6 KiB
Kotlin
package org.thoughtcrime.securesms
|
|
|
|
import androidx.annotation.VisibleForTesting
|
|
import androidx.lifecycle.LiveData
|
|
import androidx.lifecycle.Observer
|
|
import java.util.concurrent.CountDownLatch
|
|
import java.util.concurrent.TimeUnit
|
|
import java.util.concurrent.TimeoutException
|
|
|
|
/**
|
|
* Gets the value of a [LiveData] or waits for it to have one, with a timeout.
|
|
*
|
|
* Use this extension from host-side (JVM) tests. It's recommended to use it alongside
|
|
* `InstantTaskExecutorRule` or a similar mechanism to execute tasks synchronously.
|
|
*/
|
|
@VisibleForTesting(otherwise = VisibleForTesting.NONE)
|
|
fun <T> LiveData<T>.getOrAwaitValue(
|
|
time: Long = 2,
|
|
timeUnit: TimeUnit = TimeUnit.SECONDS,
|
|
afterObserve: () -> Unit = {}
|
|
): T {
|
|
var data: T? = null
|
|
val latch = CountDownLatch(1)
|
|
val observer = object : Observer<T> {
|
|
override fun onChanged(o: T) {
|
|
data = o
|
|
latch.countDown()
|
|
this@getOrAwaitValue.removeObserver(this)
|
|
}
|
|
}
|
|
this.observeForever(observer)
|
|
|
|
try {
|
|
afterObserve.invoke()
|
|
|
|
// Don't wait indefinitely if the LiveData is not set.
|
|
if (!latch.await(time, timeUnit)) {
|
|
throw TimeoutException("LiveData value was never set.")
|
|
}
|
|
|
|
} finally {
|
|
this.removeObserver(observer)
|
|
}
|
|
|
|
@Suppress("UNCHECKED_CAST")
|
|
return data as T
|
|
}
|
|
|
|
/**
|
|
* Observes a [LiveData] until the `block` is done executing.
|
|
*/
|
|
fun <T> LiveData<T>.observeForTesting(block: () -> Unit) {
|
|
val observer = Observer<T> { }
|
|
try {
|
|
observeForever(observer)
|
|
block()
|
|
} finally {
|
|
removeObserver(observer)
|
|
}
|
|
} |