[Gradle] Try to adjust port finding logic to fix tests flakiness

This commit is contained in:
Alexander.Likhachev
2023-01-11 00:09:15 +01:00
committed by Space Team
parent bef34e9cbf
commit 5fd17fb233
@@ -15,6 +15,7 @@ import io.ktor.response.*
import io.ktor.routing.* import io.ktor.routing.*
import io.ktor.server.engine.* import io.ktor.server.engine.*
import io.ktor.server.netty.* import io.ktor.server.netty.*
import io.ktor.util.*
import io.ktor.util.collections.* import io.ktor.util.collections.*
import org.gradle.util.GradleVersion import org.gradle.util.GradleVersion
import org.jetbrains.kotlin.gradle.plugin.stat.* import org.jetbrains.kotlin.gradle.plugin.stat.*
@@ -23,6 +24,7 @@ import org.jetbrains.kotlin.gradle.testbase.*
import org.junit.jupiter.api.DisplayName import org.junit.jupiter.api.DisplayName
import java.io.IOException import java.io.IOException
import java.net.HttpURLConnection import java.net.HttpURLConnection
import java.net.InetSocketAddress
import java.net.ServerSocket import java.net.ServerSocket
import java.net.URL import java.net.URL
import java.util.* import java.util.*
@@ -35,9 +37,14 @@ import kotlin.test.*
class BuildStatisticsWithKtorIT : KGPBaseTest() { class BuildStatisticsWithKtorIT : KGPBaseTest() {
companion object { companion object {
private val portSelectLock = java.util.concurrent.locks.ReentrantLock()
fun runWithKtorService(action: (Int) -> Unit) { fun runWithKtorService(action: (Int) -> Unit) {
var server: ApplicationEngine? = null
try {
portSelectLock.lock()
val port = getEmptyPort().localPort val port = getEmptyPort().localPort
val server = embeddedServer(Netty, host = "localhost", port = port) server = embeddedServer(Netty, host = "localhost", port = port)
{ {
val requests = ArrayBlockingQueue<String>(10) val requests = ArrayBlockingQueue<String>(10)
@@ -64,8 +71,14 @@ class BuildStatisticsWithKtorIT : KGPBaseTest() {
} }
}.start() }.start()
awaitInitialization(port) awaitInitialization(port)
portSelectLock.unlock()
action(port) action(port)
server.stop(1000, 1000) } finally {
if (portSelectLock.isLocked) {
portSelectLock.unlock()
}
server?.stop(1000, 1000)
}
} }
private fun getEmptyPort(): ServerSocket { private fun getEmptyPort(): ServerSocket {
@@ -73,7 +86,9 @@ class BuildStatisticsWithKtorIT : KGPBaseTest() {
val endPort = 8180 val endPort = 8180
for (port in startPort..endPort) { for (port in startPort..endPort) {
try { try {
return ServerSocket(port).also { return ServerSocket().apply {
bind(InetSocketAddress("localhost", port))
}.also {
println("Use $port port") println("Use $port port")
it.close() it.close()
} }