From 682f590380bd84445b9b682fc1279200d1d92041 Mon Sep 17 00:00:00 2001 From: Christoph Pirkl Date: Wed, 15 Apr 2026 11:44:47 +0200 Subject: [PATCH] Fix sonar findings --- .vscode/settings.json | 4 +++ .../exasol/telemetry/HttpTransportTest.java | 9 ++++--- .../exasol/telemetry/TelemetryClientTest.java | 16 +++++++++-- .../com/exasol/telemetry/TrackingApiIT.java | 27 ++++++++++--------- 4 files changed, 37 insertions(+), 19 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index a9ab1d9..31ec45d 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -12,5 +12,9 @@ "vmArgs": [ "-Djava.util.logging.config.file=src/test/resources/logging.properties" ] +}, + "sonarlint.connectedMode.project": { + "connectionId": "exasol", + "projectKey": "com.exasol:telemetry-java" } } diff --git a/src/test/java/com/exasol/telemetry/HttpTransportTest.java b/src/test/java/com/exasol/telemetry/HttpTransportTest.java index a0536b3..bcf6550 100644 --- a/src/test/java/com/exasol/telemetry/HttpTransportTest.java +++ b/src/test/java/com/exasol/telemetry/HttpTransportTest.java @@ -1,7 +1,8 @@ package com.exasol.telemetry; import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.*; +import static org.hamcrest.Matchers.containsString; +import static org.hamcrest.Matchers.is; import static org.junit.jupiter.api.Assertions.assertThrows; import java.io.IOException; @@ -22,7 +23,7 @@ class HttpTransportTest { private static final String FEATURE = "projectTag.feature"; @Test - void sendsJsonPayloadToConfiguredClient() throws Exception { + void sendsJsonPayloadToConfiguredClient() throws IOException { final CapturingRequestSender requestSender = new CapturingRequestSender(202); final HttpTransport transport = new HttpTransport( TelemetryConfig.builder(PROJECT_TAG).endpoint(URI.create(DUMMY_ENDPOINT)).build(), @@ -38,7 +39,7 @@ void sendsJsonPayloadToConfiguredClient() throws Exception { } @Test - void rejectsNonSuccessStatusCodes() throws Exception { + void rejectsNonSuccessStatusCodes() { final HttpTransport transport = new HttpTransport( TelemetryConfig.builder(PROJECT_TAG).endpoint(URI.create(DUMMY_ENDPOINT)).build(), request -> new HttpTransport.Response(500, "server says no")); @@ -51,7 +52,7 @@ void rejectsNonSuccessStatusCodes() throws Exception { } @Test - void convertsInterruptedExceptionToIoException() throws Exception { + void convertsInterruptedExceptionToIoException() { final HttpTransport transport = new HttpTransport( TelemetryConfig.builder(PROJECT_TAG).endpoint(URI.create(DUMMY_ENDPOINT)).build(), request -> { diff --git a/src/test/java/com/exasol/telemetry/TelemetryClientTest.java b/src/test/java/com/exasol/telemetry/TelemetryClientTest.java index be0a076..199a8cb 100644 --- a/src/test/java/com/exasol/telemetry/TelemetryClientTest.java +++ b/src/test/java/com/exasol/telemetry/TelemetryClientTest.java @@ -2,6 +2,7 @@ import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.is; +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; import java.net.URI; import java.time.Duration; @@ -38,15 +39,26 @@ void ignoresBlankFeatureName() { } @Test - void ignoresTrackingAfterCloseAndCloseIsIdempotent() { + void ignoresTrackingAfterClose() { final TelemetryConfig config = TelemetryConfig.builder("project").endpoint(URI.create("https://example.com")) .environment(new MapEnvironment(Map.of(TelemetryConfig.DISABLED_ENV, "true"))) .build(); final TelemetryClient client = TelemetryClient.create(config); client.close(); + + assertDoesNotThrow(() -> client.track("feature")); + } + + @Test + void makesCloseIdempotent() { + final TelemetryConfig config = TelemetryConfig.builder("project").endpoint(URI.create("https://example.com")) + .environment(new MapEnvironment(Map.of(TelemetryConfig.DISABLED_ENV, "true"))) + .build(); + final TelemetryClient client = TelemetryClient.create(config); + client.close(); - client.track("feature"); + assertDoesNotThrow(client::close); } } diff --git a/src/test/java/com/exasol/telemetry/TrackingApiIT.java b/src/test/java/com/exasol/telemetry/TrackingApiIT.java index 0707df2..c6014be 100644 --- a/src/test/java/com/exasol/telemetry/TrackingApiIT.java +++ b/src/test/java/com/exasol/telemetry/TrackingApiIT.java @@ -10,13 +10,16 @@ import org.junit.jupiter.api.Test; class TrackingApiIT { + private static final String PROJECT_TAG = "shop-ui"; + private static final String FEATURE = "checkout-started"; + @Test void recordsTaggedFeatureUsageEvent() throws Exception { try (RecordingHttpServer server = RecordingHttpServer.createSuccessServer(); - TelemetryClient client = TelemetryClient.create(server.configBuilder("shop-ui") + TelemetryClient client = TelemetryClient.create(server.configBuilder(PROJECT_TAG) .retryTimeout(Duration.ofMillis(500)) .build())) { - client.track("checkout-started"); + client.track(FEATURE); final List requests = server.awaitRequests(1, Duration.ofSeconds(2)); assertThat(requests, hasSize(1)); @@ -30,10 +33,10 @@ void recordsTaggedFeatureUsageEvent() throws Exception { @Test void emitsPayloadAsValidJson() throws Exception { try (RecordingHttpServer server = RecordingHttpServer.createSuccessServer(); - TelemetryClient client = TelemetryClient.create(server.configBuilder("shop-ui") + TelemetryClient client = TelemetryClient.create(server.configBuilder(PROJECT_TAG) .retryTimeout(Duration.ofMillis(500)) .build())) { - client.track("checkout-started"); + client.track(FEATURE); final List requests = server.awaitRequests(1, Duration.ofSeconds(2)); assertThat(requests, hasSize(1)); @@ -44,11 +47,11 @@ void emitsPayloadAsValidJson() throws Exception { @Test void keepsCallerThreadOverheadLowForAcceptedTracking() throws Exception { try (RecordingHttpServer server = RecordingHttpServer.createDelayedSuccessServer(300); - TelemetryClient client = TelemetryClient.create(server.configBuilder("shop-ui") + TelemetryClient client = TelemetryClient.create(server.configBuilder(PROJECT_TAG) .retryTimeout(Duration.ofMillis(500)) .build())) { final long start = System.nanoTime(); - client.track("checkout-started"); + client.track(FEATURE); final long elapsedMillis = Duration.ofNanos(System.nanoTime() - start).toMillis(); assertThat("track should return before the delayed HTTP request completes", elapsedMillis, lessThan(150L)); @@ -59,18 +62,16 @@ void keepsCallerThreadOverheadLowForAcceptedTracking() throws Exception { @Test void makesDisabledTrackingNoOpWithoutTelemetryOverhead() throws Exception { try (RecordingHttpServer server = RecordingHttpServer.createSuccessServer()) { - final TelemetryConfig config = server.configBuilder("shop-ui") + final TelemetryConfig config = server.configBuilder(PROJECT_TAG) .environment(new MapEnvironment(Map.of(TelemetryConfig.DISABLED_ENV, "disabled"))) .build(); - final TelemetryClient client = new TelemetryClient(config, new FailingClock()); - try { - client.track("checkout-started"); + + try (TelemetryClient client = new TelemetryClient(config, new FailingClock())) { + client.track(FEATURE); assertThat(client.awaitStopped(Duration.ofMillis(10)), is(true)); assertThat(client.isRunning(), is(false)); assertThat(server.awaitRequests(1, Duration.ofMillis(150)), empty()); - } finally { - client.close(); } } } @@ -78,7 +79,7 @@ void makesDisabledTrackingNoOpWithoutTelemetryOverhead() throws Exception { @Test void ignoresInvalidFeatureNames() throws Exception { try (RecordingHttpServer server = RecordingHttpServer.createSuccessServer(); - TelemetryClient client = TelemetryClient.create(server.configBuilder("shop-ui").build())) { + TelemetryClient client = TelemetryClient.create(server.configBuilder(PROJECT_TAG).build())) { client.track(" "); Thread.sleep(150);