aboutsummaryrefslogtreecommitdiffstats
path: root/reactive/kotlinx-coroutines-reactive/test/PublisherSubscriptionSelectTest.kt
diff options
context:
space:
mode:
Diffstat (limited to 'reactive/kotlinx-coroutines-reactive/test/PublisherSubscriptionSelectTest.kt')
-rw-r--r--reactive/kotlinx-coroutines-reactive/test/PublisherSubscriptionSelectTest.kt61
1 files changed, 61 insertions, 0 deletions
diff --git a/reactive/kotlinx-coroutines-reactive/test/PublisherSubscriptionSelectTest.kt b/reactive/kotlinx-coroutines-reactive/test/PublisherSubscriptionSelectTest.kt
new file mode 100644
index 00000000..ef178477
--- /dev/null
+++ b/reactive/kotlinx-coroutines-reactive/test/PublisherSubscriptionSelectTest.kt
@@ -0,0 +1,61 @@
+/*
+ * Copyright 2016-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
+ */
+
+package kotlinx.coroutines.reactive
+
+import kotlinx.coroutines.*
+import kotlinx.coroutines.selects.*
+import org.junit.*
+import org.junit.Assert.*
+import org.junit.runner.*
+import org.junit.runners.*
+
+@RunWith(Parameterized::class)
+class PublisherSubscriptionSelectTest(private val request: Int) : TestBase() {
+ companion object {
+ @Parameterized.Parameters(name = "request = {0}")
+ @JvmStatic
+ fun params(): Collection<Array<Any>> = listOf(0, 1, 10).map { arrayOf<Any>(it) }
+ }
+
+ @Test
+ fun testSelect() = runTest {
+ // source with n ints
+ val n = 1000 * stressTestMultiplier
+ val source = publish { repeat(n) { send(it) } }
+ var a = 0
+ var b = 0
+ // open two subs
+ val channelA = source.openSubscription(request)
+ val channelB = source.openSubscription(request)
+ loop@ while (true) {
+ val done: Int = select {
+ channelA.onReceiveOrNull {
+ if (it != null) assertEquals(a++, it)
+ if (it == null) 0 else 1
+ }
+ channelB.onReceiveOrNull {
+ if (it != null) assertEquals(b++, it)
+ if (it == null) 0 else 2
+ }
+ }
+ when (done) {
+ 0 -> break@loop
+ 1 -> {
+ val r = channelB.receiveOrNull()
+ if (r != null) assertEquals(b++, r)
+ }
+ 2 -> {
+ val r = channelA.receiveOrNull()
+ if (r != null) assertEquals(a++, r)
+ }
+ }
+ }
+
+ channelA.cancel()
+ channelB.cancel()
+ // should receive one of them fully
+ assertTrue(a == n || b == n)
+ }
+} \ No newline at end of file