From 29bfbdf5bb5829359b8cd8d30e38dda8a214ad41 Mon Sep 17 00:00:00 2001 From: Daniel McCoy Stephenson Date: Sat, 7 Nov 2026 19:49:18 -0700 Subject: [PATCH] Pin the builder's messages and the version length boundary The builder's "is required" messages were never asserted, and nothing showed that a version of exactly MAX_TAG_LENGTH characters is accepted, or that surrounding whitespace is trimmed before it is counted and sent. installId already has a test like this; version now has its sibling. Co-Authored-By: Claude Opus 5.5 --- .../stephenson/trace/TraceClientTest.java | 41 +++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/src/test/java/software/stephenson/trace/TraceClientTest.java b/src/test/java/software/stephenson/trace/TraceClientTest.java index 967e31b..15f2545 100644 --- a/src/test/java/software/stephenson/trace/TraceClientTest.java +++ b/src/test/java/software/stephenson/trace/TraceClientTest.java @@ -335,6 +335,47 @@ void builder_rejectsAMissingOrOverlongVersion() { assertThrows(IllegalArgumentException.class, () -> TraceClient.builder("http://x", "MyPlugin", overlong.toString())); } + @Test + void builder_namesWhatIsMissingInItsMessage() { + // Act + IllegalArgumentException noBaseUrl = assertThrows(IllegalArgumentException.class, + () -> TraceClient.builder(" ", "MyPlugin", "1.2.3")); + IllegalArgumentException noApplication = assertThrows(IllegalArgumentException.class, + () -> TraceClient.builder("http://x", null, "1.2.3")); + IllegalArgumentException noVersion = assertThrows(IllegalArgumentException.class, + () -> TraceClient.builder("http://x", "MyPlugin", "")); + IllegalArgumentException allMissing = assertThrows(IllegalArgumentException.class, + () -> TraceClient.builder(null, null, null)); + + // Assert + assertEquals("baseUrl is required", noBaseUrl.getMessage()); + assertEquals("application is required", noApplication.getMessage()); + assertEquals("version is required", noVersion.getMessage()); + assertEquals("baseUrl is required", allMissing.getMessage(), "checked in argument order"); + } + + @Test + void builder_rejectsAnOverlongVersionAndAcceptsOneAtTheLimit() throws Exception { + // Arrange + StringBuilder max = new StringBuilder(); + for (int i = 0; i < TraceClient.MAX_TAG_LENGTH; i++) { + max.append('9'); + } + + // Act + IllegalArgumentException tooLong = assertThrows(IllegalArgumentException.class, + () -> TraceClient.builder(baseUrl(), "MyPlugin", max + "9")); + TraceClient client = TraceClient.builder(baseUrl(), "MyPlugin", " " + max + " ").key("k").build(); + client.report("startup"); + + // Assert + assertEquals("version is longer than " + TraceClient.MAX_TAG_LENGTH + " characters", tooLong.getMessage()); + assertTrue(arrived.await(5, TimeUnit.SECONDS), "a version at the limit is accepted"); + assertTrue(received.get(0).body.contains("\"version\":\"" + max + "\""), + "surrounding whitespace does not count and is not sent: " + received.get(0).body); + client.close(); + } + @Test void report_tagsACommandWithTheProgramVersionTrimmed() throws Exception { // Arrange