package kotlinx.coroutines.selects import kotlinx.coroutines.testing.* import kotlinx.coroutines.* import kotlinx.coroutines.channels.* import kotlin.test.* class SelectChannelStressTest: TestBase() { // Running less iterations on native platforms because of some performance regression private val iterations = (if (isNative) 1_000 else 1_000_000) * stressTestMultiplier @Test fun testSelectSendResourceCleanupBufferedChannel() = runTest { val channel = Channel(1) expect(1) channel.send(-1) // fill the buffer, so all subsequent sends cannot proceed repeat(iterations) { i -> select { channel.onSend(i) { expectUnreached() } default { expect(i + 2) } } } finish(iterations + 2) } @Test fun testSelectReceiveResourceCleanupBufferedChannel() = runTest { val channel = Channel(1) expect(1) repeat(iterations) { i -> select { channel.onReceive { expectUnreached() } default { expect(i + 2) } } } finish(iterations + 2) } @Test fun testSelectSendResourceCleanupRendezvousChannel() = runTest { val channel = Channel(Channel.RENDEZVOUS) expect(1) repeat(iterations) { i -> select { channel.onSend(i) { expectUnreached() } default { expect(i + 2) } } } finish(iterations + 2) } @Test fun testSelectReceiveResourceRendezvousChannel() = runTest { val channel = Channel(Channel.RENDEZVOUS) expect(1) repeat(iterations) { i -> select { channel.onReceive { expectUnreached() } default { expect(i + 2) } } } finish(iterations + 2) } internal fun SelectBuilder.default(block: suspend () -> R) = onTimeout(0, block) }