8000 refactor(server): do not leak cache in tests by krzema12 · Pull Request #1933 · typesafegithub/github-workflows-kt · GitHub
[go: up one dir, main page]

Skip to content

refactor(server): do not leak cache in tests #1933

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
May 1, 2025
Merged
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. 8000
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,16 +1,12 @@
package io.github.typesafegithub.workflows.jitbindingserver

import com.github.benmanes.caffeine.cache.Caffeine
import com.sksamuel.aedile.core.LoadingCache
import com.sksamuel.aedile.core.asLoadingCache
import com.sksamuel.aedile.core.refreshAfterWrite
import io.github.oshai.kotlinlogging.KotlinLogging.logger
import io.github.typesafegithub.workflows.actionbindinggenerator.domain.ActionCoords
import io.github.typesafegithub.workflows.actionbindinggenerator.domain.prettyPrint
import io.github.typesafegithub.workflows.mavenbinding.Artifact
import io.github.typesafegithub.workflows.mavenbinding.JarArtifact
import io.github.typesafegithub.workflows.mavenbinding.TextArtifact
import io.github.typesafegithub.workflows.mavenbinding.buildVersionArtifacts
import io.ktor.http.ContentType
import io.ktor.http.HttpStatusCode
import io.ktor.server.application.ApplicationCall
Expand All @@ -28,23 +24,13 @@ import io.micrometer.prometheusmetrics.PrometheusMeterRegistry
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlin.time.Duration.Companion.hours

private val logger = logger { }

typealias ArtifactResult = Result<Map<String, Artifact>?>

private val prefetchScope = CoroutineScope(Dispatchers.IO)

internal fun buildBindingsCache(
buildVersionArtifacts: (ActionCoords) -> Map<String, Artifact>? = ::buildVersionArtifacts,
): LoadingCache<ActionCoords, ArtifactResult> =
Caffeine
.newBuilder()
.refreshAfterWrite(1.hours)
.recordStats()
.asLoadingCache<ActionCoords, ArtifactResult> { runCatching { buildVersionArtifacts(it) } }

fun Routing.artifactRoutes(
bindingsCache: LoadingCache<ActionCoords, ArtifactResult>,
prometheusRegistry: PrometheusMeterRegistry? = null,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,15 @@
package io.github.typesafegithub.workflows.jitbindingserver

import com.github.benmanes.caffeine.cache.Caffeine
import com.sksamuel.aedile.core.LoadingCache
import com.sksamuel.aedile.core.asLoadingCache
import com.sksamuel.aedile.core.refreshAfterWrite
import io.github.oshai.kotlinlogging.KotlinLogging.logger
import io.github.typesafegithub.workflows.actionbindinggenerator.domain.ActionCoords
import io.github.typesafegithub.workflows.mavenbinding.Artifact
import io.github.typesafegithub.workflows.mavenbinding.buildVersionArtifacts
import io.ktor.http.HttpStatusCode
import io.ktor.server.application.Application
import io.ktor.server.application.ApplicationCall
import io.ktor.server.engine.embeddedServer
import io.ktor.server.netty.Netty
Expand All @@ -10,6 +18,7 @@ import io.ktor.server.routing.routing
import io.micrometer.prometheusmetrics.PrometheusConfig
import io.micrometer.prometheusmetrics.PrometheusMeterRegistry
import java.time.Duration
import kotlin.time.Duration.Companion.hours

private val prometheusRegistry =
PrometheusMeterRegistry(
Expand Down Expand Up @@ -38,19 +47,32 @@ fun main() {
Thread.setDefaultUncaughtExceptionHandler { thread, throwable ->
logger.error(throwable) { "Uncaught exception in thread $thread" }
}
val bindingsCache = buildBindingsCache()
embeddedServer(Netty, port = 8080) {
installPlugins(prometheusRegistry)
appModule(buildVersionArtifacts = ::buildVersionArtifacts)
}.start(wait = true)
}

routing {
internalRoutes(prometheusRegistry)
fun Application.appModule(buildVersionArtifacts: (ActionCoords) -> Map<String, Artifact>?) {
val bindingsCache = buildBindingsCache(buildVersionArtifacts)
installPlugins(prometheusRegistry)

artifactRoutes(bindingsCache, prometheusRegistry)
metadataRoutes(bindingsCache, prometheusRegistry)
}
}.start(wait = true)
routing {
internalRoutes(prometheusRegistry)

artifactRoutes(bindingsCache, prometheusRegistry)
metadataRoutes(bindingsCache, prometheusRegistry)
}
}

private fun buildBindingsCache(
buildVersionArtifacts: (ActionCoords) -> Map<String, Artifact>?,
): LoadingCache<Ac 10000 tionCoords, ArtifactResult> =
Caffeine
.newBuilder()
.refreshAfterWrite(1.hours)
.recordStats()
.asLoadingCache<ActionCoords, ArtifactResult> { runCatching { buildVersionArtifacts(it) } }

val deliverOnRefreshRoute = System.getenv("GWKT_DELIVER_ON_REFRESH").toBoolean()

suspend fun ApplicationCall.respondNotFound() = respondText(text = "Not found", status = HttpStatusCode.NotFound)
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@ import io.kotest.matchers.shouldBe
import io.ktor.client.request.get
import io.ktor.client.statement.bodyAsText
import io.ktor.http.HttpStatusCode
import io.ktor.server.routing.routing
import io.ktor.server.testing.testApplication

class ArtifactRoutesTest :
Expand All @@ -16,15 +15,11 @@ class ArtifactRoutesTest :
testApplication {
// Given
application {
routing {
artifactRoutes(
buildBindingsCache(
buildVersionArtifacts = {
mapOf("some-action-v4.pom" to TextArtifact { "Some POM contents" })
},
),
)
}
appModule(
buildVersionArtifacts = {
mapOf("some-action-v4.pom" to TextArtifact { "Some POM contents" })
},
)
}

// When
Expand All @@ -40,13 +35,9 @@ class ArtifactRoutesTest :
testApplication {
// Given
application {
routing {
artifactRoutes(
buildBindingsCache(
buildVersionArtifacts = { null },
),
)
}
appModule(
buildVersionArtifacts = { null },
)
}

// When
Expand All @@ -61,13 +52,9 @@ class ArtifactRoutesTest :
testApplication {
// Given
application {
routing {
artifactRoutes(
buildBindingsCache(
buildVersionArtifacts = { error("An internal error occurred!") },
),
)
}
appModule(
buildVersionArtifacts = { error("An internal error occurred!") },
)
}

// When
Expand Down
Loading
0