add websockets work

This commit is contained in:
2020-08-10 23:38:27 +06:00
parent 9421edcb85
commit 61ccfe7948
33 changed files with 695 additions and 23 deletions

39
ktor/tests/build.gradle Normal file
View 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"
}

View File

@@ -0,0 +1,6 @@
package com.insanusmokrassar.postssystem.ktor.tests
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
val testsScope = CoroutineScope(Dispatchers.Default)

View 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)
}
}