diff --git a/components/fetch-build-scan-data-cmdline-tool/src/main/java/com/gradle/enterprise/model/NumberedBuildScan.java b/components/fetch-build-scan-data-cmdline-tool/src/main/java/com/gradle/enterprise/model/NumberedBuildScan.java index 090bb566..74b4ac7a 100644 --- a/components/fetch-build-scan-data-cmdline-tool/src/main/java/com/gradle/enterprise/model/NumberedBuildScan.java +++ b/components/fetch-build-scan-data-cmdline-tool/src/main/java/com/gradle/enterprise/model/NumberedBuildScan.java @@ -65,10 +65,10 @@ private static URL extractBaseUrl(URL buildScanUrl) { private static String extractBuildScanId(URL buildScanUrl) { String[] pathSegments = buildScanUrl.getPath().split("/"); - if (pathSegments.length == 0) { + if (pathSegments.length <= 2 || !pathSegments[1].equals("s")) { throw new IllegalArgumentException("Invalid Build Scan URL: " + buildScanUrl); } - return pathSegments[pathSegments.length - 1]; + return pathSegments[2]; } private static URL toURL(String url) { diff --git a/components/fetch-build-scan-data-cmdline-tool/src/test/java/com/gradle/enterprise/model/NumberedBuildScanTests.java b/components/fetch-build-scan-data-cmdline-tool/src/test/java/com/gradle/enterprise/model/NumberedBuildScanTests.java new file mode 100644 index 00000000..fb5404d0 --- /dev/null +++ b/components/fetch-build-scan-data-cmdline-tool/src/test/java/com/gradle/enterprise/model/NumberedBuildScanTests.java @@ -0,0 +1,42 @@ +package com.gradle.enterprise.model; + +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; + +import java.net.URL; + +import static org.junit.jupiter.api.Assertions.assertAll; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; + +class NumberedBuildScanTests { + + @ParameterizedTest + @ValueSource(strings = { + "https://ge.example.com/s/7slcdesxr2xnw", + "https://ge.example.com/s/7slcdesxr2xnw/", + "https://ge.example.com/s/7slcdesxr2xnw/timeline", + "https://ge.example.com/s/7slcdesxr2xnw/console-log?page=1", + "https://ge.example.com/s/7slcdesxr2xnw/projects#:foo-service" + }) + void validBuildScanUrlsAreCorrectlyParsed(String buildScanUrl) { + final NumberedBuildScan numberedBuildScan = NumberedBuildScan.parse("0," + buildScanUrl); + assertAll( + () -> assertEquals(new URL("https://ge.example.com"), numberedBuildScan.baseUrl()), + () -> assertEquals("7slcdesxr2xnw", numberedBuildScan.buildScanId()) + ); + } + + @ParameterizedTest + @ValueSource(strings = { + "https://ge.example.com", + "https://ge.example.com/", + "https://ge.example.com/s", + "https://ge.example.com/s/", + "https://ge.example.com/S/", + "https://ge.example.com/S/7slcdesxr2xnw", + }) + void invalidBuildScanUrlsThrowException(String buildScanUrl) { + assertThrows(IllegalArgumentException.class, () -> NumberedBuildScan.parse("0," + buildScanUrl)); + } +} diff --git a/release/changes.md b/release/changes.md index 214cc2c5..114d73cc 100644 --- a/release/changes.md +++ b/release/changes.md @@ -1 +1,2 @@ - [FIX] Logging level when fetching Build Scan data from Gradle Enterprise is incorrect +- [FIX] Experiments accepting Build Scan URLs incorrectly parse Build Scan ID when path contains extra parts