11package com.piasy.kmp.socketio.socketio
22
3+ import com.piasy.kmp.socketio.engineio.transports.WebSocket
34import com.piasy.kmp.xlog.Logging
45import java.io.BufferedReader
56import java.io.InputStreamReader
7+ import java.util.concurrent.CountDownLatch
68import java.util.concurrent.TimeUnit
9+ import kotlin.test.assertFalse
10+ import kotlin.test.assertTrue
711import kotlin.concurrent.thread
12+ import kotlin.test.Test
813import kotlin.test.AfterTest
914import kotlin.test.BeforeTest
15+ import kotlinx.coroutines.CompletableDeferred
16+ import kotlinx.coroutines.Dispatchers
17+ import kotlinx.coroutines.delay
18+ import kotlinx.coroutines.test.runTest
19+ import kotlinx.coroutines.withContext
20+ import kotlin.time.Duration.Companion.seconds
1021
11- class ConnectionTestJvm : ConnectionTest () {
22+ class ConnectionTestJvm {
1223 private var server: Process ? = null
1324 private var serverOutputThread: Thread ? = null
25+ private val serverReady = CountDownLatch (1 )
1426
1527 @BeforeTest
16- override fun startServer () {
28+ fun startServer () {
1729 Logging .info(TAG , " startServer" )
1830 val process = ProcessBuilder (" node" , " src/jvmTest/resources/socket-server.js" , " /" )
1931 .redirectErrorStream(true )
@@ -24,15 +36,20 @@ class ConnectionTestJvm : ConnectionTest() {
2436 while (true ) {
2537 val line = reader.readLine() ? : break
2638 Logging .info(TAG , " SERVER OUT: $line " )
39+ if (line.contains(" Socket.IO server listening on port 3000" )) {
40+ serverReady.countDown()
41+ }
2742 }
2843 }
2944 }
45+ check(serverReady.await(3 , TimeUnit .SECONDS )) { " Socket.IO test server did not start in 3s" }
3046 Logging .info(TAG , " startServer finish" )
3147 }
3248
3349 @AfterTest
34- override fun stopServer () {
50+ fun stopServer () {
3551 Logging .info(TAG , " stopServer" )
52+ serverReady.countDown()
3653 server?.let { process ->
3754 process.destroy()
3855 if (! process.waitFor(3 , TimeUnit .SECONDS )) {
@@ -46,4 +63,37 @@ class ConnectionTestJvm : ConnectionTest() {
4663 serverOutputThread = null
4764 Logging .info(TAG , " stopServer finish" )
4865 }
66+
67+ @Test
68+ fun shouldExposeConnectionState () = runTest(timeout = 10 .seconds) {
69+ withContext(Dispatchers .Default ) {
70+ delay(1000 )
71+ }
72+
73+ val isConnectedBeforeOpen = CompletableDeferred <Boolean >()
74+ val isConnectedWhenConnectedEvent = CompletableDeferred <Boolean >()
75+ val isConnectedWhenDisconnectedEvent = CompletableDeferred <Boolean >()
76+
77+ val opt = IO .Options ()
78+ opt.transports = listOf (WebSocket .NAME )
79+ IO .socket(" http://localhost:3000/" , opt) { socket ->
80+ isConnectedBeforeOpen.complete(socket.connected)
81+ socket.on(Socket .EVENT_CONNECT ) {
82+ isConnectedWhenConnectedEvent.complete(socket.connected)
83+ socket.close()
84+ }.on(Socket .EVENT_DISCONNECT ) {
85+ isConnectedWhenDisconnectedEvent.complete(socket.connected)
86+ }
87+
88+ socket.open()
89+ }
90+
91+ assertFalse(isConnectedBeforeOpen.await())
92+ assertTrue(isConnectedWhenConnectedEvent.await())
93+ assertFalse(isConnectedWhenDisconnectedEvent.await())
94+ }
95+
96+ companion object {
97+ private const val TAG = " ConnectionTestJvm"
98+ }
4999}
0 commit comments