Skip to content

Commit

Permalink
Load latest SauceConnect version lazily (#271)
Browse files Browse the repository at this point in the history
  • Loading branch information
valfirst authored Jun 28, 2024
1 parent d9b2ed3 commit d44a7c6
Show file tree
Hide file tree
Showing 2 changed files with 50 additions and 4 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,9 @@
import org.apache.commons.compress.archivers.ArchiveStreamFactory;
import org.apache.commons.compress.compressors.CompressorException;
import org.apache.commons.compress.compressors.CompressorStreamFactory;
import org.apache.commons.lang3.concurrent.ConcurrentException;
import org.apache.commons.lang3.concurrent.LazyInitializer;
import org.apache.commons.lang3.concurrent.LazyInitializer.Builder;
import org.json.JSONObject;

import java.io.BufferedInputStream;
Expand Down Expand Up @@ -133,7 +136,9 @@ public String getDefaultSauceConnectLogDirectory() {
"Sauce Connect is up, you may start your tests";

public static final String CURRENT_SC_VERSION = "4.9.1";
public static final String LATEST_SC_VERSION = getLatestSauceConnectVersion();
public static final LazyInitializer<String> LATEST_SC_VERSION = new Builder<LazyInitializer<String>, String>()
.setInitializer(SauceConnectFourManager::getLatestSauceConnectVersion)
.get();

private static final String SAUCE_CONNECT = "sc-";
public static final String SAUCE_CONNECT_4 = SAUCE_CONNECT + CURRENT_SC_VERSION;
Expand Down Expand Up @@ -379,9 +384,18 @@ protected String getCurrentVersion() {
}

private static String getVersion(boolean useLatestSauceConnect) {
return useLatestSauceConnect && LATEST_SC_VERSION != null
? LATEST_SC_VERSION
: CURRENT_SC_VERSION;
if (useLatestSauceConnect) {
try {
String latestVersion = LATEST_SC_VERSION.get();
if (latestVersion != null) {
return latestVersion;
}
}
catch (ConcurrentException e) {
// Never happens
}
}
return CURRENT_SC_VERSION;
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,9 @@
import org.junit.jupiter.params.provider.CsvSource;
import org.junit.jupiter.params.provider.ValueSource;
import org.mockito.ArgumentCaptor;
import org.mockito.ArgumentMatcher;
import org.mockito.Mock;
import org.mockito.MockedStatic;
import org.mockito.Spy;
import org.mockito.junit.jupiter.MockitoExtension;

Expand All @@ -22,6 +24,9 @@
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintStream;
import java.net.http.HttpClient;
import java.net.http.HttpResponse;
import java.net.http.HttpResponse.BodyHandler;
import java.nio.charset.StandardCharsets;
import java.nio.file.Path;
import java.util.Locale;
Expand All @@ -35,8 +40,11 @@
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.mockito.ArgumentMatchers.argThat;
import static org.mockito.Mockito.any;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.mockStatic;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;

Expand Down Expand Up @@ -212,4 +220,28 @@ void testSauceConnectSecretsWithSpecialCharactersCoveredWithStars() {
args = new String[] {"-w", "super-user:passwd"};
assertEquals("[-w, super-user:****]", manager.hideSauceConnectCommandlineSecrets(args));
}

@Test
void shouldInitLatestVersionLazilyAndOnce() throws IOException, InterruptedException {
try (MockedStatic<HttpClient> httpClientStaticMock = mockStatic(HttpClient.class)) {
HttpClient httpClient = mock();
HttpResponse<String> httpResponse = mock();
String version = "4.99.99";
when(httpResponse.body()).thenReturn("{\"Sauce Connect\": {\"version\": \"" + version + "\"}}");
when(httpClient.send(any(), argThat((ArgumentMatcher<BodyHandler<String>>) argument -> true))).thenReturn(
httpResponse);
httpClientStaticMock.when(HttpClient::newHttpClient).thenReturn(httpClient);

SauceConnectFourManager sauceConnectFourManager = new SauceConnectFourManager();
sauceConnectFourManager.setUseLatestSauceConnect(true);

String currentVersion = sauceConnectFourManager.getCurrentVersion();
assertEquals(version, currentVersion);
httpClientStaticMock.verify(HttpClient::newHttpClient);

currentVersion = sauceConnectFourManager.getCurrentVersion();
assertEquals(version, currentVersion);
httpClientStaticMock.verifyNoMoreInteractions();
}
}
}

0 comments on commit d44a7c6

Please sign in to comment.