From 5e88613240fb580e0e2542e3cc5f8757147c8364 Mon Sep 17 00:00:00 2001 From: Martin Ocenas Date: Wed, 8 Nov 2023 13:58:04 +0100 Subject: [PATCH] Refactor SSE test into HttpAdvancedIT --- .../quarkus/ts/http/advanced/SseResource.java | 23 +++---------- .../src/main/resources/application.properties | 2 ++ .../ts/http/advanced/BaseHttpAdvancedIT.java | 13 ++++++++ .../quarkus/ts/http/advanced/HttpSseIT.java | 32 ------------------- 4 files changed, 20 insertions(+), 50 deletions(-) delete mode 100644 http/http-advanced/src/test/java/io/quarkus/ts/http/advanced/HttpSseIT.java diff --git a/http/http-advanced/src/main/java/io/quarkus/ts/http/advanced/SseResource.java b/http/http-advanced/src/main/java/io/quarkus/ts/http/advanced/SseResource.java index d513b2860..79b327a45 100644 --- a/http/http-advanced/src/main/java/io/quarkus/ts/http/advanced/SseResource.java +++ b/http/http-advanced/src/main/java/io/quarkus/ts/http/advanced/SseResource.java @@ -15,6 +15,8 @@ import jakarta.ws.rs.sse.SseEventSink; import jakarta.ws.rs.sse.SseEventSource; +import org.eclipse.microprofile.config.ConfigProvider; + @Path("/sse") public class SseResource { @Context @@ -35,6 +37,7 @@ public String sseClient() { private String consumeSse() { StringBuilder response = new StringBuilder(); + int port = ConfigProvider.getConfig().getValue("quarkus.http.port", Integer.class); /* * Client connects to itself (to server endpoint running on same app), @@ -42,7 +45,7 @@ private String consumeSse() { * Which cannot be done in test code itself. * This method acts just as a client */ - WebTarget target = ClientBuilder.newClient().target("http://localhost:" + getQuarkusPort() + "/api/sse/server"); + WebTarget target = ClientBuilder.newClient().target("http://localhost:" + port + "/api/sse/server"); SseEventSource updateSource = SseEventSource.target(target).build(); updateSource.register(ev -> { response.append("event: ").append(ev.getName()).append(" ").append(ev.readData()); @@ -54,31 +57,15 @@ private String consumeSse() { }); updateSource.open(); - LockSupport.parkNanos(2_000_000_000L); + LockSupport.parkNanos(1_000_000_000L); return response.toString(); } - /** - * Test runner assigns random ports, on which the app should run. - * Parse this port from the CLI and return it. - * If no parameter is specified, return the default (8080) - * - * @return port on which the application is running - */ - private int getQuarkusPort() { - String value = System.getProperty("quarkus.http.port"); - if (value == null || value.isEmpty()) { - return 8080; - } - return Integer.parseInt(value); - } - @GET @Path("/server") @Produces(MediaType.SERVER_SENT_EVENTS) public void sendSseEvents(@Context SseEventSink eventSink) { eventSink.send(createEvent("test234", "test")); - LockSupport.parkNanos(1_000_000_000L); } private OutboundSseEvent createEvent(String name, String data) { diff --git a/http/http-advanced/src/main/resources/application.properties b/http/http-advanced/src/main/resources/application.properties index 904607fef..8c2859709 100644 --- a/http/http-advanced/src/main/resources/application.properties +++ b/http/http-advanced/src/main/resources/application.properties @@ -45,6 +45,8 @@ quarkus.keycloak.policy-enforcer.paths.version.enforcement-mode=DISABLED # Application endpoints quarkus.keycloak.policy-enforcer.paths.hello.path=/api/hello/* quarkus.keycloak.policy-enforcer.paths.hello.enforcement-mode=DISABLED +quarkus.keycloak.policy-enforcer.paths.sse.path=/api/sse/* +quarkus.keycloak.policy-enforcer.paths.sse.enforcement-mode=DISABLED quarkus.keycloak.policy-enforcer.paths.details.path=/api/details/* quarkus.keycloak.policy-enforcer.paths.details.enforcement-mode=DISABLED quarkus.keycloak.policy-enforcer.paths.grpc.path=/api/grpc/* diff --git a/http/http-advanced/src/test/java/io/quarkus/ts/http/advanced/BaseHttpAdvancedIT.java b/http/http-advanced/src/test/java/io/quarkus/ts/http/advanced/BaseHttpAdvancedIT.java index 0f943a88d..994232eba 100644 --- a/http/http-advanced/src/test/java/io/quarkus/ts/http/advanced/BaseHttpAdvancedIT.java +++ b/http/http-advanced/src/test/java/io/quarkus/ts/http/advanced/BaseHttpAdvancedIT.java @@ -8,6 +8,8 @@ import static org.hamcrest.Matchers.in; import static org.hamcrest.Matchers.is; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; import static org.junit.jupiter.api.Assertions.fail; import java.net.URISyntaxException; @@ -60,6 +62,7 @@ public abstract class BaseHttpAdvancedIT { private static final String PASSWORD = "password"; private static final String KEY_STORE_PATH = "META-INF/resources/server.keystore"; private static final int ASSERT_TIMEOUT_SECONDS = 10; + private static final String SSE_ERROR_MESSAGE = "java.lang.ClassNotFoundException: Provider for jakarta.ws.rs.sse.SseEventSource.Builder cannot be found"; protected abstract RestService getApp(); @@ -242,6 +245,16 @@ public void keepRequestScopeValuesAfterEventPropagation() { "Unexpected requestScope custom context value"); } + @Test + @Tag("https://github.com/quarkusio/quarkus/issues/36402") + public void sseConnectionTest() { + String response = getApp().given().get("/api/sse/client").thenReturn().body().asString(); + + assertFalse(response.contains(SSE_ERROR_MESSAGE), + "SSE failed, https://github.com/quarkusio/quarkus/issues/36402 not fixed"); + assertTrue(response.contains("event: test234 test"), "SSE failed, unknown bug. Response: " + response); + } + protected Protocol getProtocol() { return Protocol.HTTPS; } diff --git a/http/http-advanced/src/test/java/io/quarkus/ts/http/advanced/HttpSseIT.java b/http/http-advanced/src/test/java/io/quarkus/ts/http/advanced/HttpSseIT.java deleted file mode 100644 index 7924a3f3d..000000000 --- a/http/http-advanced/src/test/java/io/quarkus/ts/http/advanced/HttpSseIT.java +++ /dev/null @@ -1,32 +0,0 @@ -package io.quarkus.ts.http.advanced; - -import io.quarkus.test.bootstrap.RestService; -import io.quarkus.test.scenarios.QuarkusScenario; -import io.quarkus.test.services.QuarkusApplication; -import org.junit.jupiter.api.Tag; -import org.junit.jupiter.api.Test; - -import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertTrue; - -@QuarkusScenario -@Tag("https://github.com/quarkusio/quarkus/issues/36402") -// this test should only fail on native -public class HttpSseIT { - - @QuarkusApplication - static RestService app = new RestService() - .withProperty("quarkus.oidc.enabled", "false") - .withProperty("quarkus.keycloak.policy-enforcer.enable", "false") - .withProperty("quarkus.keycloak.devservices.enabled", "false"); - private static final String SSE_ERROR_MESSAGE = "java.lang.ClassNotFoundException: Provider for jakarta.ws.rs.sse.SseEventSource.Builder cannot be found"; - - @Test - public void testWorkingSse() { - String response = app.given().when().get("/api/sse/client").thenReturn().body().asString(); - - assertFalse(response.contains(SSE_ERROR_MESSAGE), - "SSE failed, https://github.com/quarkusio/quarkus/issues/36402 not fixed"); - assertTrue(response.contains("event: test234 test"), "SSE failed, unknown bug. Response: " + response); - } -}