Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 13 additions & 0 deletions kotlin-sdk-test/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,11 @@ plugins {
}

kotlin {
jvm {
testRuns["test"].executionTask.configure {
useJUnitPlatform()
}
}
sourceSets {
commonTest {
dependencies {
Expand All @@ -12,5 +17,13 @@ kotlin {
implementation(libs.kotlinx.coroutines.test)
}
}
jvmTest {
dependencies {
implementation(kotlin("test-junit5"))
implementation(libs.kotlin.logging)
implementation(libs.ktor.server.cio)
implementation(libs.ktor.client.cio)
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -44,4 +44,4 @@ class InMemoryTransport : AbstractTransport() {

other._onMessage.invoke(message)
}
}
}

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,98 @@
package io.modelcontextprotocol.kotlin.sdk.integration.kotlin

import io.ktor.client.*
import io.ktor.client.engine.cio.*
import io.ktor.client.plugins.sse.*
import io.ktor.server.application.*
import io.ktor.server.engine.*
import io.ktor.server.routing.*
import io.modelcontextprotocol.kotlin.sdk.Implementation
import io.modelcontextprotocol.kotlin.sdk.ServerCapabilities
import io.modelcontextprotocol.kotlin.sdk.client.Client
import io.modelcontextprotocol.kotlin.sdk.client.SseClientTransport
import io.modelcontextprotocol.kotlin.sdk.integration.utils.Retry
import io.modelcontextprotocol.kotlin.sdk.server.Server
import io.modelcontextprotocol.kotlin.sdk.server.ServerOptions
import io.modelcontextprotocol.kotlin.sdk.server.mcp
import kotlinx.coroutines.runBlocking
import kotlinx.coroutines.withTimeout
import org.junit.jupiter.api.AfterEach
import org.junit.jupiter.api.BeforeEach
import kotlin.time.Duration.Companion.seconds
import io.ktor.server.cio.CIO as ServerCIO
import io.ktor.server.sse.SSE as ServerSSE

@Retry(times = 3)
abstract class KotlinTestBase {

protected val host = "localhost"
protected abstract val port: Int

protected lateinit var server: Server
protected lateinit var client: Client
protected lateinit var serverEngine: EmbeddedServer<*, *>

protected abstract fun configureServerCapabilities(): ServerCapabilities
protected abstract fun configureServer()

@BeforeEach
fun setUp() {
setupServer()
runBlocking {
setupClient()
}
}

protected suspend fun setupClient() {
val transport = SseClientTransport(HttpClient(CIO) {
install(SSE)
}, "http://$host:$port")
client = Client(
Implementation("test", "1.0"),
)
client.connect(transport)
}

protected fun setupServer() {
val capabilities = configureServerCapabilities()

server = Server(
Implementation(name = "test-server", version = "1.0"),
ServerOptions(capabilities = capabilities)
)

configureServer()

serverEngine = embeddedServer(ServerCIO, host = host, port = port) {
install(ServerSSE)
routing {
mcp { server }
}
}.start(wait = false)
}

@AfterEach
fun tearDown() {
// close client
if (::client.isInitialized) {
try {
runBlocking {
withTimeout(3.seconds) {
client.close()
}
}
} catch (e: Exception) {
println("Warning: Error during client close: ${e.message}")
}
}

// stop server
if (::serverEngine.isInitialized) {
try {
serverEngine.stop(500, 1000)
} catch (e: Exception) {
println("Warning: Error during server stop: ${e.message}")
}
}
}
}
Loading
Loading