blob: d26900fe64554d78c4ff3a54ad24bd46ca3ab0fd [file] [log] [blame]
Roman Elizarov331750b2017-02-15 17:59:17 +03001/*
Roman Elizarov1f74a2d2018-06-29 19:19:45 +03002 * Copyright 2016-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
Roman Elizarov331750b2017-02-15 17:59:17 +03003 */
4
5package kotlinx.coroutines.experimental.rx1
6
Roman Elizarov9fe5f462018-02-21 19:05:52 +03007import kotlinx.coroutines.experimental.*
8import org.junit.*
9import rx.*
10import kotlin.coroutines.experimental.*
Roman Elizarov331750b2017-02-15 17:59:17 +030011
12class ObservableBackpressureTest : TestBase() {
13 @Test
14 fun testCancelWhileBPSuspended() = runBlocking<Unit> {
15 expect(1)
Roman Elizarov43e3af72017-07-21 16:01:31 +030016 val observable = rxObservable(coroutineContext) {
Roman Elizarov331750b2017-02-15 17:59:17 +030017 expect(5)
18 send("A") // will not suspend, because an item was requested
19 expect(7)
20 send("B") // second requested item
21 expect(9)
22 try {
23 send("C") // will suspend (no more requested)
24 } finally {
Roman Elizaroved698542017-07-12 13:16:30 +030025 expect(13)
Roman Elizarov331750b2017-02-15 17:59:17 +030026 }
27 expectUnreached()
28 }
29 expect(2)
30 val sub = observable.subscribe(object : Subscriber<String>() {
31 override fun onStart() {
32 expect(3)
33 request(2) // request two items
34 }
35
36 override fun onNext(t: String) {
37 when (t) {
38 "A" -> expect(6)
39 "B" -> expect(8)
40 else -> error("Should not happen")
41 }
42 }
43
44 override fun onCompleted() {
Roman Elizaroved698542017-07-12 13:16:30 +030045 expect(11)
Roman Elizarov331750b2017-02-15 17:59:17 +030046 }
47
48 override fun onError(e: Throwable) {
49 expectUnreached()
50 }
51 })
52 expect(4)
53 yield() // yield to observable coroutine
54 expect(10)
Roman Elizaroved698542017-07-12 13:16:30 +030055 sub.unsubscribe() // now unsubscribe -- shall cancel coroutine & immediately signal onComplete
56 expect(12)
Roman Elizarov7a7b0092017-06-26 14:25:56 +030057 yield() // shall perform finally in coroutine & invoke onCompleted
Roman Elizarov331750b2017-02-15 17:59:17 +030058 finish(14)
59 }
60}