diff --git a/src/main/java/me/itzg/helpers/fabric/FabricMetaClient.java b/src/main/java/me/itzg/helpers/fabric/FabricMetaClient.java index 8916fc9b..6489a652 100644 --- a/src/main/java/me/itzg/helpers/fabric/FabricMetaClient.java +++ b/src/main/java/me/itzg/helpers/fabric/FabricMetaClient.java @@ -37,17 +37,21 @@ static boolean nonEmptyString(String loaderVersion) { * @param version can be latest, snapshot or specific */ public Mono resolveMinecraftVersion(@Nullable String version) { + if (!isLatest(version) && !isSnapshot(version)) { + return Mono.just(version); + } + return sharedFetch.fetch( uriBuilder.resolve("/v2/versions/game") ) .toObjectList(VersionEntry.class) .assemble() .flatMap(versionEntries -> { - if (version == null || version.equalsIgnoreCase("latest")) { + if (isLatest(version)) { return findFirst(versionEntries, VersionEntry::isStable) .switchIfEmpty(Mono.error(() -> new GenericException("Unable to find any stable versions"))); } - else if (version.equalsIgnoreCase("snapshot")) { + else if (isSnapshot(version)) { return findFirst(versionEntries, versionEntry -> !versionEntry.isStable()) .switchIfEmpty(Mono.error(() -> new GenericException("Unable to find any unstable versions"))); } @@ -58,6 +62,14 @@ else if (version.equalsIgnoreCase("snapshot")) { }); } + private static boolean isSnapshot(@Nullable String version) { + return version != null && version.equalsIgnoreCase("snapshot"); + } + + private static boolean isLatest(@Nullable String version) { + return version == null || version.equalsIgnoreCase("latest"); + } + public Mono resolveLoaderVersion(String minecraftVersion, String loaderVersion) { if (nonEmptyString(loaderVersion)) { return Mono.just(loaderVersion); diff --git a/src/test/java/me/itzg/helpers/fabric/FabricLauncherInstallerTest.java b/src/test/java/me/itzg/helpers/fabric/FabricLauncherInstallerTest.java index 077f0834..1ed8c290 100644 --- a/src/test/java/me/itzg/helpers/fabric/FabricLauncherInstallerTest.java +++ b/src/test/java/me/itzg/helpers/fabric/FabricLauncherInstallerTest.java @@ -201,6 +201,50 @@ void testUpgradeFromVersionToVersion(WireMockRuntimeInfo wmRuntimeInfo) { .doesNotExist(); } + @Test + void testNoNetworkUsageWhenVersionMatches(WireMockRuntimeInfo wmRuntimeInfo) { + final WireMock wm = wmRuntimeInfo.getWireMock(); + wm.loadMappingsFrom("src/test/resources/fabric"); + + final FabricLauncherInstaller installer = new FabricLauncherInstaller( + tempDir + ); + installer.setFabricMetaBaseUrl(wmRuntimeInfo.getHttpBaseUrl()); + + installer.installUsingVersions( + "1.19.2", null, null + ); + + wm.verifyThat( + // since minecraft version is pinned + 0, + getRequestedFor(urlEqualTo("/v2/versions/game"))); + wm.verifyThat( + // to lookup installer version + 1, + getRequestedFor(urlEqualTo("/v2/versions/installer"))); + + final Path expectedLauncher192 = tempDir.resolve("fabric-server-mc.1.19.2-loader.0.14.12-launcher.0.11.1.jar"); + assertThat(expectedLauncher192) + .isNotEmptyFile() + .hasContent("fabric-server-mc.1.19.2-loader.0.14.12-launcher.0.11.1"); + + // Now try again with same + + wm.resetRequests(); + + installer.installUsingVersions( + "1.19.2", "0.14.12", "0.11.1" + ); + + assertThat(expectedLauncher192) + .isNotEmptyFile() + .hasContent("fabric-server-mc.1.19.2-loader.0.14.12-launcher.0.11.1"); + + wm.verifyThat(0, getRequestedFor(urlEqualTo("/v2/versions/game"))); + wm.verifyThat(0, getRequestedFor(urlEqualTo("/v2/versions/installer"))); + } + @Test @EnabledIfSystemProperty(named = "testEnableManualTests", matches = "true", disabledReason = "For manual recording") void forRecordingVersionDiscovery() {