diff --git a/projects/core/src/test/kotlin/dan200/computercraft/core/apis/http/HttpServer.kt b/projects/core/src/test/kotlin/dan200/computercraft/core/apis/http/HttpServer.kt index e7a44c2f7..8c45dbc69 100644 --- a/projects/core/src/test/kotlin/dan200/computercraft/core/apis/http/HttpServer.kt +++ b/projects/core/src/test/kotlin/dan200/computercraft/core/apis/http/HttpServer.kt @@ -17,17 +17,14 @@ import io.netty.handler.codec.http.websocketx.WebSocketFrame import io.netty.handler.codec.http.websocketx.WebSocketServerProtocolHandler import io.netty.handler.codec.http.websocketx.WebSocketServerProtocolHandler.HandshakeComplete import io.netty.handler.codec.http.websocketx.extensions.compression.WebSocketServerCompressionHandler +import java.net.InetSocketAddress import java.nio.charset.StandardCharsets /** * Runs a small HTTP server to run alongside [TestHttpApi] */ object HttpServer { - const val PORT: Int = 8378 - const val URL: String = "http://127.0.0.1:$PORT" - const val WS_URL: String = "ws://127.0.0.1:$PORT/ws" - - fun runServer(run: (stop: () -> Unit) -> Unit) { + fun runServer(run: (port: Int, stop: () -> Unit) -> Unit) { val workerGroup: EventLoopGroup = NioEventLoopGroup(2) try { val ch = ServerBootstrap() @@ -46,14 +43,15 @@ object HttpServer { p.addLast(WebSocketFrameHandler()) } }, - ).bind(PORT).sync().channel() + ).bind(0).sync().channel() + val port = (ch.localAddress() as InetSocketAddress).port try { - run { workerGroup.shutdownGracefully() } + run(port) { workerGroup.shutdownGracefully() } } finally { ch.close().sync() } } finally { - workerGroup.shutdownGracefully() + workerGroup.shutdownGracefully().get() } } } @@ -70,7 +68,7 @@ private class HttpServerHandler : SimpleChannelInboundHandler() ctx.flush() } - public override fun channelRead0(ctx: ChannelHandlerContext, request: FullHttpRequest) { + override fun channelRead0(ctx: ChannelHandlerContext, request: FullHttpRequest) { when (request.uri()) { "/", "/index.html" -> handleIndex(ctx, request) "/ws" -> handleWebsocket(ctx, request) diff --git a/projects/core/src/test/kotlin/dan200/computercraft/core/apis/http/TestHttpApi.kt b/projects/core/src/test/kotlin/dan200/computercraft/core/apis/http/TestHttpApi.kt index d47d67f44..88e485b6c 100644 --- a/projects/core/src/test/kotlin/dan200/computercraft/core/apis/http/TestHttpApi.kt +++ b/projects/core/src/test/kotlin/dan200/computercraft/core/apis/http/TestHttpApi.kt @@ -11,8 +11,6 @@ import dan200.computercraft.api.lua.ObjectArguments import dan200.computercraft.core.CoreConfig import dan200.computercraft.core.apis.HTTPAPI import dan200.computercraft.core.apis.handles.ReadHandle -import dan200.computercraft.core.apis.http.HttpServer.URL -import dan200.computercraft.core.apis.http.HttpServer.WS_URL import dan200.computercraft.core.apis.http.HttpServer.runServer import dan200.computercraft.core.apis.http.options.Action import dan200.computercraft.core.apis.http.options.AddressRule @@ -50,13 +48,14 @@ class TestHttpApi { @Test fun `Connects to a HTTP server`() { - runServer { + runServer { port, _ -> LuaTaskRunner.runTest { + val url = "http://127.0.0.1:$port" val httpApi = addApi(HTTPAPI(environment)) - assertThat("http.request succeeded", httpApi.request(ObjectArguments(URL)), array(equalTo(true))) + assertThat("http.request succeeded", httpApi.request(ObjectArguments(url)), array(equalTo(true))) val result = pullEvent("http_success") - assertThat(result, array(equalTo("http_success"), equalTo(URL), isA(HttpResponseHandle::class.java))) + assertThat(result, array(equalTo("http_success"), equalTo(url), isA(HttpResponseHandle::class.java))) val handle = result[2] as HttpResponseHandle val reader = handle.extra.iterator().next() as ReadHandle @@ -67,13 +66,14 @@ class TestHttpApi { @Test fun `Connects to websocket`() { - runServer { + runServer { port, _ -> LuaTaskRunner.runTest { + val url = "ws://127.0.0.1:$port/ws" val httpApi = addApi(HTTPAPI(environment)) - assertThat("http.websocket succeeded", httpApi.websocket(ObjectArguments(WS_URL)), array(equalTo(true))) + assertThat("http.websocket succeeded", httpApi.websocket(ObjectArguments(url)), array(equalTo(true))) val connectEvent = pullEvent() - assertThat(connectEvent, array(equalTo("websocket_success"), equalTo(WS_URL), isA(WebsocketHandle::class.java))) + assertThat(connectEvent, array(equalTo("websocket_success"), equalTo(url), isA(WebsocketHandle::class.java))) val websocket = connectEvent[2] as WebsocketHandle websocket.send(Coerced(LuaValues.encode("Hello")), Optional.of(false)) @@ -91,13 +91,14 @@ class TestHttpApi { @Test fun `Errors if too many websocket messages are sent`() { - runServer { + runServer { port, _ -> LuaTaskRunner.runTest { + val url = "ws://127.0.0.1:$port/ws" val httpApi = addApi(HTTPAPI(environment)) - assertThat("http.websocket succeeded", httpApi.websocket(ObjectArguments(WS_URL)), array(equalTo(true))) + assertThat("http.websocket succeeded", httpApi.websocket(ObjectArguments(url)), array(equalTo(true))) val connectEvent = pullEvent() - assertThat(connectEvent, array(equalTo("websocket_success"), equalTo(WS_URL), isA(WebsocketHandle::class.java))) + assertThat(connectEvent, array(equalTo("websocket_success"), equalTo(url), isA(WebsocketHandle::class.java))) val websocket = connectEvent[2] as WebsocketHandle val error = assertThrows { @@ -115,13 +116,14 @@ class TestHttpApi { @Test fun `Queues an event when the socket is externally closed`() { - runServer { stop -> + runServer { port, stop -> LuaTaskRunner.runTest { + val url = "ws://127.0.0.1:$port/ws" val httpApi = addApi(HTTPAPI(environment)) - assertThat("http.websocket succeeded", httpApi.websocket(ObjectArguments(WS_URL)), array(equalTo(true))) + assertThat("http.websocket succeeded", httpApi.websocket(ObjectArguments(url)), array(equalTo(true))) val connectEvent = pullEvent() - assertThat(connectEvent, array(equalTo("websocket_success"), equalTo(WS_URL), isA(WebsocketHandle::class.java))) + assertThat(connectEvent, array(equalTo("websocket_success"), equalTo(url), isA(WebsocketHandle::class.java))) val websocket = connectEvent[2] as WebsocketHandle @@ -131,7 +133,7 @@ class TestHttpApi { assertThat( "Websocket was closed", closeEvent, - array(equalTo("websocket_closed"), equalTo(WS_URL), equalTo("Connection closed"), equalTo(null)), + array(equalTo("websocket_closed"), equalTo(url), equalTo("Connection closed"), equalTo(null)), ) assertThrows("Throws an exception when sending") {