package kotlinx.coroutines.android import kotlinx.coroutines.testing.* import android.os.* import kotlinx.coroutines.* import org.junit.* import org.junit.runner.* import org.robolectric.* import org.robolectric.annotation.* @RunWith(RobolectricTestRunner::class) @Config(manifest = Config.NONE, sdk = [28]) @LooperMode(LooperMode.Mode.LEGACY) class DisabledHandlerTest : TestBase() { private var delegateToSuper = false private val disabledDispatcher = object : Handler() { override fun sendMessageAtTime(msg: Message?, uptimeMillis: Long): Boolean { if (delegateToSuper) return super.sendMessageAtTime(msg, uptimeMillis) return false } }.asCoroutineDispatcher() @Test fun testRunBlocking() { expect(1) try { runBlocking(disabledDispatcher) { expectUnreached() } expectUnreached() } catch (e: CancellationException) { finish(2) } } @Test fun testInvokeOnCancellation() = runTest { val job = launch(disabledDispatcher, start = CoroutineStart.LAZY) { expectUnreached() } job.invokeOnCompletion { if (it != null) expect(2) } yield() expect(1) job.join() finish(3) } @Test fun testWithTimeout() = runTest { delegateToSuper = true try { withContext(disabledDispatcher) { expect(1) delegateToSuper = false delay(Long.MAX_VALUE - 1) expectUnreached() } expectUnreached() } catch (e: CancellationException) { finish(2) } } }