add websockets work
This commit is contained in:
core
api
ktor
client
src
commonMain
kotlin
com
insanusmokrassar
postssystem
core
common
src
commonMain
kotlin
com
insanusmokrassar
postssystem
core
ktor
ktor
client
common
server
build.gradlemaven.publish.gradlepublish.gradlepublish_config.kpsb
src
jvmMain
kotlin
com
insanusmokrassar
postssystem
ktor
tests
utils
common
build.gradlemaven.publish.gradlepublish.gradlepublish_config.json
src
commonMain
kotlin
com
insanusmokrassar
postssystem
repos
common
39
ktor/tests/build.gradle
Normal file
39
ktor/tests/build.gradle
Normal file
@ -0,0 +1,39 @@
|
||||
buildscript {
|
||||
repositories {
|
||||
mavenLocal()
|
||||
jcenter()
|
||||
mavenCentral()
|
||||
}
|
||||
|
||||
dependencies {
|
||||
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
|
||||
classpath "org.jetbrains.kotlin:kotlin-serialization:$kotlin_version"
|
||||
}
|
||||
}
|
||||
|
||||
plugins {
|
||||
id "org.jetbrains.kotlin.plugin.serialization" version "$kotlin_version"
|
||||
}
|
||||
|
||||
project.version = "$core_version"
|
||||
project.group = "com.insanusmokrassar"
|
||||
|
||||
apply plugin: "java-library"
|
||||
apply plugin: "kotlin"
|
||||
|
||||
repositories {
|
||||
mavenLocal()
|
||||
jcenter()
|
||||
mavenCentral()
|
||||
maven { url "https://kotlin.bintray.com/kotlinx" }
|
||||
}
|
||||
|
||||
dependencies {
|
||||
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
|
||||
|
||||
api projectByName("postssystem.ktor.client")
|
||||
api projectByName("postssystem.ktor.server")
|
||||
|
||||
testImplementation "org.jetbrains.kotlin:kotlin-test"
|
||||
testImplementation "org.jetbrains.kotlin:kotlin-test-junit"
|
||||
}
|
@ -0,0 +1,6 @@
|
||||
package com.insanusmokrassar.postssystem.ktor.tests
|
||||
|
||||
import kotlinx.coroutines.CoroutineScope
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
|
||||
val testsScope = CoroutineScope(Dispatchers.Default)
|
72
ktor/tests/src/test/kotlin/com/insanusmokrassar/postssystem/ktor/tests/WebsocketsTest.kt
Normal file
72
ktor/tests/src/test/kotlin/com/insanusmokrassar/postssystem/ktor/tests/WebsocketsTest.kt
Normal file
@ -0,0 +1,72 @@
|
||||
package com.insanusmokrassar.postssystem.ktor.tests
|
||||
|
||||
import com.insanusmokrassar.postssystem.ktor.client.createStandardWebsocketFlow
|
||||
import com.insanusmokrassar.postssystem.ktor.server.createKtorServer
|
||||
import com.insanusmokrassar.postssystem.ktor.server.includeWebsocketHandling
|
||||
import com.insanusmokrassar.postssystem.ktor.standardKtorSerializer
|
||||
import io.ktor.application.install
|
||||
import io.ktor.application.log
|
||||
import io.ktor.client.HttpClient
|
||||
import io.ktor.http.cio.websocket.pingPeriod
|
||||
import io.ktor.http.cio.websocket.timeout
|
||||
import io.ktor.routing.route
|
||||
import io.ktor.routing.routing
|
||||
import io.ktor.websocket.WebSockets
|
||||
import kotlinx.coroutines.*
|
||||
import kotlinx.coroutines.channels.Channel
|
||||
import kotlinx.coroutines.flow.*
|
||||
import kotlinx.serialization.builtins.serializer
|
||||
import org.junit.Test
|
||||
import java.time.Duration
|
||||
import kotlin.test.assertEquals
|
||||
import kotlin.test.assertNull
|
||||
|
||||
class WebsocketsTest {
|
||||
@Test
|
||||
fun testCommonWebsocketFunctionality() {
|
||||
val port = 60000
|
||||
val suburl = "test"
|
||||
val dataFlowChannel = Channel<Int>(Channel.UNLIMITED)
|
||||
val dataFlow = dataFlowChannel.consumeAsFlow()
|
||||
val serverUrl = "127.0.0.1:$port"
|
||||
val server = createKtorServer(host = "127.0.0.1", port = port) {
|
||||
install(WebSockets)
|
||||
routing {
|
||||
includeWebsocketHandling(suburl, dataFlow) {
|
||||
standardKtorSerializer.dump(Int.serializer(), it)
|
||||
}
|
||||
}
|
||||
}.also {
|
||||
it.start(false)
|
||||
}
|
||||
runBlocking {
|
||||
delay(100L)
|
||||
}
|
||||
val client = HttpClient {
|
||||
install(io.ktor.client.features.websocket.WebSockets)
|
||||
}
|
||||
val incomingWebsocketFlow = createStandardWebsocketFlow(
|
||||
client,
|
||||
"$serverUrl/$suburl"
|
||||
) {
|
||||
standardKtorSerializer.load(Int.serializer(), it)
|
||||
}
|
||||
|
||||
var currentlyCheckingData: Int? = null
|
||||
incomingWebsocketFlow.onEach {
|
||||
assertEquals(currentlyCheckingData, it)
|
||||
currentlyCheckingData = null
|
||||
}.launchIn(CoroutineScope(testsScope.coroutineContext + SupervisorJob()))
|
||||
runBlocking {
|
||||
(0 until 100).asFlow().collect {
|
||||
currentlyCheckingData = it
|
||||
dataFlowChannel.send(it)
|
||||
while (currentlyCheckingData != null) {
|
||||
delay(10L)
|
||||
}
|
||||
assertNull(currentlyCheckingData)
|
||||
}
|
||||
}
|
||||
server.stop(1000L, 1000L)
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user