From 769b48e05925f08059d8bf14113a3f0062747fce Mon Sep 17 00:00:00 2001 From: "R.J. Lorimer" Date: Fri, 14 Feb 2025 15:57:10 -0600 Subject: [PATCH 1/5] DRC-30 - Check for a label instead of server version --- .../example/TestcontainersCloudFirstTest.java | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/test/java/cloud/testcontainers/example/TestcontainersCloudFirstTest.java b/src/test/java/cloud/testcontainers/example/TestcontainersCloudFirstTest.java index 204ac08..ab8d8e8 100644 --- a/src/test/java/cloud/testcontainers/example/TestcontainersCloudFirstTest.java +++ b/src/test/java/cloud/testcontainers/example/TestcontainersCloudFirstTest.java @@ -5,6 +5,7 @@ import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; +import java.util.Arrays; import com.github.dockerjava.api.DockerClient; import com.github.dockerjava.api.model.Info; @@ -39,12 +40,19 @@ public void testcontainersCloudDockerEngine() { Info dockerInfo = client.infoCmd().exec(); String serverVersion = dockerInfo.getServerVersion(); - assertThat(serverVersion) + String[] labels = dockerInfo.getLabels(); + + boolean isCloudServer = labels != null && Arrays.asList(labels).contains("docker/cloud"); + + if (!isCloudServer) { + assertThat(serverVersion) .as("Docker Client is configured via the Testcontainers desktop app") .satisfiesAnyOf( dockerString -> assertThat(dockerString).contains("Testcontainers Desktop"), dockerString -> assertThat(dockerString).contains("testcontainerscloud") - ); + ); + } + String runtimeName = "Testcontainers Cloud"; if (!serverVersion.contains("testcontainerscloud")) { From 6b90c21c815248858b4c36dbb4afdec3dbcf7be9 Mon Sep 17 00:00:00 2001 From: Kirill Merkushev <1964214+lanwen@users.noreply.github.com> Date: Mon, 17 Feb 2025 15:48:25 +0100 Subject: [PATCH 2/5] Follow the label semantics --- .../example/TestcontainersCloudFirstTest.java | 93 +++++++++++-------- 1 file changed, 54 insertions(+), 39 deletions(-) diff --git a/src/test/java/cloud/testcontainers/example/TestcontainersCloudFirstTest.java b/src/test/java/cloud/testcontainers/example/TestcontainersCloudFirstTest.java index ab8d8e8..955a701 100644 --- a/src/test/java/cloud/testcontainers/example/TestcontainersCloudFirstTest.java +++ b/src/test/java/cloud/testcontainers/example/TestcontainersCloudFirstTest.java @@ -1,12 +1,5 @@ package cloud.testcontainers.example; -import java.sql.Connection; -import java.sql.DriverManager; -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.util.Arrays; - import com.github.dockerjava.api.DockerClient; import com.github.dockerjava.api.model.Info; import org.junit.jupiter.api.Test; @@ -14,24 +7,41 @@ import org.testcontainers.DockerClientFactory; import org.testcontainers.containers.PostgreSQLContainer; import org.testcontainers.images.builder.Transferable; +import org.testcontainers.shaded.com.google.common.collect.Streams; + +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.Stream; import static org.assertj.core.api.Assertions.assertThat; @ExtendWith(TccTestWatcher.class) public class TestcontainersCloudFirstTest { + public static final String DOCKER_CLOUD_VERSION_LABEL = "com.docker.cloud.version"; + + public static final String TESTCONTAINERS_DESKTOP_APP_NAME = "Testcontainers Desktop"; + + public static final String TESTCONTAINERS_CLOUD_VERSION_NAME = "testcontainerscloud"; + @Test public void createPostgreSQLContainer() throws SQLException { try (PostgreSQLContainer postgreSQLContainer = new PostgreSQLContainer<>("postgres:14-alpine") .withCopyToContainer(Transferable.of(initsql), "/docker-entrypoint-initdb.d/init.sql")) { postgreSQLContainer.start(); - Connection connection = DriverManager.getConnection(postgreSQLContainer.getJdbcUrl(), postgreSQLContainer.getUsername(), postgreSQLContainer.getPassword()); - PreparedStatement preparedStatement = connection.prepareStatement("SELECT COUNT(*) FROM guides"); - preparedStatement.execute(); - ResultSet resultSet = preparedStatement.getResultSet(); - resultSet.next(); - assertThat(resultSet.getInt(1)).isEqualTo(6); - } + Connection connection = DriverManager.getConnection(postgreSQLContainer.getJdbcUrl(), postgreSQLContainer.getUsername(), postgreSQLContainer.getPassword()); + PreparedStatement preparedStatement = connection.prepareStatement("SELECT COUNT(*) FROM guides"); + preparedStatement.execute(); + ResultSet resultSet = preparedStatement.getResultSet(); + resultSet.next(); + assertThat(resultSet.getInt(1)).isEqualTo(6); + } } @Test @@ -42,23 +52,28 @@ public void testcontainersCloudDockerEngine() { String serverVersion = dockerInfo.getServerVersion(); String[] labels = dockerInfo.getLabels(); - boolean isCloudServer = labels != null && Arrays.asList(labels).contains("docker/cloud"); + List info = Streams.concat( + Stream.of(String.format("server.version=%s", serverVersion)), + Arrays.stream(labels == null ? new String[]{} : labels) + ).collect(Collectors.toList()); - if (!isCloudServer) { - assertThat(serverVersion) + assertThat(info) .as("Docker Client is configured via the Testcontainers desktop app") - .satisfiesAnyOf( - dockerString -> assertThat(dockerString).contains("Testcontainers Desktop"), - dockerString -> assertThat(dockerString).contains("testcontainerscloud") - ); - } + .anySatisfy(it -> assertThat(it).containsAnyOf( + TESTCONTAINERS_DESKTOP_APP_NAME, + TESTCONTAINERS_CLOUD_VERSION_NAME, + DOCKER_CLOUD_VERSION_LABEL + )); + logRuntimeDetails(serverVersion != null ? serverVersion : "", dockerInfo); + } + private static void logRuntimeDetails(String serverVersion, Info dockerInfo) { String runtimeName = "Testcontainers Cloud"; - if (!serverVersion.contains("testcontainerscloud")) { + if (!serverVersion.contains(TESTCONTAINERS_CLOUD_VERSION_NAME)) { runtimeName = dockerInfo.getOperatingSystem(); } - if (serverVersion.contains("Testcontainers Desktop")) { + if (serverVersion.contains(TESTCONTAINERS_DESKTOP_APP_NAME)) { runtimeName += " via Testcontainers Desktop app"; } System.out.println(PrettyStrings.getLogo(runtimeName)); @@ -66,19 +81,19 @@ public void testcontainersCloudDockerEngine() { private static final String initsql = "create table guides\n" + - "(\n" + - " id bigserial not null,\n" + - " title varchar(1023) not null,\n" + - " url varchar(1023) not null,\n" + - " primary key (id)\n" + - ");\n" + - "\n" + - "insert into guides(title, url)\n" + - "values ('Getting started with Testcontainers', 'https://testcontainers.com/getting-started/'),\n" + - " ('Getting started with Testcontainers for Java', 'https://testcontainers.com/guides/getting-started-with-testcontainers-for-java/'),\n" + - " ('Getting started with Testcontainers for .NET', 'https://testcontainers.com/guides/getting-started-with-testcontainers-for-dotnet/'),\n" + - " ('Getting started with Testcontainers for Node.js', 'https://testcontainers.com/guides/getting-started-with-testcontainers-for-nodejs/'),\n" + - " ('Getting started with Testcontainers for Go', 'https://testcontainers.com/guides/getting-started-with-testcontainers-for-go/'),\n" + - " ('Testcontainers container lifecycle management using JUnit 5', 'https://testcontainers.com/guides/testcontainers-container-lifecycle/')\n" + - ";"; + "(\n" + + " id bigserial not null,\n" + + " title varchar(1023) not null,\n" + + " url varchar(1023) not null,\n" + + " primary key (id)\n" + + ");\n" + + "\n" + + "insert into guides(title, url)\n" + + "values ('Getting started with Testcontainers', 'https://testcontainers.com/getting-started/'),\n" + + " ('Getting started with Testcontainers for Java', 'https://testcontainers.com/guides/getting-started-with-testcontainers-for-java/'),\n" + + " ('Getting started with Testcontainers for .NET', 'https://testcontainers.com/guides/getting-started-with-testcontainers-for-dotnet/'),\n" + + " ('Getting started with Testcontainers for Node.js', 'https://testcontainers.com/guides/getting-started-with-testcontainers-for-nodejs/'),\n" + + " ('Getting started with Testcontainers for Go', 'https://testcontainers.com/guides/getting-started-with-testcontainers-for-go/'),\n" + + " ('Testcontainers container lifecycle management using JUnit 5', 'https://testcontainers.com/guides/testcontainers-container-lifecycle/')\n" + + ";"; } \ No newline at end of file From 4e08ccdd9ae2042833ccc4b5a3ceda680558fecb Mon Sep 17 00:00:00 2001 From: Kirill Merkushev <1964214+lanwen@users.noreply.github.com> Date: Mon, 17 Feb 2025 22:37:28 +0100 Subject: [PATCH 3/5] Fix label --- .../testcontainers/example/TestcontainersCloudFirstTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/cloud/testcontainers/example/TestcontainersCloudFirstTest.java b/src/test/java/cloud/testcontainers/example/TestcontainersCloudFirstTest.java index 955a701..ce29cfe 100644 --- a/src/test/java/cloud/testcontainers/example/TestcontainersCloudFirstTest.java +++ b/src/test/java/cloud/testcontainers/example/TestcontainersCloudFirstTest.java @@ -24,7 +24,7 @@ @ExtendWith(TccTestWatcher.class) public class TestcontainersCloudFirstTest { - public static final String DOCKER_CLOUD_VERSION_LABEL = "com.docker.cloud.version"; + public static final String DOCKER_CLOUD_VERSION_LABEL = "cloud.docker.run.version"; public static final String TESTCONTAINERS_DESKTOP_APP_NAME = "Testcontainers Desktop"; From 748cfd44c4a6f07ddbb477f9e0c3d988d6a32bc3 Mon Sep 17 00:00:00 2001 From: Kirill Merkushev <1964214+lanwen@users.noreply.github.com> Date: Tue, 18 Feb 2025 00:12:38 +0100 Subject: [PATCH 4/5] Better wording --- .../testcontainers/example/TestcontainersCloudFirstTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/cloud/testcontainers/example/TestcontainersCloudFirstTest.java b/src/test/java/cloud/testcontainers/example/TestcontainersCloudFirstTest.java index ce29cfe..c646bc3 100644 --- a/src/test/java/cloud/testcontainers/example/TestcontainersCloudFirstTest.java +++ b/src/test/java/cloud/testcontainers/example/TestcontainersCloudFirstTest.java @@ -74,7 +74,7 @@ private static void logRuntimeDetails(String serverVersion, Info dockerInfo) { runtimeName = dockerInfo.getOperatingSystem(); } if (serverVersion.contains(TESTCONTAINERS_DESKTOP_APP_NAME)) { - runtimeName += " via Testcontainers Desktop app"; + runtimeName += " via Testcontainers Desktop"; } System.out.println(PrettyStrings.getLogo(runtimeName)); } From 06c9ac10b2836bdf3b3235ddc391fa5889af6dd3 Mon Sep 17 00:00:00 2001 From: Kirill Merkushev <1964214+lanwen@users.noreply.github.com> Date: Tue, 18 Feb 2025 01:24:15 +0100 Subject: [PATCH 5/5] label check to format message --- .../example/TestcontainersCloudFirstTest.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/test/java/cloud/testcontainers/example/TestcontainersCloudFirstTest.java b/src/test/java/cloud/testcontainers/example/TestcontainersCloudFirstTest.java index c646bc3..6372cac 100644 --- a/src/test/java/cloud/testcontainers/example/TestcontainersCloudFirstTest.java +++ b/src/test/java/cloud/testcontainers/example/TestcontainersCloudFirstTest.java @@ -70,7 +70,12 @@ public void testcontainersCloudDockerEngine() { private static void logRuntimeDetails(String serverVersion, Info dockerInfo) { String runtimeName = "Testcontainers Cloud"; - if (!serverVersion.contains(TESTCONTAINERS_CLOUD_VERSION_NAME)) { + boolean hasCloudLabel = Stream.of( + dockerInfo.getLabels() != null + ? dockerInfo.getLabels() + : new String[]{} + ).anyMatch(label -> label.contains(DOCKER_CLOUD_VERSION_LABEL)); + if (!serverVersion.contains(TESTCONTAINERS_CLOUD_VERSION_NAME) && !hasCloudLabel) { runtimeName = dockerInfo.getOperatingSystem(); } if (serverVersion.contains(TESTCONTAINERS_DESKTOP_APP_NAME)) {