17
17
package io.rsocket.kotlin.core
18
18
19
19
import app.cash.turbine.*
20
+ import io.ktor.utils.io.core.*
20
21
import io.rsocket.kotlin.*
21
22
import io.rsocket.kotlin.logging.*
22
23
import io.rsocket.kotlin.payload.*
@@ -54,7 +55,7 @@ class ReconnectableRSocketTest : SuspendTest, TestWithLeakCheck {
54
55
val connect: suspend () -> RSocket = {
55
56
if (first.value) {
56
57
first.value = false
57
- rrHandler (firstJob)
58
+ handler (firstJob)
58
59
} else {
59
60
error(" Failed to connect" )
60
61
}
@@ -89,7 +90,7 @@ class ReconnectableRSocketTest : SuspendTest, TestWithLeakCheck {
89
90
first.value = false
90
91
error(" Failed to connect" )
91
92
} else {
92
- rrHandler (handlerJob)
93
+ handler (handlerJob)
93
94
}
94
95
}
95
96
val rSocket = ReconnectableRSocket (logger, connect) { cause, attempt ->
@@ -114,7 +115,7 @@ class ReconnectableRSocketTest : SuspendTest, TestWithLeakCheck {
114
115
error(" Failed to connect" )
115
116
} else {
116
117
delay(200 ) // emulate connection establishment
117
- rrHandler (Job ())
118
+ handler (Job ())
118
119
}
119
120
}
120
121
val rSocket = ReconnectableRSocket (logger, connect) { cause, attempt ->
@@ -137,13 +138,13 @@ class ReconnectableRSocketTest : SuspendTest, TestWithLeakCheck {
137
138
when {
138
139
first.value -> {
139
140
first.value = false
140
- rrHandler (firstJob) // first connection
141
+ handler (firstJob) // first connection
141
142
}
142
143
fails.value < 5 -> {
143
144
delay(100 )
144
145
error(" Failed to connect" )
145
146
}
146
- else -> rrHandler (Job ())
147
+ else -> handler (Job ())
147
148
}
148
149
}
149
150
val rSocket = ReconnectableRSocket (logger, connect) { cause, attempt ->
@@ -170,13 +171,13 @@ class ReconnectableRSocketTest : SuspendTest, TestWithLeakCheck {
170
171
when {
171
172
first.value -> {
172
173
first.value = false
173
- streamHandler (firstJob) // first connection
174
+ handler (firstJob) // first connection
174
175
}
175
176
fails.value < 5 -> {
176
177
delay(100 )
177
178
error(" Failed to connect" )
178
179
}
179
- else -> streamHandler (Job ())
180
+ else -> handler (Job ())
180
181
}
181
182
}
182
183
val rSocket = ReconnectableRSocket (logger, connect) { cause, attempt ->
@@ -206,8 +207,52 @@ class ReconnectableRSocketTest : SuspendTest, TestWithLeakCheck {
206
207
assertEquals(5 , fails.value)
207
208
}
208
209
209
- private fun rrHandler (job : Job ): RSocket = RSocketRequestHandler (job) { requestResponse { it } }
210
- private fun streamHandler (job : Job ): RSocket = RSocketRequestHandler (job) {
210
+ @Test
211
+ fun testNoLeakMetadataPush () = testNoLeaksInteraction { metadataPush(it.data) }
212
+
213
+ @Test
214
+ fun testNoLeakFireAndForget () = testNoLeaksInteraction { fireAndForget(it) }
215
+
216
+ @Test
217
+ fun testNoLeakRequestResponse () = testNoLeaksInteraction { requestResponse(it) }
218
+
219
+ @Test
220
+ fun testNoLeakRequestStream () = testNoLeaksInteraction { requestStream(it).collect() }
221
+
222
+ private inline fun testNoLeaksInteraction (crossinline interaction : suspend RSocket .(payload: Payload ) -> Unit ) = test {
223
+ val firstJob = Job ()
224
+ val connect: suspend () -> RSocket = {
225
+ if (first.compareAndSet(true , false )) {
226
+ handler(firstJob)
227
+ } else {
228
+ error(" Failed to connect" )
229
+ }
230
+ }
231
+ val rSocket = ReconnectableRSocket (logger, connect) { _, attempt ->
232
+ delay(100 )
233
+ attempt < 5
234
+ }
235
+
236
+ rSocket.requestResponse(Payload .Empty ) // first request to be sure, that connected
237
+ firstJob.cancelAndJoin() // cancel
238
+
239
+ val p = payload(" text" )
240
+ assertFails {
241
+ rSocket.interaction(p) // test release on reconnecting
242
+ }
243
+ assertTrue(p.data.isEmpty)
244
+
245
+ val p2 = payload(" text" )
246
+ assertFails {
247
+ rSocket.interaction(p2) // test release on failed
248
+ }
249
+ assertTrue(p2.data.isEmpty)
250
+ }
251
+
252
+ private fun handler (job : Job ): RSocket = RSocketRequestHandler (job) {
253
+ requestResponse { payload ->
254
+ payload
255
+ }
211
256
requestStream {
212
257
flow {
213
258
repeat(5 ) {
0 commit comments