From 68ee3bcc5e0a5b417139159487687c8bdadd1b9e Mon Sep 17 00:00:00 2001 From: Richard North Date: Thu, 25 Jun 2020 14:04:35 +0100 Subject: [PATCH 01/17] WIP --- .../testcontainers/DockerClientFactory.java | 2 +- .../containers/DockerComposeContainer.java | 4 +- .../FixedHostPortGenericContainer.java | 1 + .../containers/GenericContainer.java | 13 ++++ .../containers/PortForwardingContainer.java | 4 +- .../containers/SocatContainer.java | 10 ++- .../images/RemoteDockerImage.java | 6 ++ .../utility/DockerImageName.java | 71 ++++++++++++------ .../utility/DockerMachineClient.java | 1 - .../utility/ResourceReaper.java | 4 +- .../utility/TestcontainersConfiguration.java | 45 +++++++++++ .../java/org/testcontainers/DaemonTest.java | 4 +- .../DockerClientFactoryTest.java | 2 +- .../org/testcontainers/TestingImages.java | 15 ++++ .../containers/ExposedHostTest.java | 28 ++++--- .../FailureDetectingExternalResourceTest.java | 1 + .../containers/ReusabilityUnitTests.java | 20 +++-- .../containers/output/ContainerLogsTest.java | 5 +- .../dockerclient/EventStreamTest.java | 4 +- .../dockerclient/ImagePullTest.java | 3 +- .../images/ImagePullPolicyTest.java | 22 +++--- .../images/RemoteDockerImageTest.java | 11 +-- .../images/builder/DockerignoreTest.java | 30 ++++---- .../junit/CopyFileToContainerTest.java | 8 +- .../junit/DependenciesTest.java | 8 +- .../junit/DockerNetworkModeTest.java | 6 +- .../junit/FileOperationsTest.java | 11 +-- .../junit/FixedHostPortContainerTest.java | 9 ++- .../junit/GenericContainerRuleTest.java | 71 ++++++++++++------ .../junit/NonExistentImagePullTest.java | 3 +- .../junit/OutputStreamTest.java | 7 +- .../junit/OutputStreamWithTTYTest.java | 7 +- .../junit/WorkingDirectoryTest.java | 3 +- .../strategy/AbstractWaitStrategyTest.java | 3 +- .../strategy/HostPortWaitStrategyTest.java | 3 +- .../utility/AuthenticatedImagePullTest.java | 4 +- .../test/java/generic/CmdModifierTest.java | 5 +- .../src/test/java/generic/CommandsTest.java | 3 +- .../java/generic/ContainerCreationTest.java | 11 +-- .../test/java/generic/ContainerLabelTest.java | 5 +- .../src/test/java/generic/ExecTest.java | 3 +- .../generic/MultiplePortsExposedTest.java | 3 +- .../test/java/generic/WaitStrategiesTest.java | 7 +- .../StartupCheckStrategyTest.java | 7 +- .../quickstart/RedisBackedCacheIntTest.java | 3 +- .../quickstart/RedisBackedCacheIntTest.java | 3 +- .../test/java/DisqueBackedMailSenderTest.java | 13 +++- .../test/java/SingleDisqueInstanceTest.java | 8 +- examples/gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 58910 bytes .../gradle/wrapper/gradle-wrapper.properties | 5 ++ examples/gradlew | 33 ++++---- examples/gradlew.bat | 6 +- .../src/test/java/RedisBackedCacheTest.java | 6 +- .../src/test/java/RedisBackedCacheTest.java | 7 +- .../com/example/AbstractIntegrationTest.java | 3 +- .../com/example/AbstractIntegrationTest.java | 3 +- .../containers/CassandraContainer.java | 17 ++++- .../containers/CassandraContainerTest.java | 29 ++++--- .../containers/ClickHouseContainer.java | 8 ++ .../containers/ClickHouseProvider.java | 4 +- .../containers/CockroachContainer.java | 7 ++ .../CockroachContainerProvider.java | 4 +- .../couchbase/CouchbaseContainer.java | 13 +++- .../couchbase/CouchbaseContainerTest.java | 3 +- .../containers/Db2Container.java | 11 ++- .../containers/Db2ContainerProvider.java | 4 +- .../dynamodb/DynaliteContainer.java | 12 ++- .../dynamodb/DynaliteContainerTest.java | 11 ++- .../elasticsearch/ElasticsearchContainer.java | 7 ++ .../ElasticsearchContainerTest.java | 30 ++++---- .../containers/InfluxDBContainer.java | 9 ++- .../containers/JdbcDatabaseContainer.java | 8 +- .../jdbc/MissingJdbcDriverTest.java | 3 +- ...ntainersNestedRestartedContainerTests.java | 6 +- ...tcontainersNestedSharedContainerTests.java | 3 +- .../TestcontainersRestartBetweenTests.java | 3 +- .../TestcontainersSharedContainerTests.java | 3 +- .../containers/KafkaContainer.java | 9 ++- .../containers/KafkaContainerTest.java | 5 +- .../localstack/LocalStackContainer.java | 9 ++- .../localstack/LocalstackContainerTest.java | 3 +- .../containers/MariaDBContainer.java | 8 ++ .../containers/MariaDBContainerProvider.java | 5 +- .../MariaDBR2DBCDatabaseContainerTest.java | 3 +- .../containers/MongoDBContainer.java | 7 ++ .../containers/MSSQLServerContainer.java | 7 ++ .../MSSQLServerContainerProvider.java | 4 +- .../MSSQLR2DBCDatabaseContainerTest.java | 3 +- .../CustomPasswordMSSQLServerTest.java | 3 +- .../CustomizableMSSQLServerTest.java | 3 +- .../containers/MySQLContainer.java | 10 ++- .../containers/MySQLContainerProvider.java | 5 +- .../MySQLR2DBCDatabaseContainerTest.java | 3 +- .../junit/mysql/CustomizableMysqlTest.java | 3 +- .../containers/Neo4jContainer.java | 21 ++++-- .../containers/NginxContainer.java | 9 ++- .../containers/OracleContainer.java | 7 ++ .../containers/OrientDBContainer.java | 7 ++ .../containers/PostgisContainerProvider.java | 5 +- .../containers/PostgreSQLContainer.java | 7 ++ .../PostgreSQLContainerProvider.java | 5 +- .../PostgreSQLR2DBCDatabaseContainerTest.java | 3 +- .../CustomizablePostgreSQLTest.java | 3 +- .../containers/PrestoContainer.java | 7 ++ .../containers/PrestoContainerProvider.java | 5 +- .../containers/PulsarContainer.java | 14 +++- .../containers/RabbitMQContainer.java | 13 +++- .../containers/BrowserWebDriverContainer.java | 13 ++-- ...ChromeRecordingWebDriverContainerTest.java | 1 + .../containers/SolrContainer.java | 19 +++-- .../containers/ToxiproxyContainer.java | 11 ++- .../containers/ToxiproxyTest.java | 11 ++- .../testcontainers/vault/VaultContainer.java | 7 ++ 113 files changed, 735 insertions(+), 301 deletions(-) create mode 100644 core/src/test/java/org/testcontainers/TestingImages.java create mode 100644 examples/gradle/wrapper/gradle-wrapper.jar create mode 100644 examples/gradle/wrapper/gradle-wrapper.properties diff --git a/core/src/main/java/org/testcontainers/DockerClientFactory.java b/core/src/main/java/org/testcontainers/DockerClientFactory.java index 50c0f3d021c..0b2af3dc408 100644 --- a/core/src/main/java/org/testcontainers/DockerClientFactory.java +++ b/core/src/main/java/org/testcontainers/DockerClientFactory.java @@ -55,7 +55,7 @@ public class DockerClientFactory { TESTCONTAINERS_SESSION_ID_LABEL, SESSION_ID ); - private static final String TINY_IMAGE = TestcontainersConfiguration.getInstance().getTinyImage(); + private static final String TINY_IMAGE = TestcontainersConfiguration.getInstance().getTinyDockerImageName().toString(); private static DockerClientFactory instance; // Cached client configuration diff --git a/core/src/main/java/org/testcontainers/containers/DockerComposeContainer.java b/core/src/main/java/org/testcontainers/containers/DockerComposeContainer.java index c3fe9ab17f9..6a83e5f6a1d 100644 --- a/core/src/main/java/org/testcontainers/containers/DockerComposeContainer.java +++ b/core/src/main/java/org/testcontainers/containers/DockerComposeContainer.java @@ -87,7 +87,7 @@ public class DockerComposeContainer> e private final Map> ambassadorPortMappings = new ConcurrentHashMap<>(); private final Map serviceInstanceMap = new ConcurrentHashMap<>(); private final Map waitStrategyMap = new ConcurrentHashMap<>(); - private final SocatContainer ambassadorContainer = new SocatContainer(); + private final SocatContainer ambassadorContainer = new SocatContainer(TestcontainersConfiguration.getInstance().getSocatDockerImageName()); private final Map>> logConsumers = new ConcurrentHashMap<>(); private static final Object MUTEX = new Object(); @@ -585,7 +585,7 @@ class ContainerisedDockerCompose extends GenericContainer composeFiles, String identifier) { - super(TestcontainersConfiguration.getInstance().getDockerComposeContainerImage()); + super(TestcontainersConfiguration.getInstance().getDockerComposeDockerImageName()); addEnv(ENV_PROJECT_NAME, identifier); // Map the docker compose file into the container diff --git a/core/src/main/java/org/testcontainers/containers/FixedHostPortGenericContainer.java b/core/src/main/java/org/testcontainers/containers/FixedHostPortGenericContainer.java index 33c1c8e89bd..d679023f342 100644 --- a/core/src/main/java/org/testcontainers/containers/FixedHostPortGenericContainer.java +++ b/core/src/main/java/org/testcontainers/containers/FixedHostPortGenericContainer.java @@ -12,6 +12,7 @@ * not available - which could manifest as flaky or unstable tests.

*/ public class FixedHostPortGenericContainer> extends GenericContainer { + @Deprecated public FixedHostPortGenericContainer(@NotNull String dockerImageName) { super(dockerImageName); } diff --git a/core/src/main/java/org/testcontainers/containers/GenericContainer.java b/core/src/main/java/org/testcontainers/containers/GenericContainer.java index 072129de60c..8d31542d0eb 100644 --- a/core/src/main/java/org/testcontainers/containers/GenericContainer.java +++ b/core/src/main/java/org/testcontainers/containers/GenericContainer.java @@ -54,6 +54,7 @@ import org.testcontainers.lifecycle.TestDescription; import org.testcontainers.lifecycle.TestLifecycleAware; import org.testcontainers.utility.Base58; +import org.testcontainers.utility.DockerImageName; import org.testcontainers.utility.DockerLoggerFactory; import org.testcontainers.utility.DockerMachineClient; import org.testcontainers.utility.MountableFile; @@ -224,10 +225,22 @@ public class GenericContainer> @Setter(AccessLevel.NONE) private boolean shouldBeReused = false; + + public GenericContainer(@NonNull final DockerImageName dockerImageName) { + this.image = new RemoteDockerImage(dockerImageName); + } + + public GenericContainer(@NonNull final RemoteDockerImage image) { + this.image = image; + } + + + @Deprecated public GenericContainer() { this(TestcontainersConfiguration.getInstance().getTinyImage()); } + @Deprecated public GenericContainer(@NonNull final String dockerImageName) { this.setDockerImageName(dockerImageName); } diff --git a/core/src/main/java/org/testcontainers/containers/PortForwardingContainer.java b/core/src/main/java/org/testcontainers/containers/PortForwardingContainer.java index 09f1d98bd2d..e42f2681675 100644 --- a/core/src/main/java/org/testcontainers/containers/PortForwardingContainer.java +++ b/core/src/main/java/org/testcontainers/containers/PortForwardingContainer.java @@ -19,7 +19,7 @@ public enum PortForwardingContainer { INSTANCE; - private GenericContainer container; + private GenericContainer container; private final Set> exposedPorts = Collections.newSetFromMap(new ConcurrentHashMap<>()); @@ -29,7 +29,7 @@ public enum PortForwardingContainer { @SneakyThrows private Connection createSSHSession() { String password = UUID.randomUUID().toString(); - container = new GenericContainer<>(TestcontainersConfiguration.getInstance().getSSHdImage()) + container = new GenericContainer<>(TestcontainersConfiguration.getInstance().getSSHdDockerImageName()) .withExposedPorts(22) .withEnv("PASSWORD", password) .withCommand( diff --git a/core/src/main/java/org/testcontainers/containers/SocatContainer.java b/core/src/main/java/org/testcontainers/containers/SocatContainer.java index 5949a14490d..bcf2b1670fd 100644 --- a/core/src/main/java/org/testcontainers/containers/SocatContainer.java +++ b/core/src/main/java/org/testcontainers/containers/SocatContainer.java @@ -1,6 +1,7 @@ package org.testcontainers.containers; import org.testcontainers.utility.Base58; +import org.testcontainers.utility.DockerImageName; import org.testcontainers.utility.TestcontainersConfiguration; import java.util.HashMap; @@ -15,8 +16,13 @@ public class SocatContainer extends GenericContainer { private final Map targets = new HashMap<>(); + @Deprecated public SocatContainer() { - super(TestcontainersConfiguration.getInstance().getSocatContainerImage()); + this(new DockerImageName(TestcontainersConfiguration.getInstance().getSocatContainerImage())); + } + + public SocatContainer(final DockerImageName dockerImageName) { + super(dockerImageName); withCreateContainerCmdModifier(it -> it.withEntrypoint("/bin/sh")); withCreateContainerCmdModifier(it -> it.withName("testcontainers-socat-" + Base58.randomString(8))); } @@ -39,4 +45,4 @@ protected void configure() { .collect(Collectors.joining(" & ")) ); } -} \ No newline at end of file +} diff --git a/core/src/main/java/org/testcontainers/images/RemoteDockerImage.java b/core/src/main/java/org/testcontainers/images/RemoteDockerImage.java index d0e1313edf6..7e1faa8752f 100644 --- a/core/src/main/java/org/testcontainers/images/RemoteDockerImage.java +++ b/core/src/main/java/org/testcontainers/images/RemoteDockerImage.java @@ -38,10 +38,16 @@ public class RemoteDockerImage extends LazyFuture { @ToString.Exclude private DockerClient dockerClient = DockerClientFactory.lazyClient(); + public RemoteDockerImage(DockerImageName dockerImageName) { + this.imageNameFuture = CompletableFuture.completedFuture(dockerImageName); + } + + @Deprecated public RemoteDockerImage(String dockerImageName) { this.imageNameFuture = CompletableFuture.completedFuture(new DockerImageName(dockerImageName)); } + @Deprecated public RemoteDockerImage(@NonNull String repository, @NonNull String tag) { this.imageNameFuture = CompletableFuture.completedFuture(new DockerImageName(repository, tag)); } diff --git a/core/src/main/java/org/testcontainers/utility/DockerImageName.java b/core/src/main/java/org/testcontainers/utility/DockerImageName.java index d57f1044e80..970237b66db 100644 --- a/core/src/main/java/org/testcontainers/utility/DockerImageName.java +++ b/core/src/main/java/org/testcontainers/utility/DockerImageName.java @@ -2,12 +2,15 @@ import com.google.common.net.HostAndPort; +import lombok.AccessLevel; +import lombok.AllArgsConstructor; import lombok.Data; import lombok.EqualsAndHashCode; import java.util.regex.Pattern; @EqualsAndHashCode(exclude = "rawName") +@AllArgsConstructor(access = AccessLevel.PRIVATE) public final class DockerImageName { /* Regex patterns used for validation */ @@ -21,20 +24,27 @@ public final class DockerImageName { private final String repo; private final Versioning versioning; - public DockerImageName(String name) { - this.rawName = name; - final int slashIndex = name.indexOf('/'); + /** + * Parses a docker image name from a provided string. + * + * @param fullImageName in standard Docker format, e.g. name:tag, + * some.registry/path/name:tag, + * some.registry/path/name@sha256:abcdef..., etc. + */ + public DockerImageName(String fullImageName) { + this.rawName = fullImageName; + final int slashIndex = fullImageName.indexOf('/'); String remoteName; if (slashIndex == -1 || - (!name.substring(0, slashIndex).contains(".") && - !name.substring(0, slashIndex).contains(":") && - !name.substring(0, slashIndex).equals("localhost"))) { + (!fullImageName.substring(0, slashIndex).contains(".") && + !fullImageName.substring(0, slashIndex).contains(":") && + !fullImageName.substring(0, slashIndex).equals("localhost"))) { registry = ""; - remoteName = name; + remoteName = fullImageName; } else { - registry = name.substring(0, slashIndex); - remoteName = name.substring(slashIndex + 1); + registry = fullImageName.substring(0, slashIndex); + remoteName = fullImageName.substring(slashIndex + 1); } if (remoteName.contains("@sha256:")) { @@ -49,28 +59,38 @@ public DockerImageName(String name) { } } - public DockerImageName(String name, String tag) { - this.rawName = name; - final int slashIndex = name.indexOf('/'); + /** + * Parses a docker image name from a provided string, and uses a separate provided version. + * + * @param nameWithoutTag in standard Docker format, e.g. name, + * some.registry/path/name, + * some.registry/path/name, etc. + * @param version a docker image version identifier, either as a tag or sha256 checksum, e.g. + * tag, + * sha256:abcdef.... + */ + public DockerImageName(String nameWithoutTag, String version) { + this.rawName = nameWithoutTag; + final int slashIndex = nameWithoutTag.indexOf('/'); String remoteName; if (slashIndex == -1 || - (!name.substring(0, slashIndex).contains(".") && - !name.substring(0, slashIndex).contains(":") && - !name.substring(0, slashIndex).equals("localhost"))) { + (!nameWithoutTag.substring(0, slashIndex).contains(".") && + !nameWithoutTag.substring(0, slashIndex).contains(":") && + !nameWithoutTag.substring(0, slashIndex).equals("localhost"))) { registry = ""; - remoteName = name; + remoteName = nameWithoutTag; } else { - registry = name.substring(0, slashIndex); - remoteName = name.substring(slashIndex + 1); + registry = nameWithoutTag.substring(0, slashIndex); + remoteName = nameWithoutTag.substring(slashIndex + 1); } - if (tag.startsWith("sha256:")) { + if (version.startsWith("sha256:")) { repo = remoteName; - versioning = new Sha256Versioning(tag.replace("sha256:", "")); + versioning = new Sha256Versioning(version.replace("sha256:", "")); } else { repo = remoteName; - versioning = new TagVersioning(tag); + versioning = new TagVersioning(version); } } @@ -113,7 +133,7 @@ public void assertValid() { } if (versioning == null) { throw new IllegalArgumentException("No image tag was specified in docker image name " + - "(" + rawName + "). Please provide a tag; this may be 'latest' or a specific version"); + "(" + rawName + "). Please provide a tag; this may be 'latest' or a specific version"); } if (!versioning.isValid()) { throw new IllegalArgumentException(versioning + " is not a valid image versioning identifier (in " + rawName + ")"); @@ -124,8 +144,13 @@ public String getRegistry() { return registry; } + public DockerImageName withTag(final String newTag) { + return new DockerImageName(rawName, registry, repo, new TagVersioning(newTag)); + } + private interface Versioning { boolean isValid(); + String getSeparator(); } @@ -155,7 +180,7 @@ public String toString() { } @Data - private class Sha256Versioning implements Versioning { + private static class Sha256Versioning implements Versioning { public static final String HASH_REGEX = "[0-9a-fA-F]{32,}"; private final String hash; diff --git a/core/src/main/java/org/testcontainers/utility/DockerMachineClient.java b/core/src/main/java/org/testcontainers/utility/DockerMachineClient.java index 240a6d5afb4..fe12e9f541d 100644 --- a/core/src/main/java/org/testcontainers/utility/DockerMachineClient.java +++ b/core/src/main/java/org/testcontainers/utility/DockerMachineClient.java @@ -1,7 +1,6 @@ package org.testcontainers.utility; import lombok.NonNull; - import org.apache.commons.lang.SystemUtils; import org.slf4j.Logger; diff --git a/core/src/main/java/org/testcontainers/utility/ResourceReaper.java b/core/src/main/java/org/testcontainers/utility/ResourceReaper.java index 5d89ab886e7..27d70bf6926 100644 --- a/core/src/main/java/org/testcontainers/utility/ResourceReaper.java +++ b/core/src/main/java/org/testcontainers/utility/ResourceReaper.java @@ -14,7 +14,6 @@ import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Throwables; import com.google.common.collect.Sets; - import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; import org.rnorth.ducttape.ratelimits.RateLimiter; @@ -22,6 +21,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.testcontainers.DockerClientFactory; + import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; @@ -72,7 +72,7 @@ private ResourceReaper() { @SneakyThrows(InterruptedException.class) public static String start(String hostIpAddress, DockerClient client) { - String ryukImage = TestcontainersConfiguration.getInstance().getRyukImage(); + String ryukImage = TestcontainersConfiguration.getInstance().getRyukDockerImageName().toString(); DockerClientFactory.instance().checkAndPullImage(client, ryukImage); List binds = new ArrayList<>(); diff --git a/core/src/main/java/org/testcontainers/utility/TestcontainersConfiguration.java b/core/src/main/java/org/testcontainers/utility/TestcontainersConfiguration.java index aa829573447..0409199c649 100644 --- a/core/src/main/java/org/testcontainers/utility/TestcontainersConfiguration.java +++ b/core/src/main/java/org/testcontainers/utility/TestcontainersConfiguration.java @@ -63,50 +63,95 @@ public String getAmbassadorContainerImage() { return (String) properties.getOrDefault("ambassador.container.image", "richnorth/ambassador:latest"); } + @Deprecated public String getSocatContainerImage() { return (String) properties.getOrDefault("socat.container.image", "alpine/socat:latest"); } + public DockerImageName getSocatDockerImageName() { + return new DockerImageName(getSocatContainerImage()); + } + + @Deprecated public String getVncRecordedContainerImage() { return (String) properties.getOrDefault("vncrecorder.container.image", "testcontainers/vnc-recorder:1.1.0"); } + public DockerImageName getVncDockerImageName() { + return new DockerImageName(getVncRecordedContainerImage()); + } + + @Deprecated public String getDockerComposeContainerImage() { return (String) properties.getOrDefault("compose.container.image", "docker/compose:1.24.1"); } + public DockerImageName getDockerComposeDockerImageName() { + return new DockerImageName(getDockerComposeContainerImage()); + } + + @Deprecated public String getTinyImage() { return (String) properties.getOrDefault("tinyimage.container.image", "alpine:3.5"); } + public DockerImageName getTinyDockerImageName() { + return new DockerImageName(getTinyImage()); + } + public boolean isRyukPrivileged() { return Boolean.parseBoolean((String) properties.getOrDefault("ryuk.container.privileged", "false")); } + @Deprecated public String getRyukImage() { return (String) properties.getOrDefault("ryuk.container.image", "testcontainers/ryuk:0.3.0"); } + public DockerImageName getRyukDockerImageName() { + return new DockerImageName(getRyukImage()); + } + + @Deprecated public String getSSHdImage() { return (String) properties.getOrDefault("sshd.container.image", "testcontainers/sshd:1.0.0"); } + public DockerImageName getSSHdDockerImageName() { + return new DockerImageName(getSSHdImage()); + } + public Integer getRyukTimeout() { return Integer.parseInt((String) properties.getOrDefault("ryuk.container.timeout", "30")); } + @Deprecated public String getKafkaImage() { return (String) properties.getOrDefault("kafka.container.image", "confluentinc/cp-kafka"); } + public DockerImageName getKafkaDockerImageName() { + return new DockerImageName(getKafkaImage()); + } + + @Deprecated public String getPulsarImage() { return (String) properties.getOrDefault("pulsar.container.image", "apachepulsar/pulsar"); } + public DockerImageName getPulsarDockerImageName() { + return new DockerImageName(getPulsarImage()); + } + + @Deprecated public String getLocalStackImage() { return (String) properties.getOrDefault("localstack.container.image", "localstack/localstack"); } + public DockerImageName getLocalstackDockerImageName() { + return new DockerImageName(getLocalStackImage()); + } + public boolean isDisableChecks() { return Boolean.parseBoolean((String) environmentProperties.getOrDefault("checks.disable", "false")); } diff --git a/core/src/test/java/org/testcontainers/DaemonTest.java b/core/src/test/java/org/testcontainers/DaemonTest.java index e339f30acc9..b4ccf4da374 100644 --- a/core/src/test/java/org/testcontainers/DaemonTest.java +++ b/core/src/test/java/org/testcontainers/DaemonTest.java @@ -19,10 +19,10 @@ public class DaemonTest { public static void main(String[] args) { Thread mainThread = Thread.currentThread(); - GenericContainer genericContainer = null; + GenericContainer genericContainer = null; try { - genericContainer = new GenericContainer().withCommand("top"); + genericContainer = new GenericContainer<>(TINY_IMAGE).withCommand("top"); genericContainer.start(); Set threads = new HashSet<>(Thread.getAllStackTraces().keySet()); diff --git a/core/src/test/java/org/testcontainers/DockerClientFactoryTest.java b/core/src/test/java/org/testcontainers/DockerClientFactoryTest.java index 60fd69e9fd3..aa90209b88c 100644 --- a/core/src/test/java/org/testcontainers/DockerClientFactoryTest.java +++ b/core/src/test/java/org/testcontainers/DockerClientFactoryTest.java @@ -30,7 +30,7 @@ public void runCommandInsideDockerShouldNotFailIfImageDoesNotExistsLocally() { try { //remove tiny image, so it will be pulled during next command run dockFactory.client() - .removeImageCmd(TestcontainersConfiguration.getInstance().getTinyImage()) + .removeImageCmd(TestcontainersConfiguration.getInstance().getTinyDockerImageName().toString()) .withForce(true).exec(); } catch (NotFoundException ignored) { // Do not fail if it's not pulled yet diff --git a/core/src/test/java/org/testcontainers/TestingImages.java b/core/src/test/java/org/testcontainers/TestingImages.java new file mode 100644 index 00000000000..8a18ec6e173 --- /dev/null +++ b/core/src/test/java/org/testcontainers/TestingImages.java @@ -0,0 +1,15 @@ +package org.testcontainers; + +import org.testcontainers.utility.DockerImageName; +import org.testcontainers.utility.TestcontainersConfiguration; + +/** + * TODO: Javadocs + */ +public interface TestingImages { + public static final DockerImageName REDIS_IMAGE = new DockerImageName("redis:3.0.2"); + public static final DockerImageName RABBITMQ_IMAGE = new DockerImageName("rabbitmq:3.5.3"); + public static final DockerImageName MONGODB_IMAGE = new DockerImageName("mongo:3.1.5"); + public static final DockerImageName ALPINE_IMAGE = new DockerImageName("alpine:3.2"); + public static final DockerImageName TINY_IMAGE = TestcontainersConfiguration.getInstance().getTinyDockerImageName(); +} diff --git a/core/src/test/java/org/testcontainers/containers/ExposedHostTest.java b/core/src/test/java/org/testcontainers/containers/ExposedHostTest.java index 8c98b0730b0..008faf381ba 100644 --- a/core/src/test/java/org/testcontainers/containers/ExposedHostTest.java +++ b/core/src/test/java/org/testcontainers/containers/ExposedHostTest.java @@ -12,6 +12,7 @@ import java.net.InetSocketAddress; import static org.rnorth.visibleassertions.VisibleAssertions.assertEquals; +import static org.testcontainers.TestingImages.TINY_IMAGE; public class ExposedHostTest { @@ -31,9 +32,9 @@ public static void setUpClass() throws Exception { server.start(); Testcontainers.exposeHostPorts(server.getAddress().getPort()); - + Testcontainers.exposeHostPorts(ImmutableMap.of(server.getAddress().getPort(), 80)); - Testcontainers.exposeHostPorts(ImmutableMap.of(server.getAddress().getPort(), 81)); + Testcontainers.exposeHostPorts(ImmutableMap.of(server.getAddress().getPort(), 81)); } @AfterClass @@ -43,24 +44,33 @@ public static void tearDownClass() throws Exception { @Test public void testExposedHost() throws Exception { - assertResponse(new GenericContainer().withCommand("top"), server.getAddress().getPort()); + assertResponse(new GenericContainer<>(TINY_IMAGE) + .withCommand("top"), + server.getAddress().getPort()); } @Test public void testExposedHostWithNetwork() throws Exception { try (Network network = Network.newNetwork()) { - assertResponse(new GenericContainer().withNetwork(network).withCommand("top"), server.getAddress().getPort()); + assertResponse(new GenericContainer<>(TINY_IMAGE) + .withNetwork(network) + .withCommand("top"), + server.getAddress().getPort()); } } - + @Test public void testExposedHostPortOnFixedInternalPorts() throws Exception { - assertResponse(new GenericContainer().withCommand("top"), 80); - assertResponse(new GenericContainer().withCommand("top"), 81); - } + assertResponse(new GenericContainer<>(TINY_IMAGE) + .withCommand("top"), + 80); + assertResponse(new GenericContainer<>(TINY_IMAGE) + .withCommand("top"), + 81); + } @SneakyThrows - protected void assertResponse(GenericContainer container, int port) { + protected void assertResponse(GenericContainer container, int port) { try { container.start(); diff --git a/core/src/test/java/org/testcontainers/containers/FailureDetectingExternalResourceTest.java b/core/src/test/java/org/testcontainers/containers/FailureDetectingExternalResourceTest.java index 15a9eba7d17..63993bc24ff 100644 --- a/core/src/test/java/org/testcontainers/containers/FailureDetectingExternalResourceTest.java +++ b/core/src/test/java/org/testcontainers/containers/FailureDetectingExternalResourceTest.java @@ -3,6 +3,7 @@ import org.junit.Test; import org.junit.runner.Description; import org.junit.runners.model.Statement; + import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.doThrow; import static org.mockito.Mockito.mock; diff --git a/core/src/test/java/org/testcontainers/containers/ReusabilityUnitTests.java b/core/src/test/java/org/testcontainers/containers/ReusabilityUnitTests.java index b2d4d327ba2..c2caa2b42e2 100644 --- a/core/src/test/java/org/testcontainers/containers/ReusabilityUnitTests.java +++ b/core/src/test/java/org/testcontainers/containers/ReusabilityUnitTests.java @@ -3,7 +3,12 @@ import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; import com.github.dockerjava.api.DockerClient; -import com.github.dockerjava.api.command.*; +import com.github.dockerjava.api.command.CreateContainerCmd; +import com.github.dockerjava.api.command.CreateContainerResponse; +import com.github.dockerjava.api.command.InspectContainerCmd; +import com.github.dockerjava.api.command.InspectContainerResponse; +import com.github.dockerjava.api.command.ListContainersCmd; +import com.github.dockerjava.api.command.StartContainerCmd; import com.github.dockerjava.api.model.Container; import com.github.dockerjava.core.command.CreateContainerCmdImpl; import com.github.dockerjava.core.command.InspectContainerCmdImpl; @@ -23,6 +28,7 @@ import org.testcontainers.DockerClientFactory; import org.testcontainers.containers.startupcheck.StartupCheckStrategy; import org.testcontainers.containers.wait.strategy.AbstractWaitStrategy; +import org.testcontainers.images.RemoteDockerImage; import org.testcontainers.utility.MockTestcontainersConfigurationRule; import org.testcontainers.utility.MountableFile; import org.testcontainers.utility.TestcontainersConfiguration; @@ -61,8 +67,8 @@ public static class CanBeReusedTest { @Parameterized.Parameters(name = "{0}") public static Object[][] data() { return new Object[][] { - { "generic", new GenericContainer(IMAGE_FUTURE), true }, - { "anonymous generic", new GenericContainer(IMAGE_FUTURE) {}, true }, + { "generic", new GenericContainer<>(new RemoteDockerImage(IMAGE_FUTURE)), true }, + { "anonymous generic", new GenericContainer(new RemoteDockerImage(IMAGE_FUTURE)) {}, true }, { "custom", new CustomContainer(), true }, { "anonymous custom", new CustomContainer() {}, true }, { "custom with containerIsCreated", new CustomContainerWithContainerIsCreated(), false }, @@ -84,13 +90,13 @@ public void shouldBeReusable() { } } - static class CustomContainer extends GenericContainer { + static class CustomContainer extends GenericContainer { CustomContainer() { super(IMAGE_FUTURE); } } - static class CustomContainerWithContainerIsCreated extends GenericContainer { + static class CustomContainerWithContainerIsCreated extends GenericContainer { CustomContainerWithContainerIsCreated() { super(IMAGE_FUTURE); @@ -109,7 +115,7 @@ public static class HooksTest extends AbstractReusabilityTest { List script = new ArrayList<>(); - GenericContainer container = makeReusable(new GenericContainer(IMAGE_FUTURE) { + GenericContainer container = makeReusable(new GenericContainer(new RemoteDockerImage(IMAGE_FUTURE)) { @Override protected boolean canBeReused() { @@ -296,7 +302,7 @@ public void shouldHashCopiedFiles() { @RunWith(BlockJUnit4ClassRunner.class) @FieldDefaults(makeFinal = true) public static class CopyFilesHashTest { - GenericContainer container = new GenericContainer(IMAGE_FUTURE); + GenericContainer container = new GenericContainer<>(new RemoteDockerImage(IMAGE_FUTURE)); @Test public void empty() { diff --git a/core/src/test/java/org/testcontainers/containers/output/ContainerLogsTest.java b/core/src/test/java/org/testcontainers/containers/output/ContainerLogsTest.java index ad0e4c76ae2..4e8d0314add 100644 --- a/core/src/test/java/org/testcontainers/containers/output/ContainerLogsTest.java +++ b/core/src/test/java/org/testcontainers/containers/output/ContainerLogsTest.java @@ -4,6 +4,7 @@ import org.junit.Test; import org.testcontainers.containers.GenericContainer; import org.testcontainers.containers.startupcheck.OneShotStartupCheckStrategy; +import org.testcontainers.utility.DockerImageName; import static org.rnorth.visibleassertions.VisibleAssertions.assertEquals; import static org.rnorth.visibleassertions.VisibleAssertions.assertTrue; @@ -73,13 +74,13 @@ public void getLogsForLongRunningContainer() throws InterruptedException { } private static GenericContainer shortLivedContainer() { - return new GenericContainer("alpine:3.3") + return new GenericContainer(new DockerImageName("alpine:3.3")) .withCommand("/bin/sh", "-c", "echo -n 'stdout' && echo -n 'stderr' 1>&2") .withStartupCheckStrategy(new OneShotStartupCheckStrategy()); } private static GenericContainer longRunningContainer() { - return new GenericContainer("alpine:3.3") + return new GenericContainer(new DockerImageName("alpine:3.3")) .withCommand("ping -c 100 127.0.0.1"); } } diff --git a/core/src/test/java/org/testcontainers/dockerclient/EventStreamTest.java b/core/src/test/java/org/testcontainers/dockerclient/EventStreamTest.java index 4d7a4e21133..f3a03a26677 100644 --- a/core/src/test/java/org/testcontainers/dockerclient/EventStreamTest.java +++ b/core/src/test/java/org/testcontainers/dockerclient/EventStreamTest.java @@ -16,6 +16,8 @@ import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; +import static org.testcontainers.TestingImages.TINY_IMAGE; + /** * Test that event streaming from the {@link DockerClient} works correctly */ @@ -32,7 +34,7 @@ public void test() throws IOException, InterruptedException { CountDownLatch latch = new CountDownLatch(1); try ( - GenericContainer container = new GenericContainer<>() + GenericContainer container = new GenericContainer<>(TINY_IMAGE) .withCommand("true") .withStartupCheckStrategy(new OneShotStartupCheckStrategy()) ) { diff --git a/core/src/test/java/org/testcontainers/dockerclient/ImagePullTest.java b/core/src/test/java/org/testcontainers/dockerclient/ImagePullTest.java index 6e319838888..9ddb4825c8f 100644 --- a/core/src/test/java/org/testcontainers/dockerclient/ImagePullTest.java +++ b/core/src/test/java/org/testcontainers/dockerclient/ImagePullTest.java @@ -5,6 +5,7 @@ import org.junit.runners.Parameterized; import org.testcontainers.containers.GenericContainer; import org.testcontainers.containers.startupcheck.OneShotStartupCheckStrategy; +import org.testcontainers.utility.DockerImageName; @RunWith(Parameterized.class) public class ImagePullTest { @@ -34,7 +35,7 @@ public ImagePullTest(String image) { @Test public void test() { - try (final GenericContainer container = new GenericContainer<>(image) + try (final GenericContainer container = new GenericContainer(new DockerImageName(image)) .withCommand("/bin/sh", "-c", "sleep 0") .withStartupCheckStrategy(new OneShotStartupCheckStrategy())) { container.start(); diff --git a/core/src/test/java/org/testcontainers/images/ImagePullPolicyTest.java b/core/src/test/java/org/testcontainers/images/ImagePullPolicyTest.java index 69e68f7f225..3145959ec2c 100644 --- a/core/src/test/java/org/testcontainers/images/ImagePullPolicyTest.java +++ b/core/src/test/java/org/testcontainers/images/ImagePullPolicyTest.java @@ -1,8 +1,5 @@ package org.testcontainers.images; -import static org.junit.Assert.fail; -import static org.mockito.ArgumentMatchers.any; - import com.github.dockerjava.api.DockerClient; import com.github.dockerjava.api.exception.NotFoundException; import com.github.dockerjava.core.command.PullImageResultCallback; @@ -23,10 +20,13 @@ import java.util.UUID; import java.util.concurrent.TimeUnit; +import static org.junit.Assert.fail; +import static org.mockito.ArgumentMatchers.any; + public class ImagePullPolicyTest { @ClassRule - public static GenericContainer registry = new GenericContainer<>("registry:2") + public static GenericContainer registry = new GenericContainer(new DockerImageName("registry:2")) .withExposedPorts(5000); private static String imageName; @@ -74,7 +74,7 @@ public void setUp() { @Test public void pullsByDefault() { try ( - GenericContainer container = new GenericContainer<>(imageName) + GenericContainer container = new GenericContainer(new DockerImageName(imageName)) .withStartupCheckStrategy(new OneShotStartupCheckStrategy()) ) { container.start(); @@ -84,7 +84,7 @@ public void pullsByDefault() { @Test public void shouldAlwaysPull() { try ( - GenericContainer container = new GenericContainer<>(imageName) + GenericContainer container = new GenericContainer(new DockerImageName(imageName)) .withStartupCheckStrategy(new OneShotStartupCheckStrategy()) ) { container.start(); @@ -93,7 +93,7 @@ public void shouldAlwaysPull() { DockerClientFactory.instance().client().removeImageCmd(imageName).withForce(true).exec(); try ( - GenericContainer container = new GenericContainer<>(imageName) + GenericContainer container = new GenericContainer(new DockerImageName(imageName)) .withStartupCheckStrategy(new OneShotStartupCheckStrategy()) ) { expectToFailWithNotFoundException(container); @@ -101,7 +101,7 @@ public void shouldAlwaysPull() { try ( // built_in_image_pull_policy { - GenericContainer container = new GenericContainer<>(imageName) + GenericContainer container = new GenericContainer(new DockerImageName(imageName)) .withImagePullPolicy(PullPolicy.alwaysPull()) // } ) { @@ -114,7 +114,7 @@ public void shouldAlwaysPull() { public void shouldSupportCustomPolicies() { try ( // custom_image_pull_policy { - GenericContainer container = new GenericContainer<>(imageName) + GenericContainer container = new GenericContainer(new DockerImageName(imageName)) .withImagePullPolicy(new AbstractImagePullPolicy() { @Override protected boolean shouldPullCached(DockerImageName imageName, ImageData localImageData) { @@ -137,7 +137,7 @@ protected boolean shouldPullCached(DockerImageName imageName, ImageData localIma } }); try ( - GenericContainer container = new GenericContainer<>(imageName) + GenericContainer container = new GenericContainer(new DockerImageName(imageName)) .withImagePullPolicy(policy) .withStartupCheckStrategy(new OneShotStartupCheckStrategy()) ) { @@ -150,7 +150,7 @@ protected boolean shouldPullCached(DockerImageName imageName, ImageData localIma @Test public void shouldNotForcePulling() { try ( - GenericContainer container = new GenericContainer<>(imageName) + GenericContainer container = new GenericContainer(new DockerImageName(imageName)) .withImagePullPolicy(__ -> false) .withStartupCheckStrategy(new OneShotStartupCheckStrategy()) ) { diff --git a/core/src/test/java/org/testcontainers/images/RemoteDockerImageTest.java b/core/src/test/java/org/testcontainers/images/RemoteDockerImageTest.java index c62f15653b3..a465c41fd92 100644 --- a/core/src/test/java/org/testcontainers/images/RemoteDockerImageTest.java +++ b/core/src/test/java/org/testcontainers/images/RemoteDockerImageTest.java @@ -1,20 +1,21 @@ package org.testcontainers.images; -import static org.hamcrest.CoreMatchers.containsString; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertThat; - import org.junit.Test; import org.testcontainers.utility.Base58; +import org.testcontainers.utility.DockerImageName; import java.util.concurrent.CompletableFuture; +import static org.hamcrest.CoreMatchers.containsString; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertThat; + public class RemoteDockerImageTest { @Test public void toStringContainsOnlyImageName() { String imageName = Base58.randomString(8).toLowerCase(); - RemoteDockerImage remoteDockerImage = new RemoteDockerImage(imageName); + RemoteDockerImage remoteDockerImage = new RemoteDockerImage(new DockerImageName(imageName)); assertThat(remoteDockerImage.toString(), containsString("imageName=" + imageName)); } diff --git a/core/src/test/java/org/testcontainers/images/builder/DockerignoreTest.java b/core/src/test/java/org/testcontainers/images/builder/DockerignoreTest.java index faf5fb950b8..810100fea51 100644 --- a/core/src/test/java/org/testcontainers/images/builder/DockerignoreTest.java +++ b/core/src/test/java/org/testcontainers/images/builder/DockerignoreTest.java @@ -1,21 +1,21 @@ package org.testcontainers.images.builder; -import static org.rnorth.visibleassertions.VisibleAssertions.assertTrue; -import static org.rnorth.visibleassertions.VisibleAssertions.fail; - -import java.nio.file.Path; -import java.nio.file.Paths; - +import com.github.dockerjava.api.exception.DockerClientException; import org.junit.Test; import org.testcontainers.containers.GenericContainer; import org.testcontainers.containers.startupcheck.OneShotStartupCheckStrategy; +import org.testcontainers.utility.DockerImageName; -import com.github.dockerjava.api.exception.DockerClientException; +import java.nio.file.Path; +import java.nio.file.Paths; + +import static org.rnorth.visibleassertions.VisibleAssertions.assertTrue; +import static org.rnorth.visibleassertions.VisibleAssertions.fail; public class DockerignoreTest { - + private static final Path INVALID_DOCKERIGNORE_PATH = Paths.get("src/test/resources/dockerfile-build-invalid"); - + @Test public void testInvalidDockerignore() throws Exception { try { @@ -24,13 +24,13 @@ public void testInvalidDockerignore() throws Exception { .withDockerfile(INVALID_DOCKERIGNORE_PATH.resolve("Dockerfile")) .get(); fail("Should not be able to build an image with an invalid .dockerignore file"); - } + } catch (DockerClientException e) { if (!e.getMessage().contains("Invalid pattern")) throw e; } } - + @SuppressWarnings("resource") @Test public void testValidDockerignore() throws Exception { @@ -38,7 +38,7 @@ public void testValidDockerignore() throws Exception { .withFileFromPath(".", DockerfileBuildTest.RESOURCE_PATH) .withDockerfile(DockerfileBuildTest.RESOURCE_PATH.resolve("Dockerfile-currentdir")); try( - final GenericContainer container = new GenericContainer<>(img.get()) + final GenericContainer container = new GenericContainer(new DockerImageName(img.get())) .withStartupCheckStrategy(new OneShotStartupCheckStrategy()) .withCommand("ls", "/") ) { @@ -46,11 +46,11 @@ public void testValidDockerignore() throws Exception { container.start(); final String logs = container.getLogs(); - assertTrue("Files in the container indicated the .dockerignore was not applied. Output was: " + logs, + assertTrue("Files in the container indicated the .dockerignore was not applied. Output was: " + logs, logs.contains("should_not_be_ignored.txt")); - assertTrue("Files in the container indicated the .dockerignore was not applied. Output was: " + logs, + assertTrue("Files in the container indicated the .dockerignore was not applied. Output was: " + logs, !logs.contains("should_be_ignored.txt")); } } - + } diff --git a/core/src/test/java/org/testcontainers/junit/CopyFileToContainerTest.java b/core/src/test/java/org/testcontainers/junit/CopyFileToContainerTest.java index ed6ee561505..4a10f9b1ea6 100644 --- a/core/src/test/java/org/testcontainers/junit/CopyFileToContainerTest.java +++ b/core/src/test/java/org/testcontainers/junit/CopyFileToContainerTest.java @@ -19,7 +19,7 @@ public class CopyFileToContainerTest { @Test public void checkFileCopied() throws IOException, InterruptedException { try ( - GenericContainer container = new GenericContainer() + GenericContainer container = new GenericContainer<>(TINY_IMAGE) .withCommand("sleep", "3000") .withCopyFileToContainer(MountableFile.forClasspathResource("/mappable-resource/"), containerPath) ) { @@ -32,7 +32,7 @@ public void checkFileCopied() throws IOException, InterruptedException { @Test public void shouldUseCopyForReadOnlyClasspathResources() throws Exception { try ( - GenericContainer container = new GenericContainer() + GenericContainer container = new GenericContainer<>(TINY_IMAGE) .withCommand("sleep", "3000") .withClasspathResourceMapping("/mappable-resource/", containerPath, BindMode.READ_ONLY) ) { @@ -45,7 +45,7 @@ public void shouldUseCopyForReadOnlyClasspathResources() throws Exception { @Test public void shouldUseCopyOnlyWithReadOnlyClasspathResources() { String resource = "/test_copy_to_container.txt"; - GenericContainer container = new GenericContainer<>() + GenericContainer container = new GenericContainer<>(TINY_IMAGE) .withClasspathResourceMapping(resource, "/readOnly", BindMode.READ_ONLY) .withClasspathResourceMapping(resource, "/readOnlyNoSelinux", BindMode.READ_ONLY) @@ -64,7 +64,7 @@ public void shouldUseCopyOnlyWithReadOnlyClasspathResources() { public void shouldCreateFoldersStructureWithCopy() throws Exception { String resource = "/test_copy_to_container.txt"; try ( - GenericContainer container = new GenericContainer<>() + GenericContainer container = new GenericContainer<>(TINY_IMAGE) .withCommand("sleep", "3000") .withClasspathResourceMapping(resource, "/a/b/c/file", BindMode.READ_ONLY) ) { diff --git a/core/src/test/java/org/testcontainers/junit/DependenciesTest.java b/core/src/test/java/org/testcontainers/junit/DependenciesTest.java index 4f2ee01bc6d..4c98e0728f8 100644 --- a/core/src/test/java/org/testcontainers/junit/DependenciesTest.java +++ b/core/src/test/java/org/testcontainers/junit/DependenciesTest.java @@ -23,7 +23,7 @@ public void shouldWorkWithSimpleDependency() { InvocationCountingStartable startable = new InvocationCountingStartable(); try ( - GenericContainer container = new GenericContainer() + GenericContainer container = new GenericContainer<>(TINY_IMAGE) .withStartupCheckStrategy(new OneShotStartupCheckStrategy()) .dependsOn(startable) ) { @@ -40,7 +40,7 @@ public void shouldWorkWithMutlipleDependencies() { InvocationCountingStartable startable2 = new InvocationCountingStartable(); try ( - GenericContainer container = new GenericContainer() + GenericContainer container = new GenericContainer<>(TINY_IMAGE) .withStartupCheckStrategy(new OneShotStartupCheckStrategy()) .dependsOn(startable1, startable2) ) { @@ -56,7 +56,7 @@ public void shouldStartEveryTime() { InvocationCountingStartable startable = new InvocationCountingStartable(); try ( - GenericContainer container = new GenericContainer() + GenericContainer container = new GenericContainer<>(TINY_IMAGE) .withStartupCheckStrategy(new OneShotStartupCheckStrategy()) .dependsOn(startable) ) { @@ -83,7 +83,7 @@ public void shouldStartTransitiveDependencies() { startable.getDependencies().add(transitiveStartable); try ( - GenericContainer container = new GenericContainer() + GenericContainer container = new GenericContainer<>(TINY_IMAGE) .withStartupCheckStrategy(new OneShotStartupCheckStrategy()) .dependsOn(startable) ) { diff --git a/core/src/test/java/org/testcontainers/junit/DockerNetworkModeTest.java b/core/src/test/java/org/testcontainers/junit/DockerNetworkModeTest.java index 873160bdbc9..74c3bbd576e 100644 --- a/core/src/test/java/org/testcontainers/junit/DockerNetworkModeTest.java +++ b/core/src/test/java/org/testcontainers/junit/DockerNetworkModeTest.java @@ -2,7 +2,7 @@ import com.github.dockerjava.api.model.NetworkSettings; import lombok.extern.slf4j.Slf4j; -import org.junit.*; +import org.junit.Test; import org.testcontainers.containers.GenericContainer; import org.testcontainers.containers.startupcheck.OneShotStartupCheckStrategy; @@ -19,7 +19,7 @@ public class DockerNetworkModeTest { @Test public void testNoNetworkContainer() { try ( - GenericContainer container = new GenericContainer() + GenericContainer container = new GenericContainer<>(TINY_IMAGE) .withStartupCheckStrategy(new OneShotStartupCheckStrategy()) .withCommand("true") .withNetworkMode("none") @@ -35,7 +35,7 @@ public void testNoNetworkContainer() { @Test public void testHostNetworkContainer() { try ( - GenericContainer container = new GenericContainer() + GenericContainer container = new GenericContainer<>(TINY_IMAGE) .withStartupCheckStrategy(new OneShotStartupCheckStrategy()) .withCommand("true") .withNetworkMode("host") diff --git a/core/src/test/java/org/testcontainers/junit/FileOperationsTest.java b/core/src/test/java/org/testcontainers/junit/FileOperationsTest.java index 95de9ef1b85..4434bf7d20f 100644 --- a/core/src/test/java/org/testcontainers/junit/FileOperationsTest.java +++ b/core/src/test/java/org/testcontainers/junit/FileOperationsTest.java @@ -6,6 +6,7 @@ import org.junit.Test; import org.junit.rules.TemporaryFolder; import org.testcontainers.containers.GenericContainer; +import org.testcontainers.utility.DockerImageName; import org.testcontainers.utility.MountableFile; import java.io.File; @@ -21,7 +22,7 @@ public class FileOperationsTest { @Test public void copyFileToContainerFileTest() throws Exception { try ( - GenericContainer alpineCopyToContainer = new GenericContainer("alpine:3.2") + GenericContainer alpineCopyToContainer = new GenericContainer(new DockerImageName("alpine:3.2")) .withCommand("top") ) { alpineCopyToContainer.start(); @@ -39,7 +40,7 @@ public void copyFileToContainerFileTest() throws Exception { @Test public void copyFileToContainerFolderTest() throws Exception { try ( - GenericContainer alpineCopyToContainer = new GenericContainer("alpine:3.2") + GenericContainer alpineCopyToContainer = new GenericContainer(new DockerImageName("alpine:3.2")) .withCommand("top") ) { alpineCopyToContainer.start(); @@ -57,7 +58,7 @@ public void copyFileToContainerFolderTest() throws Exception { @Test public void copyFolderToContainerFolderTest() throws Exception { try ( - GenericContainer alpineCopyToContainer = new GenericContainer("alpine:3.2") + GenericContainer alpineCopyToContainer = new GenericContainer(new DockerImageName("alpine:3.2")) .withCommand("top") ) { @@ -76,7 +77,7 @@ public void copyFolderToContainerFolderTest() throws Exception { @Test(expected = NotFoundException.class) public void copyFromContainerShouldFailBecauseNoFileTest() throws NotFoundException { try ( - GenericContainer alpineCopyToContainer = new GenericContainer("alpine:3.2") + GenericContainer alpineCopyToContainer = new GenericContainer(new DockerImageName("alpine:3.2")) .withCommand("top") ) { alpineCopyToContainer.start(); @@ -87,7 +88,7 @@ public void copyFromContainerShouldFailBecauseNoFileTest() throws NotFoundExcept @Test public void shouldCopyFileFromContainerTest() throws IOException { try ( - GenericContainer alpineCopyToContainer = new GenericContainer("alpine:3.2") + GenericContainer alpineCopyToContainer = new GenericContainer(new DockerImageName("alpine:3.2")) .withCommand("top") ) { diff --git a/core/src/test/java/org/testcontainers/junit/FixedHostPortContainerTest.java b/core/src/test/java/org/testcontainers/junit/FixedHostPortContainerTest.java index 5fe49756ba1..c2e76310dfa 100644 --- a/core/src/test/java/org/testcontainers/junit/FixedHostPortContainerTest.java +++ b/core/src/test/java/org/testcontainers/junit/FixedHostPortContainerTest.java @@ -1,8 +1,5 @@ package org.testcontainers.junit; -import static org.hamcrest.CoreMatchers.equalTo; -import static org.hamcrest.MatcherAssert.assertThat; - import com.google.common.util.concurrent.Uninterruptibles; import org.junit.Test; import org.rnorth.ducttape.unreliables.Unreliables; @@ -15,6 +12,10 @@ import java.net.Socket; import java.util.concurrent.TimeUnit; +import static org.hamcrest.CoreMatchers.equalTo; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.testcontainers.TestingImages.TINY_IMAGE; + /** * Test of {@link FixedHostPortGenericContainer}. Note that this is not an example of typical use (usually, a container * should be a field on the test class annotated with @Rule or @TestRule). Instead, here, the lifecycle of the container @@ -46,7 +47,7 @@ public void testFixedHostPortMapping() throws IOException { // first find a free port on the docker host that will work for testing final Integer unusedHostPort; try ( - final GenericContainer echoServer = new GenericContainer<>(TEST_IMAGE) + final GenericContainer echoServer = new GenericContainer(TINY_IMAGE) .withExposedPorts(TEST_PORT) .withCommand("/bin/sh", "-c", HTTP_ECHO_CMD) ) { diff --git a/core/src/test/java/org/testcontainers/junit/GenericContainerRuleTest.java b/core/src/test/java/org/testcontainers/junit/GenericContainerRuleTest.java index b450244a84d..fee1b3ddc88 100644 --- a/core/src/test/java/org/testcontainers/junit/GenericContainerRuleTest.java +++ b/core/src/test/java/org/testcontainers/junit/GenericContainerRuleTest.java @@ -6,10 +6,19 @@ import com.mongodb.MongoClient; import com.mongodb.client.MongoCollection; import com.mongodb.client.MongoDatabase; -import com.rabbitmq.client.*; +import com.rabbitmq.client.AMQP; +import com.rabbitmq.client.Channel; +import com.rabbitmq.client.Connection; +import com.rabbitmq.client.ConnectionFactory; +import com.rabbitmq.client.DefaultConsumer; +import com.rabbitmq.client.Envelope; import org.apache.commons.io.FileUtils; import org.bson.Document; -import org.junit.*; +import org.junit.Assume; +import org.junit.BeforeClass; +import org.junit.ClassRule; +import org.junit.Ignore; +import org.junit.Test; import org.rnorth.ducttape.RetryCountExceededException; import org.rnorth.ducttape.unreliables.Unreliables; import org.testcontainers.containers.Container; @@ -18,7 +27,13 @@ import org.testcontainers.utility.Base58; import org.testcontainers.utility.TestEnvironment; -import java.io.*; +import java.io.BufferedReader; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStreamReader; +import java.io.PrintStream; import java.net.Socket; import java.time.Duration; import java.util.Arrays; @@ -30,7 +45,16 @@ import static java.util.Collections.singletonMap; import static org.hamcrest.CoreMatchers.equalTo; -import static org.rnorth.visibleassertions.VisibleAssertions.*; +import static org.rnorth.visibleassertions.VisibleAssertions.assertEquals; +import static org.rnorth.visibleassertions.VisibleAssertions.assertFalse; +import static org.rnorth.visibleassertions.VisibleAssertions.assertThat; +import static org.rnorth.visibleassertions.VisibleAssertions.assertThrows; +import static org.rnorth.visibleassertions.VisibleAssertions.assertTrue; +import static org.testcontainers.TestingImages.ALPINE_IMAGE; +import static org.testcontainers.TestingImages.MONGODB_IMAGE; +import static org.testcontainers.TestingImages.RABBITMQ_IMAGE; +import static org.testcontainers.TestingImages.REDIS_IMAGE; +import static org.testcontainers.TestingImages.TINY_IMAGE; import static org.testcontainers.containers.BindMode.READ_ONLY; import static org.testcontainers.containers.BindMode.READ_WRITE; import static org.testcontainers.containers.SelinuxContext.SHARED; @@ -47,6 +71,7 @@ public class GenericContainerRuleTest { private static final int RABBITMQ_PORT = 5672; private static final int MONGO_PORT = 27017; + /* * Test data setup */ @@ -61,29 +86,27 @@ public static void setupContent() throws FileNotFoundException { * Redis */ @ClassRule - public static GenericContainer redis = new GenericContainer("redis:3.0.2") + public static GenericContainer redis = new GenericContainer<>(REDIS_IMAGE) .withExposedPorts(REDIS_PORT); /** * RabbitMQ */ @ClassRule - public static GenericContainer rabbitMq = new GenericContainer("rabbitmq:3.5.3") + public static GenericContainer rabbitMq = new GenericContainer<>(RABBITMQ_IMAGE) .withExposedPorts(RABBITMQ_PORT); - /** * MongoDB */ @ClassRule - public static GenericContainer mongo = new GenericContainer("mongo:3.1.5") + public static GenericContainer mongo = new GenericContainer<>(MONGODB_IMAGE) .withExposedPorts(MONGO_PORT); - /** * Pass an environment variable to the container, then run a shell script that exposes the variable in a quick and * dirty way for testing. */ @ClassRule - public static GenericContainer alpineEnvVar = new GenericContainer<>("alpine:3.2") + public static GenericContainer alpineEnvVar = new GenericContainer<>(ALPINE_IMAGE) .withExposedPorts(80) .withEnv("MAGIC_NUMBER", "4") .withEnv("MAGIC_NUMBER", oldValue -> oldValue.orElse("") + "2") @@ -94,7 +117,7 @@ public static void setupContent() throws FileNotFoundException { * dirty way for testing. */ @ClassRule - public static GenericContainer alpineEnvVarFromMap = new GenericContainer("alpine:3.2") + public static GenericContainer alpineEnvVarFromMap = new GenericContainer<>(ALPINE_IMAGE) .withExposedPorts(80) .withEnv(ImmutableMap.of( "FIRST", "42", @@ -106,7 +129,7 @@ public static void setupContent() throws FileNotFoundException { * Map a file on the classpath to a file in the container, and then expose the content for testing. */ @ClassRule - public static GenericContainer alpineClasspathResource = new GenericContainer("alpine:3.2") + public static GenericContainer alpineClasspathResource = new GenericContainer<>(ALPINE_IMAGE) .withExposedPorts(80) .withClasspathResourceMapping("mappable-resource/test-resource.txt", "/content.txt", READ_ONLY) .withCommand("/bin/sh", "-c", "while true; do cat /content.txt | nc -l -p 80; done"); @@ -115,7 +138,7 @@ public static void setupContent() throws FileNotFoundException { * Map a file on the classpath to a file in the container, and then expose the content for testing. */ @ClassRule - public static GenericContainer alpineClasspathResourceSelinux = new GenericContainer("alpine:3.2") + public static GenericContainer alpineClasspathResourceSelinux = new GenericContainer<>(ALPINE_IMAGE) .withExposedPorts(80) .withClasspathResourceMapping("mappable-resource/test-resource.txt", "/content.txt", READ_WRITE, SHARED) .withCommand("/bin/sh", "-c", "while true; do cat /content.txt | nc -l -p 80; done"); @@ -124,14 +147,16 @@ public static void setupContent() throws FileNotFoundException { * Create a container with an extra host entry and expose the content of /etc/hosts for testing. */ @ClassRule - public static GenericContainer alpineExtrahost = new GenericContainer("alpine:3.2") + public static GenericContainer alpineExtrahost = new GenericContainer<>(ALPINE_IMAGE) .withExposedPorts(80) .withExtraHost("somehost", "192.168.1.10") .withCommand("/bin/sh", "-c", "while true; do cat /etc/hosts | nc -l -p 80; done"); @Test public void testIsRunning() { - try (GenericContainer container = new GenericContainer().withCommand("top")) { + try ( + GenericContainer container = new GenericContainer<>(TINY_IMAGE) + .withCommand("top")) { assertFalse("Container is not started and not running", container.isRunning()); container.start(); assertTrue("Container is started and running", container.isRunning()); @@ -141,7 +166,7 @@ public void testIsRunning() { @Test public void withTmpFsTest() throws Exception { try ( - GenericContainer container = new GenericContainer() + GenericContainer container = new GenericContainer<>(TINY_IMAGE) .withCommand("top") .withTmpFs(singletonMap("/testtmpfs", "rw")) ) { @@ -222,7 +247,7 @@ public void environmentFromMapTest() throws IOException { @Test public void customLabelTest() { - try (final GenericContainer alpineCustomLabel = new GenericContainer("alpine:3.2") + try (final GenericContainer alpineCustomLabel = new GenericContainer<>(ALPINE_IMAGE) .withLabel("our.custom", "label") .withCommand("top")) { @@ -240,7 +265,7 @@ public void exceptionThrownWhenTryingToOverrideTestcontainersLabels() { assertThrows("When trying to overwrite an 'org.testcontainers' label, withLabel() throws an exception", IllegalArgumentException.class, () -> { - new GenericContainer("alpine:3.2") + new GenericContainer<>(ALPINE_IMAGE) .withLabel("org.testcontainers.foo", "false"); } ); @@ -262,7 +287,7 @@ public void customClasspathResourceMappingWithSelinuxTest() throws IOException { } @Test - public void exceptionThrownWhenMappedPortNotFound() throws IOException { + public void exceptionThrownWhenMappedPortNotFound() { assertThrows("When the requested port is not mapped, getMappedPort() throws an exception", IllegalArgumentException.class, () -> { @@ -279,10 +304,10 @@ protected static void writeStringToFile(File contentFolder, String filename, Str } @Test @Ignore //TODO investigate intermittent failures - public void failFastWhenContainerHaltsImmediately() throws Exception { + public void failFastWhenContainerHaltsImmediately() { long startingTimeMs = System.currentTimeMillis(); - final GenericContainer failsImmediately = new GenericContainer("alpine:3.2") + final GenericContainer failsImmediately = new GenericContainer<>(ALPINE_IMAGE) .withCommand("/bin/sh", "-c", "return false") .withMinimumRunningDuration(Duration.ofMillis(100)); @@ -346,7 +371,7 @@ public void createContainerCmdHookTest() { // Use random name to avoid the conflicts between the tests String randomName = Base58.randomString(5); try( - GenericContainer container = new GenericContainer<>("redis:3.0.2") + GenericContainer container = new GenericContainer<>(REDIS_IMAGE) .withCommand("redis-server", "--help") .withCreateContainerCmdModifier(cmd -> cmd.withName("overrideMe")) // Preserves the order @@ -390,7 +415,7 @@ public void addingExposedPortTwiceShouldNotFail() { @Test public void sharedMemorySetTest() { - try (GenericContainer containerWithSharedMemory = new GenericContainer() + try (GenericContainer containerWithSharedMemory = new GenericContainer<>(TINY_IMAGE) .withSharedMemorySize(42L * FileUtils.ONE_MB) .withStartupCheckStrategy(new OneShotStartupCheckStrategy())) { diff --git a/core/src/test/java/org/testcontainers/junit/NonExistentImagePullTest.java b/core/src/test/java/org/testcontainers/junit/NonExistentImagePullTest.java index d842829b4b6..ddc4ea9be15 100644 --- a/core/src/test/java/org/testcontainers/junit/NonExistentImagePullTest.java +++ b/core/src/test/java/org/testcontainers/junit/NonExistentImagePullTest.java @@ -3,6 +3,7 @@ import org.junit.Test; import org.testcontainers.containers.ContainerFetchException; import org.testcontainers.containers.GenericContainer; +import org.testcontainers.utility.DockerImageName; import static org.rnorth.visibleassertions.VisibleAssertions.assertThrows; @@ -16,7 +17,7 @@ public void pullingNonExistentImageFailsGracefully() { assertThrows("Pulling a nonexistent container will cause an exception to be thrown", ContainerFetchException.class, () -> { - new GenericContainer("richnorth/nonexistent:latest").getDockerImageName(); + new GenericContainer(new DockerImageName("richnorth/nonexistent:latest")).getDockerImageName(); }); } } diff --git a/core/src/test/java/org/testcontainers/junit/OutputStreamTest.java b/core/src/test/java/org/testcontainers/junit/OutputStreamTest.java index 83ba05be86e..c9e61b6e3f4 100644 --- a/core/src/test/java/org/testcontainers/junit/OutputStreamTest.java +++ b/core/src/test/java/org/testcontainers/junit/OutputStreamTest.java @@ -9,12 +9,15 @@ import org.testcontainers.containers.output.Slf4jLogConsumer; import org.testcontainers.containers.output.ToStringConsumer; import org.testcontainers.containers.output.WaitingConsumer; +import org.testcontainers.utility.DockerImageName; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; import java.util.function.Consumer; -import static org.rnorth.visibleassertions.VisibleAssertions.*; +import static org.rnorth.visibleassertions.VisibleAssertions.assertFalse; +import static org.rnorth.visibleassertions.VisibleAssertions.assertThrows; +import static org.rnorth.visibleassertions.VisibleAssertions.assertTrue; import static org.testcontainers.containers.output.OutputFrame.OutputType.STDOUT; /** @@ -23,7 +26,7 @@ public class OutputStreamTest { @Rule - public GenericContainer container = new GenericContainer("alpine:3.2") + public GenericContainer container = new GenericContainer(new DockerImageName("alpine:3.2")) .withCommand("ping -c 5 127.0.0.1"); private static final Logger LOGGER = LoggerFactory.getLogger(OutputStreamTest.class); diff --git a/core/src/test/java/org/testcontainers/junit/OutputStreamWithTTYTest.java b/core/src/test/java/org/testcontainers/junit/OutputStreamWithTTYTest.java index 0e7b66534b7..183b2be8aaa 100644 --- a/core/src/test/java/org/testcontainers/junit/OutputStreamWithTTYTest.java +++ b/core/src/test/java/org/testcontainers/junit/OutputStreamWithTTYTest.java @@ -10,19 +10,22 @@ import org.testcontainers.containers.output.ToStringConsumer; import org.testcontainers.containers.output.WaitingConsumer; import org.testcontainers.containers.startupcheck.OneShotStartupCheckStrategy; +import org.testcontainers.utility.DockerImageName; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; import java.util.function.Consumer; -import static org.rnorth.visibleassertions.VisibleAssertions.*; +import static org.rnorth.visibleassertions.VisibleAssertions.assertFalse; +import static org.rnorth.visibleassertions.VisibleAssertions.assertThrows; +import static org.rnorth.visibleassertions.VisibleAssertions.assertTrue; import static org.testcontainers.containers.output.OutputFrame.OutputType.STDOUT; @Slf4j public class OutputStreamWithTTYTest { @Rule - public GenericContainer container = new GenericContainer<>("alpine:3.2") + public GenericContainer container = new GenericContainer(new DockerImageName("alpine:3.2")) .withCommand("ls -1") .withStartupCheckStrategy(new OneShotStartupCheckStrategy()) .withCreateContainerCmdModifier(command -> command.withTty(true)); diff --git a/core/src/test/java/org/testcontainers/junit/WorkingDirectoryTest.java b/core/src/test/java/org/testcontainers/junit/WorkingDirectoryTest.java index 30230cc12ff..f9fa2fc293d 100644 --- a/core/src/test/java/org/testcontainers/junit/WorkingDirectoryTest.java +++ b/core/src/test/java/org/testcontainers/junit/WorkingDirectoryTest.java @@ -4,6 +4,7 @@ import org.junit.Test; import org.testcontainers.containers.GenericContainer; import org.testcontainers.containers.startupcheck.OneShotStartupCheckStrategy; +import org.testcontainers.utility.DockerImageName; import static org.rnorth.visibleassertions.VisibleAssertions.assertTrue; @@ -13,7 +14,7 @@ public class WorkingDirectoryTest { @ClassRule - public static GenericContainer container = new GenericContainer("alpine:3.2") + public static GenericContainer container = new GenericContainer(new DockerImageName("alpine:3.2")) .withWorkingDirectory("/etc") .withStartupCheckStrategy(new OneShotStartupCheckStrategy()) .withCommand("ls", "-al"); diff --git a/core/src/test/java/org/testcontainers/junit/wait/strategy/AbstractWaitStrategyTest.java b/core/src/test/java/org/testcontainers/junit/wait/strategy/AbstractWaitStrategyTest.java index 3d3c2f0606d..c5b6bcb7095 100644 --- a/core/src/test/java/org/testcontainers/junit/wait/strategy/AbstractWaitStrategyTest.java +++ b/core/src/test/java/org/testcontainers/junit/wait/strategy/AbstractWaitStrategyTest.java @@ -7,6 +7,7 @@ import org.testcontainers.containers.ContainerLaunchException; import org.testcontainers.containers.GenericContainer; import org.testcontainers.containers.wait.strategy.WaitStrategy; +import org.testcontainers.utility.DockerImageName; import java.time.Duration; import java.util.concurrent.atomic.AtomicBoolean; @@ -67,7 +68,7 @@ protected GenericContainer startContainerWithCommand(String shellCommand, WaitSt protected GenericContainer startContainerWithCommand(String shellCommand, WaitStrategy waitStrategy, Integer... ports) { // apply WaitStrategy to container - return new GenericContainer(IMAGE_NAME) + return new GenericContainer(new DockerImageName(IMAGE_NAME)) .withExposedPorts(ports) .withCommand("sh", "-c", shellCommand) .waitingFor(waitStrategy.withStartupTimeout(Duration.ofMillis(WAIT_TIMEOUT_MILLIS))); diff --git a/core/src/test/java/org/testcontainers/junit/wait/strategy/HostPortWaitStrategyTest.java b/core/src/test/java/org/testcontainers/junit/wait/strategy/HostPortWaitStrategyTest.java index d715b25aaf6..48d574f57fc 100644 --- a/core/src/test/java/org/testcontainers/junit/wait/strategy/HostPortWaitStrategyTest.java +++ b/core/src/test/java/org/testcontainers/junit/wait/strategy/HostPortWaitStrategyTest.java @@ -4,6 +4,7 @@ import org.junit.Test; import org.testcontainers.containers.GenericContainer; import org.testcontainers.containers.wait.strategy.Wait; +import org.testcontainers.utility.DockerImageName; import java.time.Duration; @@ -18,7 +19,7 @@ public class HostPortWaitStrategyTest { private static final String IMAGE_NAME = "alpine:3.7"; @ClassRule - public static GenericContainer container = new GenericContainer(IMAGE_NAME).withExposedPorts() + public static GenericContainer container = new GenericContainer(new DockerImageName(IMAGE_NAME)).withExposedPorts() .withCommand("sh", "-c", "while true; do nc -lp 8080; done") .withExposedPorts(8080) .waitingFor(Wait.forListeningPort().withStartupTimeout(Duration.ofSeconds(10))); diff --git a/core/src/test/java/org/testcontainers/utility/AuthenticatedImagePullTest.java b/core/src/test/java/org/testcontainers/utility/AuthenticatedImagePullTest.java index 3986255f248..ad1fbc50732 100644 --- a/core/src/test/java/org/testcontainers/utility/AuthenticatedImagePullTest.java +++ b/core/src/test/java/org/testcontainers/utility/AuthenticatedImagePullTest.java @@ -99,7 +99,7 @@ public static void tearDown() { @Test public void testThatAuthLocatorIsUsedForContainerCreation() { // actually start a container, which will require an authenticated pull - try (final GenericContainer container = new GenericContainer<>(testImageNameWithTag) + try (final GenericContainer container = new GenericContainer(new DockerImageName(testImageNameWithTag)) .withCommand("/bin/sh", "-c", "sleep 10")) { container.start(); @@ -165,7 +165,7 @@ private Path getLocalTempFile(String s) throws IOException { private static void putImageInRegistry() throws InterruptedException { // It doesn't matter which image we use for this test, but use one that's likely to have been pulled already - final String dummySourceImage = TestcontainersConfiguration.getInstance().getRyukImage(); + final String dummySourceImage = TestcontainersConfiguration.getInstance().getRyukDockerImageName().toString(); client.pullImageCmd(dummySourceImage) .exec(new PullImageResultCallback()) diff --git a/docs/examples/junit4/generic/src/test/java/generic/CmdModifierTest.java b/docs/examples/junit4/generic/src/test/java/generic/CmdModifierTest.java index 6d075c0bccc..9140f560de3 100644 --- a/docs/examples/junit4/generic/src/test/java/generic/CmdModifierTest.java +++ b/docs/examples/junit4/generic/src/test/java/generic/CmdModifierTest.java @@ -4,6 +4,7 @@ import org.junit.Test; import org.testcontainers.containers.Container; import org.testcontainers.containers.GenericContainer; +import org.testcontainers.utility.DockerImageName; import java.io.IOException; @@ -13,13 +14,13 @@ public class CmdModifierTest { // hostname { @Rule - public GenericContainer theCache = new GenericContainer<>("redis:3.0.2") + public GenericContainer theCache = new GenericContainer<>(new DockerImageName("redis:3.0.2")) .withCreateContainerCmdModifier(cmd -> cmd.withHostName("the-cache")); // } // memory { @Rule - public GenericContainer memoryLimitedRedis = new GenericContainer<>("redis:3.0.2") + public GenericContainer memoryLimitedRedis = new GenericContainer<>(new DockerImageName("redis:3.0.2")) .withCreateContainerCmdModifier(cmd -> cmd.withMemory((long) 8 * 1024 * 1024)) .withCreateContainerCmdModifier(cmd -> cmd.withMemorySwap((long) 12 * 1024 * 1024)); // } diff --git a/docs/examples/junit4/generic/src/test/java/generic/CommandsTest.java b/docs/examples/junit4/generic/src/test/java/generic/CommandsTest.java index 486464c7dda..5b56c81f06f 100644 --- a/docs/examples/junit4/generic/src/test/java/generic/CommandsTest.java +++ b/docs/examples/junit4/generic/src/test/java/generic/CommandsTest.java @@ -3,13 +3,14 @@ import org.junit.Rule; import org.junit.Test; import org.testcontainers.containers.GenericContainer; +import org.testcontainers.utility.DockerImageName; import static org.junit.Assert.assertTrue; public class CommandsTest { @Rule // startupCommand { - public GenericContainer redisWithCustomPort = new GenericContainer("redis:5.0") + public GenericContainer redisWithCustomPort = new GenericContainer(new DockerImageName("redis:5.0")) .withCommand("redis-server --port 7777") // } .withExposedPorts(7777); diff --git a/docs/examples/junit4/generic/src/test/java/generic/ContainerCreationTest.java b/docs/examples/junit4/generic/src/test/java/generic/ContainerCreationTest.java index 19a40a7c43a..658d28e025f 100644 --- a/docs/examples/junit4/generic/src/test/java/generic/ContainerCreationTest.java +++ b/docs/examples/junit4/generic/src/test/java/generic/ContainerCreationTest.java @@ -3,6 +3,7 @@ import org.junit.ClassRule; import org.junit.Test; import org.testcontainers.containers.GenericContainer; +import org.testcontainers.utility.DockerImageName; import static org.junit.Assert.assertTrue; @@ -11,20 +12,20 @@ public class ContainerCreationTest { // simple { @ClassRule public static GenericContainer redis = - new GenericContainer("redis:3.0.2") + new GenericContainer(new DockerImageName("redis:3.0.2")) .withExposedPorts(6379); // } // withOptions { - // Set up a plain OS container and customize environment, - // command and exposed ports. This just listens on port 80 + // Set up a plain OS container and customize environment, + // command and exposed ports. This just listens on port 80 // and always returns '42' @ClassRule public static GenericContainer alpine = - new GenericContainer("alpine:3.2") + new GenericContainer(new DockerImageName("alpine:3.2")) .withExposedPorts(80) .withEnv("MAGIC_NUMBER", "42") - .withCommand("/bin/sh", "-c", + .withCommand("/bin/sh", "-c", "while true; do echo \"$MAGIC_NUMBER\" | nc -l -p 80; done"); // } diff --git a/docs/examples/junit4/generic/src/test/java/generic/ContainerLabelTest.java b/docs/examples/junit4/generic/src/test/java/generic/ContainerLabelTest.java index f8f26eaa5fe..0bb178767d2 100644 --- a/docs/examples/junit4/generic/src/test/java/generic/ContainerLabelTest.java +++ b/docs/examples/junit4/generic/src/test/java/generic/ContainerLabelTest.java @@ -1,13 +1,14 @@ package generic; import org.testcontainers.containers.GenericContainer; +import org.testcontainers.utility.DockerImageName; import java.util.HashMap; import java.util.Map; public class ContainerLabelTest { // single_label { - public GenericContainer containerWithLabel = new GenericContainer("alpine:3.6") + public GenericContainer containerWithLabel = new GenericContainer(new DockerImageName("alpine:3.6")) .withLabel("key", "value"); // } @@ -16,7 +17,7 @@ public class ContainerLabelTest { private Map mapOfLabels = new HashMap<>(); // populate map, e.g. mapOfLabels.put("key1", "value1"); - public GenericContainer containerWithMultipleLabels = new GenericContainer("alpine:3.6") + public GenericContainer containerWithMultipleLabels = new GenericContainer(new DockerImageName("alpine:3.6")) .withLabels(mapOfLabels); // } } diff --git a/docs/examples/junit4/generic/src/test/java/generic/ExecTest.java b/docs/examples/junit4/generic/src/test/java/generic/ExecTest.java index e160390c293..a40e96f31e1 100644 --- a/docs/examples/junit4/generic/src/test/java/generic/ExecTest.java +++ b/docs/examples/junit4/generic/src/test/java/generic/ExecTest.java @@ -4,6 +4,7 @@ import org.junit.Test; import org.testcontainers.containers.Container; import org.testcontainers.containers.GenericContainer; +import org.testcontainers.utility.DockerImageName; import java.io.IOException; @@ -12,7 +13,7 @@ public class ExecTest { @Rule - public GenericContainer container = new GenericContainer("alpine:3.6") + public GenericContainer container = new GenericContainer<>(new DockerImageName("alpine:3.6")) .withCommand("top"); @Test diff --git a/docs/examples/junit4/generic/src/test/java/generic/MultiplePortsExposedTest.java b/docs/examples/junit4/generic/src/test/java/generic/MultiplePortsExposedTest.java index f5a92423b6c..ac717685456 100644 --- a/docs/examples/junit4/generic/src/test/java/generic/MultiplePortsExposedTest.java +++ b/docs/examples/junit4/generic/src/test/java/generic/MultiplePortsExposedTest.java @@ -5,6 +5,7 @@ import org.slf4j.Logger; import org.testcontainers.containers.GenericContainer; import org.testcontainers.containers.output.Slf4jLogConsumer; +import org.testcontainers.utility.DockerImageName; import static org.slf4j.LoggerFactory.getLogger; @@ -14,7 +15,7 @@ public class MultiplePortsExposedTest { @Rule // rule { - public GenericContainer container = new GenericContainer("orientdb:3.0.13") + public GenericContainer container = new GenericContainer(new DockerImageName("orientdb:3.0.13")) .withExposedPorts(2424, 2480) .withLogConsumer(new Slf4jLogConsumer(log)); // } diff --git a/docs/examples/junit4/generic/src/test/java/generic/WaitStrategiesTest.java b/docs/examples/junit4/generic/src/test/java/generic/WaitStrategiesTest.java index 0bb5eb40bc1..b102826d6be 100644 --- a/docs/examples/junit4/generic/src/test/java/generic/WaitStrategiesTest.java +++ b/docs/examples/junit4/generic/src/test/java/generic/WaitStrategiesTest.java @@ -6,6 +6,7 @@ import org.testcontainers.containers.wait.strategy.HttpWaitStrategy; import org.testcontainers.containers.wait.strategy.Wait; import org.testcontainers.containers.wait.strategy.WaitStrategy; +import org.testcontainers.utility.DockerImageName; import static org.junit.Assert.assertTrue; @@ -13,20 +14,20 @@ public class WaitStrategiesTest { @Rule // waitForNetworkListening { - public GenericContainer nginx = new GenericContainer("nginx:1.9.4") + public GenericContainer nginx = new GenericContainer(new DockerImageName("nginx:1.9.4")) .withExposedPorts(80); // } @Rule // waitForSimpleHttp { - public GenericContainer nginxWithHttpWait = new GenericContainer("nginx:1.9.4") + public GenericContainer nginxWithHttpWait = new GenericContainer(new DockerImageName("nginx:1.9.4")) .withExposedPorts(80) .waitingFor(Wait.forHttp("/")); // } @Rule // logMessageWait { - public GenericContainer containerWithLogWait = new GenericContainer("redis:5.0.3") + public GenericContainer containerWithLogWait = new GenericContainer(new DockerImageName("redis:5.0.3")) .withExposedPorts(6379) .waitingFor( Wait.forLogMessage(".*Ready to accept connections.*\\n", 1) diff --git a/docs/examples/junit4/generic/src/test/java/org/testcontainers/containers/startupcheck/StartupCheckStrategyTest.java b/docs/examples/junit4/generic/src/test/java/org/testcontainers/containers/startupcheck/StartupCheckStrategyTest.java index deef64bc59b..c57b013362f 100644 --- a/docs/examples/junit4/generic/src/test/java/org/testcontainers/containers/startupcheck/StartupCheckStrategyTest.java +++ b/docs/examples/junit4/generic/src/test/java/org/testcontainers/containers/startupcheck/StartupCheckStrategyTest.java @@ -7,6 +7,7 @@ import org.junit.runners.Suite; import org.testcontainers.containers.GenericContainer; import org.testcontainers.containers.output.WaitingConsumer; +import org.testcontainers.utility.DockerImageName; import java.time.Duration; import java.util.concurrent.TimeUnit; @@ -35,7 +36,7 @@ private static void waitForHello(GenericContainer container) throws TimeoutExcep public static class OneShotStrategyTest { @Rule // withOneShotStrategy { - public GenericContainer bboxWithOneShot = new GenericContainer("busybox:1.31.1") + public GenericContainer bboxWithOneShot = new GenericContainer<>(new DockerImageName("busybox:1.31.1")) .withCommand(String.format("echo %s", HELLO_TESTCONTAINERS)) .withStartupCheckStrategy( new OneShotStartupCheckStrategy().withTimeout(Duration.ofSeconds(3)) @@ -54,7 +55,7 @@ public void testCommandIsExecuted() { public static class IndefiniteOneShotStrategyTest { @Rule // withIndefiniteOneShotStrategy { - public GenericContainer bboxWithIndefiniteOneShot = new GenericContainer("busybox:1.31.1") + public GenericContainer bboxWithIndefiniteOneShot = new GenericContainer<>(new DockerImageName("busybox:1.31.1")) .withCommand("sh", "-c", String.format("sleep 5 && echo \"%s\"", HELLO_TESTCONTAINERS)) .withStartupCheckStrategy( new IndefiniteWaitOneShotStartupCheckStrategy() @@ -73,7 +74,7 @@ public void testCommandIsExecuted() { public static class MinimumDurationStrategyTest { @Rule // withMinimumDurationStrategy { - public GenericContainer bboxWithMinimumDuration = new GenericContainer("busybox:1.31.1") + public GenericContainer bboxWithMinimumDuration = new GenericContainer<>(new DockerImageName("busybox:1.31.1")) .withCommand("sh", "-c", String.format("sleep 5 && echo \"%s\"", HELLO_TESTCONTAINERS)) .withStartupCheckStrategy( new MinimumDurationRunningStartupCheckStrategy(Duration.ofSeconds(1)) diff --git a/docs/examples/junit4/redis/src/test/java/quickstart/RedisBackedCacheIntTest.java b/docs/examples/junit4/redis/src/test/java/quickstart/RedisBackedCacheIntTest.java index f2ef1ab0220..fe364ab4a81 100644 --- a/docs/examples/junit4/redis/src/test/java/quickstart/RedisBackedCacheIntTest.java +++ b/docs/examples/junit4/redis/src/test/java/quickstart/RedisBackedCacheIntTest.java @@ -5,6 +5,7 @@ import org.junit.Rule; import org.junit.Test; import org.testcontainers.containers.GenericContainer; +import org.testcontainers.utility.DockerImageName; import static org.junit.Assert.assertEquals; @@ -14,7 +15,7 @@ public class RedisBackedCacheIntTest { // rule { @Rule - public GenericContainer redis = new GenericContainer<>("redis:5.0.3-alpine") + public GenericContainer redis = new GenericContainer(new DockerImageName("redis:5.0.3-alpine")) .withExposedPorts(6379); // } diff --git a/docs/examples/junit5/redis/src/test/java/quickstart/RedisBackedCacheIntTest.java b/docs/examples/junit5/redis/src/test/java/quickstart/RedisBackedCacheIntTest.java index 0f4f98fb669..da0a55cb536 100644 --- a/docs/examples/junit5/redis/src/test/java/quickstart/RedisBackedCacheIntTest.java +++ b/docs/examples/junit5/redis/src/test/java/quickstart/RedisBackedCacheIntTest.java @@ -6,6 +6,7 @@ import org.testcontainers.containers.GenericContainer; import org.testcontainers.junit.jupiter.Container; import org.testcontainers.junit.jupiter.Testcontainers; +import org.testcontainers.utility.DockerImageName; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -17,7 +18,7 @@ public class RedisBackedCacheIntTest { // container { @Container - public GenericContainer redis = new GenericContainer<>("redis:5.0.3-alpine") + public GenericContainer redis = new GenericContainer(new DockerImageName("redis:5.0.3-alpine")) .withExposedPorts(6379); // } diff --git a/examples/disque-job-queue/src/test/java/DisqueBackedMailSenderTest.java b/examples/disque-job-queue/src/test/java/DisqueBackedMailSenderTest.java index 5c78b3fdbd0..f6eed324304 100644 --- a/examples/disque-job-queue/src/test/java/DisqueBackedMailSenderTest.java +++ b/examples/disque-job-queue/src/test/java/DisqueBackedMailSenderTest.java @@ -4,10 +4,17 @@ import org.junit.Rule; import org.junit.Test; import org.testcontainers.containers.GenericContainer; +import org.testcontainers.utility.DockerImageName; import static org.mockito.Matchers.eq; -import static org.mockito.Mockito.*; -import static org.rnorth.visibleassertions.VisibleAssertions.*; +import static org.mockito.Mockito.any; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; +import static org.rnorth.visibleassertions.VisibleAssertions.assertEquals; +import static org.rnorth.visibleassertions.VisibleAssertions.context; +import static org.rnorth.visibleassertions.VisibleAssertions.info; /** * Created by rnorth on 03/01/2016. @@ -15,7 +22,7 @@ public class DisqueBackedMailSenderTest { @Rule - public GenericContainer container = new GenericContainer("richnorth/disque:1.0-rc1") + public GenericContainer container = new GenericContainer<>(new DockerImageName("richnorth/disque:1.0-rc1")) .withExposedPorts(7711); private DisqueClient disqueClient; diff --git a/examples/disque-job-queue/src/test/java/SingleDisqueInstanceTest.java b/examples/disque-job-queue/src/test/java/SingleDisqueInstanceTest.java index 8137f8fae90..30e3aa84066 100644 --- a/examples/disque-job-queue/src/test/java/SingleDisqueInstanceTest.java +++ b/examples/disque-job-queue/src/test/java/SingleDisqueInstanceTest.java @@ -7,10 +7,14 @@ import org.junit.Rule; import org.junit.Test; import org.testcontainers.containers.GenericContainer; +import org.testcontainers.utility.DockerImageName; import java.util.concurrent.TimeUnit; -import static org.rnorth.visibleassertions.VisibleAssertions.*; +import static org.rnorth.visibleassertions.VisibleAssertions.assertEquals; +import static org.rnorth.visibleassertions.VisibleAssertions.assertNotNull; +import static org.rnorth.visibleassertions.VisibleAssertions.context; +import static org.rnorth.visibleassertions.VisibleAssertions.info; /** * Created by rnorth on 03/01/2016. @@ -18,7 +22,7 @@ public class SingleDisqueInstanceTest { @Rule - public GenericContainer container = new GenericContainer("richnorth/disque:1.0-rc1") + public GenericContainer container = new GenericContainer<>(new DockerImageName("richnorth/disque:1.0-rc1")) .withExposedPorts(7711); private DisqueCommands connection; private AddJobArgs retryAfter1Second; diff --git a/examples/gradle/wrapper/gradle-wrapper.jar b/examples/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..62d4c053550b91381bbd28b1afc82d634bf73a8a GIT binary patch literal 58910 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 literal 0 HcmV?d00001 diff --git a/examples/gradle/wrapper/gradle-wrapper.properties b/examples/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 00000000000..622ab64a3cb --- /dev/null +++ b/examples/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-6.5-bin.zip +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/examples/gradlew b/examples/gradlew index 56f7b0fc7bf..fbd7c515832 100755 --- a/examples/gradlew +++ b/examples/gradlew @@ -80,7 +80,8 @@ case "`uname`" in ;; esac -CLASSPATH=$APP_HOME/../gradle/wrapper/gradle-wrapper.jar +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + # Determine the Java command to use to start the JVM. if [ -n "$JAVA_HOME" ] ; then @@ -129,6 +130,7 @@ fi if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then APP_HOME=`cygpath --path --mixed "$APP_HOME"` CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` # We build the pattern for arguments to be converted via cygpath @@ -154,19 +156,19 @@ if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then else eval `echo args$i`="\"$arg\"" fi - i=$((i+1)) + i=`expr $i + 1` done case $i in - (0) set -- ;; - (1) set -- "$args0" ;; - (2) set -- "$args0" "$args1" ;; - (3) set -- "$args0" "$args1" "$args2" ;; - (4) set -- "$args0" "$args1" "$args2" "$args3" ;; - (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; - (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; - (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; - (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; - (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + 0) set -- ;; + 1) set -- "$args0" ;; + 2) set -- "$args0" "$args1" ;; + 3) set -- "$args0" "$args1" "$args2" ;; + 4) set -- "$args0" "$args1" "$args2" "$args3" ;; + 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; esac fi @@ -175,14 +177,9 @@ save () { for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done echo " " } -APP_ARGS=$(save "$@") +APP_ARGS=`save "$@"` # Collect all arguments for the java command, following the shell quoting and substitution rules eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" -# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong -if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then - cd "$(dirname "$0")" -fi - exec "$JAVACMD" "$@" diff --git a/examples/gradlew.bat b/examples/gradlew.bat index f3a074d99d4..5093609d512 100644 --- a/examples/gradlew.bat +++ b/examples/gradlew.bat @@ -29,6 +29,9 @@ if "%DIRNAME%" == "" set DIRNAME=. set APP_BASE_NAME=%~n0 set APP_HOME=%DIRNAME% +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" @@ -79,7 +82,8 @@ set CMD_LINE_ARGS=%* :execute @rem Setup the command line -set CLASSPATH=%APP_HOME%\..\gradle\wrapper\gradle-wrapper.jar +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + @rem Execute Gradle "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% diff --git a/examples/redis-backed-cache-testng/src/test/java/RedisBackedCacheTest.java b/examples/redis-backed-cache-testng/src/test/java/RedisBackedCacheTest.java index ad2d62a2f04..59b17b22f7e 100644 --- a/examples/redis-backed-cache-testng/src/test/java/RedisBackedCacheTest.java +++ b/examples/redis-backed-cache-testng/src/test/java/RedisBackedCacheTest.java @@ -9,14 +9,16 @@ import java.util.Optional; -import static org.rnorth.visibleassertions.VisibleAssertions.*; +import static org.rnorth.visibleassertions.VisibleAssertions.assertEquals; +import static org.rnorth.visibleassertions.VisibleAssertions.assertFalse; +import static org.rnorth.visibleassertions.VisibleAssertions.assertTrue; /** * Integration test for Redis-backed cache implementation. */ public class RedisBackedCacheTest { - private static GenericContainer redis = new GenericContainer("redis:3.0.6").withExposedPorts(6379); + private static GenericContainer redis = new GenericContainer(org.testcontainers.utility.DockerImageName.dockerImage("redis:3.0.6")).withExposedPorts(6379); private Cache cache; diff --git a/examples/redis-backed-cache/src/test/java/RedisBackedCacheTest.java b/examples/redis-backed-cache/src/test/java/RedisBackedCacheTest.java index eaff293e518..823742cd862 100644 --- a/examples/redis-backed-cache/src/test/java/RedisBackedCacheTest.java +++ b/examples/redis-backed-cache/src/test/java/RedisBackedCacheTest.java @@ -4,11 +4,14 @@ import org.junit.Rule; import org.junit.Test; import org.testcontainers.containers.GenericContainer; +import org.testcontainers.utility.DockerImageName; import redis.clients.jedis.Jedis; import java.util.Optional; -import static org.rnorth.visibleassertions.VisibleAssertions.*; +import static org.rnorth.visibleassertions.VisibleAssertions.assertEquals; +import static org.rnorth.visibleassertions.VisibleAssertions.assertFalse; +import static org.rnorth.visibleassertions.VisibleAssertions.assertTrue; /** * Integration test for Redis-backed cache implementation. @@ -16,7 +19,7 @@ public class RedisBackedCacheTest { @Rule - public GenericContainer redis = new GenericContainer("redis:3.0.6") + public GenericContainer redis = new GenericContainer<>(new DockerImageName("redis:3.0.6")) .withExposedPorts(6379); private Cache cache; diff --git a/examples/singleton-container/src/test/java/com/example/AbstractIntegrationTest.java b/examples/singleton-container/src/test/java/com/example/AbstractIntegrationTest.java index d779adc5630..e6482e6c03e 100644 --- a/examples/singleton-container/src/test/java/com/example/AbstractIntegrationTest.java +++ b/examples/singleton-container/src/test/java/com/example/AbstractIntegrationTest.java @@ -1,10 +1,11 @@ package com.example; import org.testcontainers.containers.GenericContainer; +import org.testcontainers.utility.DockerImageName; public abstract class AbstractIntegrationTest { - public static final GenericContainer redis = new GenericContainer("redis:3.0.6") + public static final GenericContainer redis = new GenericContainer<>(new DockerImageName("redis:3.0.6")) .withExposedPorts(6379); static { diff --git a/examples/spring-boot/src/test/java/com/example/AbstractIntegrationTest.java b/examples/spring-boot/src/test/java/com/example/AbstractIntegrationTest.java index 79828923d7d..9539a054328 100644 --- a/examples/spring-boot/src/test/java/com/example/AbstractIntegrationTest.java +++ b/examples/spring-boot/src/test/java/com/example/AbstractIntegrationTest.java @@ -8,6 +8,7 @@ import org.springframework.test.context.DynamicPropertySource; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.testcontainers.containers.GenericContainer; +import org.testcontainers.utility.DockerImageName; @RunWith(SpringJUnit4ClassRunner.class) @SpringBootTest(classes = DemoApplication.class, webEnvironment = WebEnvironment.RANDOM_PORT, properties = { @@ -16,7 +17,7 @@ @ActiveProfiles("test") public abstract class AbstractIntegrationTest { - static GenericContainer redis = new GenericContainer("redis:3-alpine") + static GenericContainer redis = new GenericContainer<>(new DockerImageName("redis:3-alpine")) .withExposedPorts(6379); @DynamicPropertySource diff --git a/modules/cassandra/src/main/java/org/testcontainers/containers/CassandraContainer.java b/modules/cassandra/src/main/java/org/testcontainers/containers/CassandraContainer.java index 27c2f182e9e..9f3614f568f 100644 --- a/modules/cassandra/src/main/java/org/testcontainers/containers/CassandraContainer.java +++ b/modules/cassandra/src/main/java/org/testcontainers/containers/CassandraContainer.java @@ -7,6 +7,7 @@ import org.testcontainers.delegate.DatabaseDelegate; import org.testcontainers.ext.ScriptUtils; import org.testcontainers.ext.ScriptUtils.ScriptLoadException; +import org.testcontainers.utility.DockerImageName; import org.testcontainers.utility.MountableFile; import javax.script.ScriptException; @@ -24,7 +25,9 @@ */ public class CassandraContainer> extends GenericContainer { + @Deprecated public static final String IMAGE = "cassandra"; + public static final Integer CQL_PORT = 9042; private static final String CONTAINER_CONFIG_LOCATION = "/etc/cassandra"; private static final String USERNAME = "cassandra"; @@ -34,11 +37,23 @@ public class CassandraContainer> extends G private String initScriptPath; private boolean enableJmxReporting; + /** + * @deprecated use {@link #CassandraContainer(DockerImageName)} instead + */ + @Deprecated public CassandraContainer() { - this(IMAGE + ":3.11.2"); + this("cassandra:3.11.2"); } + /** + * @deprecated use {@link #CassandraContainer(DockerImageName)} instead + */ + @Deprecated public CassandraContainer(String dockerImageName) { + this(new DockerImageName(dockerImageName)); + } + + public CassandraContainer(DockerImageName dockerImageName) { super(dockerImageName); addExposedPort(CQL_PORT); setStartupAttempts(3); diff --git a/modules/cassandra/src/test/java/org/testcontainers/containers/CassandraContainerTest.java b/modules/cassandra/src/test/java/org/testcontainers/containers/CassandraContainerTest.java index 5bc68aa9972..b08db1f052d 100644 --- a/modules/cassandra/src/test/java/org/testcontainers/containers/CassandraContainerTest.java +++ b/modules/cassandra/src/test/java/org/testcontainers/containers/CassandraContainerTest.java @@ -7,8 +7,11 @@ import lombok.extern.slf4j.Slf4j; import org.junit.Test; import org.testcontainers.containers.wait.CassandraQueryWaitStrategy; +import org.testcontainers.utility.DockerImageName; -import static org.junit.Assert.*; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; /** * @author Eugeny Karpov @@ -16,11 +19,13 @@ @Slf4j public class CassandraContainerTest { + private static final DockerImageName CASSANDRA_IMAGE = new DockerImageName("cassandra:3.11.2"); + private static final String TEST_CLUSTER_NAME_IN_CONF = "Test Cluster Integration Test"; @Test public void testSimple() { - try (CassandraContainer cassandraContainer = new CassandraContainer<>()) { + try (CassandraContainer cassandraContainer = new CassandraContainer<>(CASSANDRA_IMAGE)) { cassandraContainer.start(); ResultSet resultSet = performQuery(cassandraContainer, "SELECT release_version FROM system.local"); assertTrue("Query was not applied", resultSet.wasApplied()); @@ -31,7 +36,7 @@ public void testSimple() { @Test public void testSpecificVersion() { String cassandraVersion = "3.0.15"; - try (CassandraContainer cassandraContainer = new CassandraContainer<>("cassandra:" + cassandraVersion)) { + try (CassandraContainer cassandraContainer = new CassandraContainer<>(CASSANDRA_IMAGE.withTag(cassandraVersion))) { cassandraContainer.start(); ResultSet resultSet = performQuery(cassandraContainer, "SELECT release_version FROM system.local"); assertTrue("Query was not applied", resultSet.wasApplied()); @@ -42,7 +47,7 @@ public void testSpecificVersion() { @Test public void testConfigurationOverride() { try ( - CassandraContainer cassandraContainer = new CassandraContainer<>() + CassandraContainer cassandraContainer = new CassandraContainer<>(CASSANDRA_IMAGE) .withConfigurationOverride("cassandra-test-configuration-example") ) { cassandraContainer.start(); @@ -55,7 +60,7 @@ public void testConfigurationOverride() { @Test(expected = ContainerLaunchException.class) public void testEmptyConfigurationOverride() { try ( - CassandraContainer cassandraContainer = new CassandraContainer<>() + CassandraContainer cassandraContainer = new CassandraContainer<>(CASSANDRA_IMAGE) .withConfigurationOverride("cassandra-empty-configuration") ) { cassandraContainer.start(); @@ -65,7 +70,7 @@ public void testEmptyConfigurationOverride() { @Test public void testInitScript() { try ( - CassandraContainer cassandraContainer = new CassandraContainer<>() + CassandraContainer cassandraContainer = new CassandraContainer<>(CASSANDRA_IMAGE) .withInitScript("initial.cql") ) { cassandraContainer.start(); @@ -76,7 +81,7 @@ public void testInitScript() { @Test public void testInitScriptWithLegacyCassandra() { try ( - CassandraContainer cassandraContainer = new CassandraContainer<>("cassandra:2.2.11") + CassandraContainer cassandraContainer = new CassandraContainer<>(new DockerImageName("cassandra:2.2.11")) .withInitScript("initial.cql") ) { cassandraContainer.start(); @@ -84,10 +89,11 @@ public void testInitScriptWithLegacyCassandra() { } } + @SuppressWarnings("deprecation") // Using deprecated constructor for verification of backwards compatibility @Test public void testCassandraQueryWaitStrategy() { try ( - CassandraContainer cassandraContainer = new CassandraContainer<>() + CassandraContainer cassandraContainer = new CassandraContainer<>() .waitingFor(new CassandraQueryWaitStrategy()) ) { cassandraContainer.start(); @@ -96,9 +102,10 @@ public void testCassandraQueryWaitStrategy() { } } + @SuppressWarnings("deprecation") // Using deprecated constructor for verification of backwards compatibility @Test public void testCassandraGetCluster() { - try (CassandraContainer cassandraContainer = new CassandraContainer<>()) { + try (CassandraContainer cassandraContainer = new CassandraContainer<>()) { cassandraContainer.start(); ResultSet resultSet = performQuery(cassandraContainer.getCluster(), "SELECT release_version FROM system.local"); assertTrue("Query was not applied", resultSet.wasApplied()); @@ -106,7 +113,7 @@ public void testCassandraGetCluster() { } } - private void testInitScript(CassandraContainer cassandraContainer) { + private void testInitScript(CassandraContainer cassandraContainer) { ResultSet resultSet = performQuery(cassandraContainer, "SELECT * FROM keySpaceTest.catalog_category"); assertTrue("Query was not applied", resultSet.wasApplied()); Row row = resultSet.one(); @@ -114,7 +121,7 @@ private void testInitScript(CassandraContainer cassandraContainer) { assertEquals("Inserted row is not in expected state", "test_category", row.getString(1)); } - private ResultSet performQuery(CassandraContainer cassandraContainer, String cql) { + private ResultSet performQuery(CassandraContainer cassandraContainer, String cql) { Cluster explicitCluster = Cluster.builder() .addContactPoint(cassandraContainer.getHost()) .withPort(cassandraContainer.getMappedPort(CassandraContainer.CQL_PORT)) diff --git a/modules/clickhouse/src/main/java/org/testcontainers/containers/ClickHouseContainer.java b/modules/clickhouse/src/main/java/org/testcontainers/containers/ClickHouseContainer.java index dd48f32bece..65955c584a7 100644 --- a/modules/clickhouse/src/main/java/org/testcontainers/containers/ClickHouseContainer.java +++ b/modules/clickhouse/src/main/java/org/testcontainers/containers/ClickHouseContainer.java @@ -1,12 +1,14 @@ package org.testcontainers.containers; import org.testcontainers.containers.wait.strategy.HttpWaitStrategy; +import org.testcontainers.utility.DockerImageName; import java.time.Duration; public class ClickHouseContainer extends JdbcDatabaseContainer { public static final String NAME = "clickhouse"; public static final String IMAGE = "yandex/clickhouse-server"; + @Deprecated public static final String DEFAULT_TAG = "18.10.3"; public static final Integer HTTP_PORT = 8123; @@ -20,11 +22,17 @@ public class ClickHouseContainer extends JdbcDatabaseContainer { private String username = "default"; private String password = ""; + @Deprecated public ClickHouseContainer() { super(IMAGE + ":" + DEFAULT_TAG); } + @Deprecated public ClickHouseContainer(String dockerImageName) { + this(new DockerImageName(dockerImageName)); + } + + public ClickHouseContainer(final DockerImageName dockerImageName) { super(dockerImageName); withExposedPorts(HTTP_PORT, NATIVE_PORT); diff --git a/modules/clickhouse/src/main/java/org/testcontainers/containers/ClickHouseProvider.java b/modules/clickhouse/src/main/java/org/testcontainers/containers/ClickHouseProvider.java index be5a01657f0..297cf888c90 100644 --- a/modules/clickhouse/src/main/java/org/testcontainers/containers/ClickHouseProvider.java +++ b/modules/clickhouse/src/main/java/org/testcontainers/containers/ClickHouseProvider.java @@ -1,5 +1,7 @@ package org.testcontainers.containers; +import org.testcontainers.utility.DockerImageName; + public class ClickHouseProvider extends JdbcDatabaseContainerProvider { @Override public boolean supports(String databaseType) { @@ -8,6 +10,6 @@ public boolean supports(String databaseType) { @Override public JdbcDatabaseContainer newInstance(String tag) { - return new ClickHouseContainer(ClickHouseContainer.IMAGE + ":" + tag); + return new ClickHouseContainer(new DockerImageName(ClickHouseContainer.IMAGE, tag)); } } diff --git a/modules/cockroachdb/src/main/java/org/testcontainers/containers/CockroachContainer.java b/modules/cockroachdb/src/main/java/org/testcontainers/containers/CockroachContainer.java index de64902c88a..055806a3e2b 100644 --- a/modules/cockroachdb/src/main/java/org/testcontainers/containers/CockroachContainer.java +++ b/modules/cockroachdb/src/main/java/org/testcontainers/containers/CockroachContainer.java @@ -1,6 +1,7 @@ package org.testcontainers.containers; import org.testcontainers.containers.wait.strategy.HttpWaitStrategy; +import org.testcontainers.utility.DockerImageName; import java.time.Duration; @@ -18,11 +19,17 @@ public class CockroachContainer extends JdbcDatabaseContainer { /** * Creates a new couchbase container with the default image and version. */ + @Deprecated public CouchbaseContainer() { this(DOCKER_IMAGE_NAME + ":" + VERSION); } @@ -95,10 +97,15 @@ public CouchbaseContainer() { /** * Creates a new couchbase container with a custom image name. * - * @param imageName the image name that should be used. + * @param dockerImageName the image name that should be used. */ - public CouchbaseContainer(final String imageName) { - super(imageName); + @Deprecated + public CouchbaseContainer(final String dockerImageName) { + this(new DockerImageName(dockerImageName)); + } + + public CouchbaseContainer(final DockerImageName dockerImageName) { + super(dockerImageName); } /** diff --git a/modules/couchbase/src/test/java/org/testcontainers/couchbase/CouchbaseContainerTest.java b/modules/couchbase/src/test/java/org/testcontainers/couchbase/CouchbaseContainerTest.java index c5c9f18a58b..586a7a457bb 100644 --- a/modules/couchbase/src/test/java/org/testcontainers/couchbase/CouchbaseContainerTest.java +++ b/modules/couchbase/src/test/java/org/testcontainers/couchbase/CouchbaseContainerTest.java @@ -24,6 +24,7 @@ import com.couchbase.client.java.env.CouchbaseEnvironment; import com.couchbase.client.java.env.DefaultCouchbaseEnvironment; import org.junit.Test; +import org.testcontainers.utility.DockerImageName; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; @@ -38,7 +39,7 @@ public void testBasicContainerUsage() { try ( // container_definition { - CouchbaseContainer container = new CouchbaseContainer() + CouchbaseContainer container = new CouchbaseContainer(new DockerImageName("couchbase/server:6.5.1")) .withBucket(bucketDefinition) // } ) { diff --git a/modules/db2/src/main/java/org/testcontainers/containers/Db2Container.java b/modules/db2/src/main/java/org/testcontainers/containers/Db2Container.java index 05edcb2c3ed..462c944bd8d 100644 --- a/modules/db2/src/main/java/org/testcontainers/containers/Db2Container.java +++ b/modules/db2/src/main/java/org/testcontainers/containers/Db2Container.java @@ -1,6 +1,7 @@ package org.testcontainers.containers; import org.testcontainers.containers.wait.strategy.LogMessageWaitStrategy; +import org.testcontainers.utility.DockerImageName; import org.testcontainers.utility.LicenseAcceptance; import java.time.Duration; @@ -19,12 +20,18 @@ public class Db2Container extends JdbcDatabaseContainer { private String username = "db2inst1"; private String password = "foobar1234"; + @Deprecated public Db2Container() { this(DEFAULT_DB2_IMAGE_NAME + ":" + DEFAULT_TAG); } - public Db2Container(String imageName) { - super(imageName); + @Deprecated + public Db2Container(String dockerImageName) { + this(new DockerImageName(dockerImageName)); + } + + public Db2Container(final DockerImageName dockerImageName) { + super(dockerImageName); withPrivilegedMode(true); this.waitStrategy = new LogMessageWaitStrategy() .withRegEx(".*Setup has completed\\..*") diff --git a/modules/db2/src/main/java/org/testcontainers/containers/Db2ContainerProvider.java b/modules/db2/src/main/java/org/testcontainers/containers/Db2ContainerProvider.java index 5c78fdc0505..d1a204f76c0 100644 --- a/modules/db2/src/main/java/org/testcontainers/containers/Db2ContainerProvider.java +++ b/modules/db2/src/main/java/org/testcontainers/containers/Db2ContainerProvider.java @@ -1,5 +1,7 @@ package org.testcontainers.containers; +import org.testcontainers.utility.DockerImageName; + public class Db2ContainerProvider extends JdbcDatabaseContainerProvider { @Override public boolean supports(String databaseType) { @@ -13,6 +15,6 @@ public JdbcDatabaseContainer newInstance() { @Override public JdbcDatabaseContainer newInstance(String tag) { - return new Db2Container(Db2Container.DEFAULT_DB2_IMAGE_NAME + ":" + tag); + return new Db2Container(new DockerImageName(Db2Container.DEFAULT_DB2_IMAGE_NAME, tag)); } } diff --git a/modules/dynalite/src/main/java/org/testcontainers/dynamodb/DynaliteContainer.java b/modules/dynalite/src/main/java/org/testcontainers/dynamodb/DynaliteContainer.java index 6280ddb9421..8711cee90e0 100644 --- a/modules/dynalite/src/main/java/org/testcontainers/dynamodb/DynaliteContainer.java +++ b/modules/dynalite/src/main/java/org/testcontainers/dynamodb/DynaliteContainer.java @@ -7,6 +7,7 @@ import com.amazonaws.services.dynamodbv2.AmazonDynamoDB; import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClientBuilder; import org.testcontainers.containers.GenericContainer; +import org.testcontainers.utility.DockerImageName; /** * Container for Dynalite, a DynamoDB clone. @@ -16,15 +17,22 @@ public class DynaliteContainer extends GenericContainer { private static final String IMAGE_NAME = "quay.io/testcontainers/dynalite:v1.2.1-1"; private static final int MAPPED_PORT = 4567; + @Deprecated public DynaliteContainer() { this(IMAGE_NAME); withExposedPorts(MAPPED_PORT); } - public DynaliteContainer(String imageName) { - super(imageName); + @Deprecated + public DynaliteContainer(String dockerImageName) { + this(new DockerImageName(dockerImageName)); } + public DynaliteContainer(final DockerImageName dockerImageName) { + super(dockerImageName); + } + + /** * Gets a preconfigured {@link AmazonDynamoDB} client object for connecting to this * container. diff --git a/modules/dynalite/src/test/java/org/testcontainers/dynamodb/DynaliteContainerTest.java b/modules/dynalite/src/test/java/org/testcontainers/dynamodb/DynaliteContainerTest.java index 524d3f6c34c..3406ea850ef 100644 --- a/modules/dynalite/src/test/java/org/testcontainers/dynamodb/DynaliteContainerTest.java +++ b/modules/dynalite/src/test/java/org/testcontainers/dynamodb/DynaliteContainerTest.java @@ -2,9 +2,16 @@ import com.amazonaws.services.dynamodbv2.AmazonDynamoDB; import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClientBuilder; -import com.amazonaws.services.dynamodbv2.model.*; +import com.amazonaws.services.dynamodbv2.model.AttributeDefinition; +import com.amazonaws.services.dynamodbv2.model.CreateTableRequest; +import com.amazonaws.services.dynamodbv2.model.KeySchemaElement; +import com.amazonaws.services.dynamodbv2.model.KeyType; +import com.amazonaws.services.dynamodbv2.model.ProvisionedThroughput; +import com.amazonaws.services.dynamodbv2.model.ScalarAttributeType; +import com.amazonaws.services.dynamodbv2.model.TableDescription; import org.junit.Rule; import org.junit.Test; +import org.testcontainers.utility.DockerImageName; import static org.rnorth.visibleassertions.VisibleAssertions.assertEquals; import static org.rnorth.visibleassertions.VisibleAssertions.assertNotNull; @@ -12,7 +19,7 @@ public class DynaliteContainerTest { @Rule - public DynaliteContainer dynamoDB = new DynaliteContainer(); + public DynaliteContainer dynamoDB = new DynaliteContainer(new DockerImageName("quay.io/testcontainers/dynalite:v1.2.1-1")); @Test public void simpleTestWithManualClientCreation() { diff --git a/modules/elasticsearch/src/main/java/org/testcontainers/elasticsearch/ElasticsearchContainer.java b/modules/elasticsearch/src/main/java/org/testcontainers/elasticsearch/ElasticsearchContainer.java index e9a0b95d7ed..b149fe30408 100644 --- a/modules/elasticsearch/src/main/java/org/testcontainers/elasticsearch/ElasticsearchContainer.java +++ b/modules/elasticsearch/src/main/java/org/testcontainers/elasticsearch/ElasticsearchContainer.java @@ -3,6 +3,7 @@ import org.testcontainers.containers.GenericContainer; import org.testcontainers.containers.wait.strategy.HttpWaitStrategy; import org.testcontainers.utility.Base58; +import org.testcontainers.utility.DockerImageName; import java.net.InetSocketAddress; import java.time.Duration; @@ -36,6 +37,7 @@ public class ElasticsearchContainer extends GenericContainer> extends Gen private String password = "any"; + @Deprecated public InfluxDBContainer() { this(VERSION); } + @Deprecated public InfluxDBContainer(final String version) { - super(IMAGE_NAME + ":" + version); + this(new DockerImageName(IMAGE_NAME + ":" + version)); + } + + public InfluxDBContainer(final DockerImageName dockerImageName) { + super(dockerImageName); waitStrategy = new WaitAllStrategy() .withStrategy(Wait.forHttp("/ping").withBasicCredentials(username, password).forStatusCode(204)) .withStrategy(Wait.forListeningPort()); diff --git a/modules/jdbc/src/main/java/org/testcontainers/containers/JdbcDatabaseContainer.java b/modules/jdbc/src/main/java/org/testcontainers/containers/JdbcDatabaseContainer.java index 62fe43e7932..132365c04c5 100644 --- a/modules/jdbc/src/main/java/org/testcontainers/containers/JdbcDatabaseContainer.java +++ b/modules/jdbc/src/main/java/org/testcontainers/containers/JdbcDatabaseContainer.java @@ -8,6 +8,7 @@ import org.testcontainers.delegate.DatabaseDelegate; import org.testcontainers.ext.ScriptUtils; import org.testcontainers.jdbc.JdbcDatabaseDelegate; +import org.testcontainers.utility.DockerImageName; import org.testcontainers.utility.MountableFile; import java.sql.Connection; @@ -38,14 +39,19 @@ public abstract class JdbcDatabaseContainer image) { super(image); } + public JdbcDatabaseContainer(final DockerImageName dockerImageName) { + super(dockerImageName); + } + /** * @return the name of the actual JDBC driver to use */ diff --git a/modules/jdbc/src/test/java/org/testcontainers/jdbc/MissingJdbcDriverTest.java b/modules/jdbc/src/test/java/org/testcontainers/jdbc/MissingJdbcDriverTest.java index 38ae38095eb..1e024bb721b 100644 --- a/modules/jdbc/src/test/java/org/testcontainers/jdbc/MissingJdbcDriverTest.java +++ b/modules/jdbc/src/test/java/org/testcontainers/jdbc/MissingJdbcDriverTest.java @@ -3,6 +3,7 @@ import com.google.common.base.Throwables; import org.junit.Test; import org.testcontainers.containers.JdbcDatabaseContainer; +import org.testcontainers.utility.DockerImageName; import java.sql.Connection; import java.sql.SQLException; @@ -39,7 +40,7 @@ static class MissingDriverContainer extends JdbcDatabaseContainer { private final AtomicInteger connectionAttempts = new AtomicInteger(); MissingDriverContainer() { - super("mysql:5.7.22"); + super(new DockerImageName("mysql:5.7.22")); withEnv("MYSQL_ROOT_PASSWORD", "test"); withExposedPorts(3306); } diff --git a/modules/junit-jupiter/src/test/java/org/testcontainers/junit/jupiter/TestcontainersNestedRestartedContainerTests.java b/modules/junit-jupiter/src/test/java/org/testcontainers/junit/jupiter/TestcontainersNestedRestartedContainerTests.java index 4d27c410979..ac3a0e867c6 100644 --- a/modules/junit-jupiter/src/test/java/org/testcontainers/junit/jupiter/TestcontainersNestedRestartedContainerTests.java +++ b/modules/junit-jupiter/src/test/java/org/testcontainers/junit/jupiter/TestcontainersNestedRestartedContainerTests.java @@ -3,8 +3,8 @@ import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; import org.testcontainers.containers.GenericContainer; +import org.testcontainers.utility.DockerImageName; -import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotEquals; import static org.junit.jupiter.api.Assertions.assertTrue; @@ -12,7 +12,7 @@ class TestcontainersNestedRestartedContainerTests { @Container - private final GenericContainer topLevelContainer = new GenericContainer("httpd:2.4-alpine") + private final GenericContainer topLevelContainer = new GenericContainer(new DockerImageName("httpd:2.4-alpine")) .withExposedPorts(80); private static String topLevelContainerId; @@ -29,7 +29,7 @@ void top_level_container_should_be_running() { class NestedTestCase { @Container - private final GenericContainer nestedContainer = new GenericContainer("httpd:2.4-alpine") + private final GenericContainer nestedContainer = new GenericContainer(new DockerImageName("httpd:2.4-alpine")) .withExposedPorts(80); @Test diff --git a/modules/junit-jupiter/src/test/java/org/testcontainers/junit/jupiter/TestcontainersNestedSharedContainerTests.java b/modules/junit-jupiter/src/test/java/org/testcontainers/junit/jupiter/TestcontainersNestedSharedContainerTests.java index 371a5bae178..0ee7b81f4b3 100644 --- a/modules/junit-jupiter/src/test/java/org/testcontainers/junit/jupiter/TestcontainersNestedSharedContainerTests.java +++ b/modules/junit-jupiter/src/test/java/org/testcontainers/junit/jupiter/TestcontainersNestedSharedContainerTests.java @@ -3,6 +3,7 @@ import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; import org.testcontainers.containers.GenericContainer; +import org.testcontainers.utility.DockerImageName; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertTrue; @@ -11,7 +12,7 @@ class TestcontainersNestedSharedContainerTests { @Container - private static final GenericContainer TOP_LEVEL_CONTAINER = new GenericContainer("httpd:2.4-alpine") + private static final GenericContainer TOP_LEVEL_CONTAINER = new GenericContainer(new DockerImageName("httpd:2.4-alpine")) .withExposedPorts(80); private static String topLevelContainerId; diff --git a/modules/junit-jupiter/src/test/java/org/testcontainers/junit/jupiter/TestcontainersRestartBetweenTests.java b/modules/junit-jupiter/src/test/java/org/testcontainers/junit/jupiter/TestcontainersRestartBetweenTests.java index 2d6959ae065..ca26785b02d 100644 --- a/modules/junit-jupiter/src/test/java/org/testcontainers/junit/jupiter/TestcontainersRestartBetweenTests.java +++ b/modules/junit-jupiter/src/test/java/org/testcontainers/junit/jupiter/TestcontainersRestartBetweenTests.java @@ -2,6 +2,7 @@ import org.junit.jupiter.api.Test; import org.testcontainers.containers.GenericContainer; +import org.testcontainers.utility.DockerImageName; import static org.junit.jupiter.api.Assertions.assertNotEquals; @@ -9,7 +10,7 @@ class TestcontainersRestartBetweenTests { @Container - private GenericContainer genericContainer = new GenericContainer("httpd:2.4-alpine") + private GenericContainer genericContainer = new GenericContainer(new DockerImageName("httpd:2.4-alpine")) .withExposedPorts(80); private static String lastContainerId; diff --git a/modules/junit-jupiter/src/test/java/org/testcontainers/junit/jupiter/TestcontainersSharedContainerTests.java b/modules/junit-jupiter/src/test/java/org/testcontainers/junit/jupiter/TestcontainersSharedContainerTests.java index 321c0d6282f..efc7177f80e 100644 --- a/modules/junit-jupiter/src/test/java/org/testcontainers/junit/jupiter/TestcontainersSharedContainerTests.java +++ b/modules/junit-jupiter/src/test/java/org/testcontainers/junit/jupiter/TestcontainersSharedContainerTests.java @@ -3,6 +3,7 @@ import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; import org.testcontainers.containers.GenericContainer; +import org.testcontainers.utility.DockerImageName; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertTrue; @@ -11,7 +12,7 @@ class TestcontainersSharedContainerTests { @Container - private static final GenericContainer GENERIC_CONTAINER = new GenericContainer("httpd:2.4-alpine") + private static final GenericContainer GENERIC_CONTAINER = new GenericContainer(new DockerImageName("httpd:2.4-alpine")) .withExposedPorts(80); private static String lastContainerId; diff --git a/modules/kafka/src/main/java/org/testcontainers/containers/KafkaContainer.java b/modules/kafka/src/main/java/org/testcontainers/containers/KafkaContainer.java index bb92f85b03c..8590b4e8013 100644 --- a/modules/kafka/src/main/java/org/testcontainers/containers/KafkaContainer.java +++ b/modules/kafka/src/main/java/org/testcontainers/containers/KafkaContainer.java @@ -4,6 +4,7 @@ import com.github.dockerjava.api.command.InspectContainerResponse; import lombok.SneakyThrows; import org.testcontainers.images.builder.Transferable; +import org.testcontainers.utility.DockerImageName; import org.testcontainers.utility.TestcontainersConfiguration; import java.nio.charset.StandardCharsets; @@ -31,12 +32,18 @@ public class KafkaContainer extends GenericContainer { private boolean useImplicitNetwork = true; + @Deprecated public KafkaContainer() { this("5.2.1"); } + @Deprecated public KafkaContainer(String confluentPlatformVersion) { - super(TestcontainersConfiguration.getInstance().getKafkaImage() + ":" + confluentPlatformVersion); + this(new DockerImageName(TestcontainersConfiguration.getInstance().getKafkaImage() + ":" + confluentPlatformVersion)); + } + + public KafkaContainer(final DockerImageName dockerImageName) { + super(dockerImageName); super.withNetwork(Network.SHARED); withExposedPorts(KAFKA_PORT); diff --git a/modules/kafka/src/test/java/org/testcontainers/containers/KafkaContainerTest.java b/modules/kafka/src/test/java/org/testcontainers/containers/KafkaContainerTest.java index 1490caa3328..30ed783d0b4 100644 --- a/modules/kafka/src/test/java/org/testcontainers/containers/KafkaContainerTest.java +++ b/modules/kafka/src/test/java/org/testcontainers/containers/KafkaContainerTest.java @@ -12,6 +12,7 @@ import org.apache.kafka.common.serialization.StringSerializer; import org.junit.Test; import org.rnorth.ducttape.unreliables.Unreliables; +import org.testcontainers.utility.DockerImageName; import java.time.Duration; import java.util.Arrays; @@ -41,7 +42,7 @@ public void testExternalZookeeperWithKafkaNetwork() throws Exception { KafkaContainer kafka = new KafkaContainer() .withExternalZookeeper("zookeeper:2181"); - GenericContainer zookeeper = new GenericContainer("confluentinc/cp-zookeeper:4.0.0") + GenericContainer zookeeper = new GenericContainer(new DockerImageName("confluentinc/cp-zookeeper:4.0.0")) .withNetwork(kafka.getNetwork()) .withNetworkAliases("zookeeper") .withEnv("ZOOKEEPER_CLIENT_PORT", "2181"); @@ -62,7 +63,7 @@ public void testExternalZookeeperWithExternalNetwork() throws Exception { .withNetwork(network) .withExternalZookeeper("zookeeper:2181"); - GenericContainer zookeeper = new GenericContainer("confluentinc/cp-zookeeper:4.0.0") + GenericContainer zookeeper = new GenericContainer(new DockerImageName("confluentinc/cp-zookeeper:4.0.0")) .withNetwork(network) .withNetworkAliases("zookeeper") .withEnv("ZOOKEEPER_CLIENT_PORT", "2181"); diff --git a/modules/localstack/src/main/java/org/testcontainers/containers/localstack/LocalStackContainer.java b/modules/localstack/src/main/java/org/testcontainers/containers/localstack/LocalStackContainer.java index 72eb320c729..d07d7f56fb4 100644 --- a/modules/localstack/src/main/java/org/testcontainers/containers/localstack/LocalStackContainer.java +++ b/modules/localstack/src/main/java/org/testcontainers/containers/localstack/LocalStackContainer.java @@ -10,6 +10,7 @@ import org.rnorth.ducttape.Preconditions; import org.testcontainers.containers.GenericContainer; import org.testcontainers.containers.wait.strategy.Wait; +import org.testcontainers.utility.DockerImageName; import org.testcontainers.utility.TestcontainersConfiguration; import java.net.InetAddress; @@ -36,12 +37,18 @@ public class LocalStackContainer extends GenericContainer { private final List services = new ArrayList<>(); + @Deprecated public LocalStackContainer() { this(VERSION); } + @Deprecated public LocalStackContainer(String version) { - super(TestcontainersConfiguration.getInstance().getLocalStackImage() + ":" + version); + this(new DockerImageName(TestcontainersConfiguration.getInstance().getLocalStackImage() + ":" + version)); + } + + public LocalStackContainer(final DockerImageName dockerImageName) { + super(dockerImageName); withFileSystemBind("//var/run/docker.sock", "/var/run/docker.sock"); waitingFor(Wait.forLogMessage(".*Ready\\.\n", 1)); diff --git a/modules/localstack/src/test/java/org/testcontainers/containers/localstack/LocalstackContainerTest.java b/modules/localstack/src/test/java/org/testcontainers/containers/localstack/LocalstackContainerTest.java index d4e2f0c2864..5c04024e501 100644 --- a/modules/localstack/src/test/java/org/testcontainers/containers/localstack/LocalstackContainerTest.java +++ b/modules/localstack/src/test/java/org/testcontainers/containers/localstack/LocalstackContainerTest.java @@ -29,6 +29,7 @@ import org.testcontainers.containers.Container; import org.testcontainers.containers.GenericContainer; import org.testcontainers.containers.Network; +import org.testcontainers.utility.DockerImageName; import software.amazon.awssdk.auth.credentials.AwsBasicCredentials; import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider; import software.amazon.awssdk.regions.Region; @@ -167,7 +168,7 @@ public static class WithNetwork { // } @ClassRule - public static GenericContainer awsCliInDockerNetwork = new GenericContainer<>("atlassian/pipelines-awscli") + public static GenericContainer awsCliInDockerNetwork = new GenericContainer(new DockerImageName("atlassian/pipelines-awscli")) .withNetwork(network) .withCreateContainerCmdModifier(cmd -> cmd.withEntrypoint("top")) .withEnv("AWS_ACCESS_KEY_ID", "accesskey") diff --git a/modules/mariadb/src/main/java/org/testcontainers/containers/MariaDBContainer.java b/modules/mariadb/src/main/java/org/testcontainers/containers/MariaDBContainer.java index 04d745a9efe..59a44ca29c6 100644 --- a/modules/mariadb/src/main/java/org/testcontainers/containers/MariaDBContainer.java +++ b/modules/mariadb/src/main/java/org/testcontainers/containers/MariaDBContainer.java @@ -1,5 +1,7 @@ package org.testcontainers.containers; +import org.testcontainers.utility.DockerImageName; + /** * Container implementation for the MariaDB project. * @@ -22,11 +24,17 @@ public class MariaDBContainer> extends JdbcD private static final String MARIADB_ROOT_USER = "root"; private static final String MY_CNF_CONFIG_OVERRIDE_PARAM_NAME = "TC_MY_CNF"; + @Deprecated public MariaDBContainer() { this(IMAGE + ":" + DEFAULT_TAG); } + @Deprecated public MariaDBContainer(String dockerImageName) { + this(new DockerImageName(dockerImageName)); + } + + public MariaDBContainer(final DockerImageName dockerImageName) { super(dockerImageName); addExposedPort(MARIADB_PORT); } diff --git a/modules/mariadb/src/main/java/org/testcontainers/containers/MariaDBContainerProvider.java b/modules/mariadb/src/main/java/org/testcontainers/containers/MariaDBContainerProvider.java index 86f30ee59e5..ae2c745b583 100644 --- a/modules/mariadb/src/main/java/org/testcontainers/containers/MariaDBContainerProvider.java +++ b/modules/mariadb/src/main/java/org/testcontainers/containers/MariaDBContainerProvider.java @@ -1,8 +1,7 @@ package org.testcontainers.containers; import org.testcontainers.jdbc.ConnectionUrl; - -import java.util.Objects; +import org.testcontainers.utility.DockerImageName; /** * Factory for MariaDB org.testcontainers.containers. @@ -25,7 +24,7 @@ public JdbcDatabaseContainer newInstance() { @Override public JdbcDatabaseContainer newInstance(String tag) { - return new MariaDBContainer(MariaDBContainer.IMAGE + ":" + tag); + return new MariaDBContainer(new DockerImageName(MariaDBContainer.IMAGE, tag)); } @Override diff --git a/modules/mariadb/src/test/java/org/testcontainers/containers/MariaDBR2DBCDatabaseContainerTest.java b/modules/mariadb/src/test/java/org/testcontainers/containers/MariaDBR2DBCDatabaseContainerTest.java index 30e8cad9c32..ebb63edaa52 100644 --- a/modules/mariadb/src/test/java/org/testcontainers/containers/MariaDBR2DBCDatabaseContainerTest.java +++ b/modules/mariadb/src/test/java/org/testcontainers/containers/MariaDBR2DBCDatabaseContainerTest.java @@ -2,6 +2,7 @@ import io.r2dbc.spi.ConnectionFactoryOptions; import org.testcontainers.r2dbc.AbstractR2DBCDatabaseContainerTest; +import org.testcontainers.utility.DockerImageName; public class MariaDBR2DBCDatabaseContainerTest extends AbstractR2DBCDatabaseContainerTest> { @@ -17,7 +18,7 @@ protected String createR2DBCUrl() { @Override protected MariaDBContainer createContainer() { - return new MariaDBContainer<>(); + return new MariaDBContainer<>(new DockerImageName(MariaDBContainer.IMAGE, MariaDBContainer.DEFAULT_TAG)); } } diff --git a/modules/mongodb/src/main/java/org/testcontainers/containers/MongoDBContainer.java b/modules/mongodb/src/main/java/org/testcontainers/containers/MongoDBContainer.java index a7f57d310f2..6d88ccbb1f2 100644 --- a/modules/mongodb/src/main/java/org/testcontainers/containers/MongoDBContainer.java +++ b/modules/mongodb/src/main/java/org/testcontainers/containers/MongoDBContainer.java @@ -5,6 +5,7 @@ import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; import org.testcontainers.containers.wait.strategy.Wait; +import org.testcontainers.utility.DockerImageName; import java.io.IOException; @@ -21,11 +22,17 @@ public class MongoDBContainer extends GenericContainer { private static final String MONGODB_VERSION_DEFAULT = "4.0.10"; private static final String MONGODB_DATABASE_NAME_DEFAULT = "test"; + @Deprecated public MongoDBContainer() { this("mongo:" + MONGODB_VERSION_DEFAULT); } + @Deprecated public MongoDBContainer(@NonNull final String dockerImageName) { + this(new DockerImageName(dockerImageName)); + } + + public MongoDBContainer(final DockerImageName dockerImageName) { super(dockerImageName); withExposedPorts(MONGODB_INTERNAL_PORT); withCommand("--replSet", "docker-rs"); diff --git a/modules/mssqlserver/src/main/java/org/testcontainers/containers/MSSQLServerContainer.java b/modules/mssqlserver/src/main/java/org/testcontainers/containers/MSSQLServerContainer.java index 7550f820d51..7866d6c1ea7 100644 --- a/modules/mssqlserver/src/main/java/org/testcontainers/containers/MSSQLServerContainer.java +++ b/modules/mssqlserver/src/main/java/org/testcontainers/containers/MSSQLServerContainer.java @@ -1,5 +1,6 @@ package org.testcontainers.containers; +import org.testcontainers.utility.DockerImageName; import org.testcontainers.utility.LicenseAcceptance; import java.util.regex.Pattern; @@ -32,11 +33,17 @@ public class MSSQLServerContainer> exten Pattern.compile("[^a-zA-Z0-9]+", Pattern.CASE_INSENSITIVE) }; + @Deprecated public MSSQLServerContainer() { this(IMAGE + ":" + DEFAULT_TAG); } + @Deprecated public MSSQLServerContainer(final String dockerImageName) { + this(new DockerImageName(dockerImageName)); + } + + public MSSQLServerContainer(final DockerImageName dockerImageName) { super(dockerImageName); withStartupTimeoutSeconds(DEFAULT_STARTUP_TIMEOUT_SECONDS); withConnectTimeoutSeconds(DEFAULT_CONNECT_TIMEOUT_SECONDS); diff --git a/modules/mssqlserver/src/main/java/org/testcontainers/containers/MSSQLServerContainerProvider.java b/modules/mssqlserver/src/main/java/org/testcontainers/containers/MSSQLServerContainerProvider.java index daaa82ee771..2dafedd895d 100644 --- a/modules/mssqlserver/src/main/java/org/testcontainers/containers/MSSQLServerContainerProvider.java +++ b/modules/mssqlserver/src/main/java/org/testcontainers/containers/MSSQLServerContainerProvider.java @@ -1,5 +1,7 @@ package org.testcontainers.containers; +import org.testcontainers.utility.DockerImageName; + /** * Factory for MS SQL Server containers. */ @@ -16,6 +18,6 @@ public JdbcDatabaseContainer newInstance() { @Override public JdbcDatabaseContainer newInstance(String tag) { - return new MSSQLServerContainer(MSSQLServerContainer.IMAGE + ":" + tag); + return new MSSQLServerContainer(new DockerImageName(MSSQLServerContainer.IMAGE, tag)); } } diff --git a/modules/mssqlserver/src/test/java/org/testcontainers/containers/MSSQLR2DBCDatabaseContainerTest.java b/modules/mssqlserver/src/test/java/org/testcontainers/containers/MSSQLR2DBCDatabaseContainerTest.java index 1fcf2dd293b..97700a251be 100644 --- a/modules/mssqlserver/src/test/java/org/testcontainers/containers/MSSQLR2DBCDatabaseContainerTest.java +++ b/modules/mssqlserver/src/test/java/org/testcontainers/containers/MSSQLR2DBCDatabaseContainerTest.java @@ -2,6 +2,7 @@ import io.r2dbc.spi.ConnectionFactoryOptions; import org.testcontainers.r2dbc.AbstractR2DBCDatabaseContainerTest; +import org.testcontainers.utility.DockerImageName; public class MSSQLR2DBCDatabaseContainerTest extends AbstractR2DBCDatabaseContainerTest> { @@ -17,6 +18,6 @@ protected String createR2DBCUrl() { @Override protected MSSQLServerContainer createContainer() { - return new MSSQLServerContainer<>(); + return new MSSQLServerContainer<>(new DockerImageName(MSSQLServerContainer.IMAGE, MSSQLServerContainer.DEFAULT_TAG)); } } diff --git a/modules/mssqlserver/src/test/java/org/testcontainers/junit/mssqlserver/CustomPasswordMSSQLServerTest.java b/modules/mssqlserver/src/test/java/org/testcontainers/junit/mssqlserver/CustomPasswordMSSQLServerTest.java index 0e1ea05b31d..6d07e945b38 100644 --- a/modules/mssqlserver/src/test/java/org/testcontainers/junit/mssqlserver/CustomPasswordMSSQLServerTest.java +++ b/modules/mssqlserver/src/test/java/org/testcontainers/junit/mssqlserver/CustomPasswordMSSQLServerTest.java @@ -5,6 +5,7 @@ import org.junit.runner.RunWith; import org.junit.runners.Parameterized; import org.testcontainers.containers.MSSQLServerContainer; +import org.testcontainers.utility.DockerImageName; import java.util.Arrays; import java.util.Collection; @@ -66,7 +67,7 @@ public static Collection data() { @Test public void runPasswordTests() { try { - new MSSQLServerContainer<>().withPassword(this.password); + new MSSQLServerContainer<>(new DockerImageName("mcr.microsoft.com/mssql/server:2017-CU12")).withPassword(this.password); if (!valid) fail("Password " + this.password + " is not valid. Expected exception"); } catch (IllegalArgumentException e) { diff --git a/modules/mssqlserver/src/test/java/org/testcontainers/junit/mssqlserver/CustomizableMSSQLServerTest.java b/modules/mssqlserver/src/test/java/org/testcontainers/junit/mssqlserver/CustomizableMSSQLServerTest.java index ecbc4e31714..127dbe2ae03 100644 --- a/modules/mssqlserver/src/test/java/org/testcontainers/junit/mssqlserver/CustomizableMSSQLServerTest.java +++ b/modules/mssqlserver/src/test/java/org/testcontainers/junit/mssqlserver/CustomizableMSSQLServerTest.java @@ -3,6 +3,7 @@ import org.junit.Test; import org.testcontainers.containers.MSSQLServerContainer; import org.testcontainers.db.AbstractContainerDatabaseTest; +import org.testcontainers.utility.DockerImageName; import java.sql.ResultSet; import java.sql.SQLException; @@ -15,7 +16,7 @@ public class CustomizableMSSQLServerTest extends AbstractContainerDatabaseTest { @Test public void testSqlServerConnection() throws SQLException { - try (MSSQLServerContainer mssqlServerContainer = new MSSQLServerContainer<>() + try (MSSQLServerContainer mssqlServerContainer = new MSSQLServerContainer<>(new DockerImageName("mcr.microsoft.com/mssql/server:2017-CU12")) .withPassword(STRONG_PASSWORD)) { mssqlServerContainer.start(); diff --git a/modules/mysql/src/main/java/org/testcontainers/containers/MySQLContainer.java b/modules/mysql/src/main/java/org/testcontainers/containers/MySQLContainer.java index 1ef574cbd5e..fc4d62f3587 100644 --- a/modules/mysql/src/main/java/org/testcontainers/containers/MySQLContainer.java +++ b/modules/mysql/src/main/java/org/testcontainers/containers/MySQLContainer.java @@ -1,12 +1,11 @@ package org.testcontainers.containers; import org.jetbrains.annotations.NotNull; +import org.testcontainers.utility.DockerImageName; import java.util.HashSet; import java.util.Set; -import static java.util.stream.Collectors.joining; - /** * @author richardnorth */ @@ -27,15 +26,22 @@ public class MySQLContainer> extends JdbcDatab private String password = DEFAULT_PASSWORD; private static final String MYSQL_ROOT_USER = "root"; + @Deprecated public MySQLContainer() { this(IMAGE + ":" + DEFAULT_TAG); } + @Deprecated public MySQLContainer(String dockerImageName) { + this(new DockerImageName(dockerImageName)); + } + + public MySQLContainer(final DockerImageName dockerImageName) { super(dockerImageName); addExposedPort(MYSQL_PORT); } + @NotNull @Override protected Set getLivenessCheckPorts() { diff --git a/modules/mysql/src/main/java/org/testcontainers/containers/MySQLContainerProvider.java b/modules/mysql/src/main/java/org/testcontainers/containers/MySQLContainerProvider.java index 7d4919f4b26..e74c1f49a4e 100644 --- a/modules/mysql/src/main/java/org/testcontainers/containers/MySQLContainerProvider.java +++ b/modules/mysql/src/main/java/org/testcontainers/containers/MySQLContainerProvider.java @@ -1,8 +1,7 @@ package org.testcontainers.containers; import org.testcontainers.jdbc.ConnectionUrl; - -import java.util.Objects; +import org.testcontainers.utility.DockerImageName; /** * Factory for MySQL containers. @@ -26,7 +25,7 @@ public JdbcDatabaseContainer newInstance() { @Override public JdbcDatabaseContainer newInstance(String tag) { if (tag != null) { - return new MySQLContainer(MySQLContainer.IMAGE + ":" + tag); + return new MySQLContainer(new DockerImageName(MySQLContainer.IMAGE, tag)); } else { return newInstance(); } diff --git a/modules/mysql/src/test/java/org/testcontainers/containers/MySQLR2DBCDatabaseContainerTest.java b/modules/mysql/src/test/java/org/testcontainers/containers/MySQLR2DBCDatabaseContainerTest.java index 19edc3dbca4..d64b4ef5193 100644 --- a/modules/mysql/src/test/java/org/testcontainers/containers/MySQLR2DBCDatabaseContainerTest.java +++ b/modules/mysql/src/test/java/org/testcontainers/containers/MySQLR2DBCDatabaseContainerTest.java @@ -2,6 +2,7 @@ import io.r2dbc.spi.ConnectionFactoryOptions; import org.testcontainers.r2dbc.AbstractR2DBCDatabaseContainerTest; +import org.testcontainers.utility.DockerImageName; public class MySQLR2DBCDatabaseContainerTest extends AbstractR2DBCDatabaseContainerTest> { @@ -17,7 +18,7 @@ protected String createR2DBCUrl() { @Override protected MySQLContainer createContainer() { - return new MySQLContainer<>(); + return new MySQLContainer<>(new DockerImageName(MySQLContainer.IMAGE, MySQLContainer.DEFAULT_TAG)); } } diff --git a/modules/mysql/src/test/java/org/testcontainers/junit/mysql/CustomizableMysqlTest.java b/modules/mysql/src/test/java/org/testcontainers/junit/mysql/CustomizableMysqlTest.java index 590d288e3fe..685b2a7e5e9 100644 --- a/modules/mysql/src/test/java/org/testcontainers/junit/mysql/CustomizableMysqlTest.java +++ b/modules/mysql/src/test/java/org/testcontainers/junit/mysql/CustomizableMysqlTest.java @@ -3,6 +3,7 @@ import org.junit.Test; import org.testcontainers.containers.MySQLContainer; import org.testcontainers.db.AbstractContainerDatabaseTest; +import org.testcontainers.utility.DockerImageName; import java.sql.ResultSet; import java.sql.SQLException; @@ -17,7 +18,7 @@ public class CustomizableMysqlTest extends AbstractContainerDatabaseTest { @Test public void testSimple() throws SQLException { // Add MYSQL_ROOT_HOST environment so that we can root login from anywhere for testing purposes - try (MySQLContainer mysql = new MySQLContainer<>("mysql:5.5") + try (MySQLContainer mysql = new MySQLContainer<>(new DockerImageName("mysql:5.5")) .withDatabaseName(DB_NAME) .withUsername(USER) .withPassword(PWD) diff --git a/modules/neo4j/src/main/java/org/testcontainers/containers/Neo4jContainer.java b/modules/neo4j/src/main/java/org/testcontainers/containers/Neo4jContainer.java index 10545da43d6..44bce6eea32 100644 --- a/modules/neo4j/src/main/java/org/testcontainers/containers/Neo4jContainer.java +++ b/modules/neo4j/src/main/java/org/testcontainers/containers/Neo4jContainer.java @@ -1,19 +1,20 @@ package org.testcontainers.containers; -import static java.net.HttpURLConnection.*; -import static java.util.stream.Collectors.*; - -import java.time.Duration; -import java.util.Set; -import java.util.stream.Stream; - import org.testcontainers.containers.wait.strategy.HttpWaitStrategy; import org.testcontainers.containers.wait.strategy.LogMessageWaitStrategy; import org.testcontainers.containers.wait.strategy.WaitAllStrategy; import org.testcontainers.containers.wait.strategy.WaitStrategy; +import org.testcontainers.utility.DockerImageName; import org.testcontainers.utility.LicenseAcceptance; import org.testcontainers.utility.MountableFile; +import java.time.Duration; +import java.util.Set; +import java.util.stream.Stream; + +import static java.net.HttpURLConnection.HTTP_OK; +import static java.util.stream.Collectors.toSet; + /** * Testcontainer for Neo4j. * @@ -63,6 +64,7 @@ public class Neo4jContainer> extends GenericContaine /** * Creates a Testcontainer using the official Neo4j docker image. */ + @Deprecated public Neo4jContainer() { this(DOCKER_IMAGE_NAME); @@ -74,7 +76,12 @@ public Neo4jContainer() { * * @param dockerImageName The docker image to use. */ + @Deprecated public Neo4jContainer(String dockerImageName) { + this(new DockerImageName(dockerImageName)); + } + + public Neo4jContainer(final DockerImageName dockerImageName) { super(dockerImageName); WaitStrategy waitForBolt = new LogMessageWaitStrategy() diff --git a/modules/nginx/src/main/java/org/testcontainers/containers/NginxContainer.java b/modules/nginx/src/main/java/org/testcontainers/containers/NginxContainer.java index fb931bce409..4dd970d0e17 100644 --- a/modules/nginx/src/main/java/org/testcontainers/containers/NginxContainer.java +++ b/modules/nginx/src/main/java/org/testcontainers/containers/NginxContainer.java @@ -2,6 +2,7 @@ import org.jetbrains.annotations.NotNull; import org.testcontainers.containers.traits.LinkableContainer; +import org.testcontainers.utility.DockerImageName; import java.net.MalformedURLException; import java.net.URL; @@ -15,17 +16,23 @@ public class NginxContainer> extends GenericCo private static final int NGINX_DEFAULT_PORT = 80; + @Deprecated public NginxContainer() { this("nginx:1.9.4"); } + @Deprecated public NginxContainer(String dockerImageName) { - super(dockerImageName); + this(new DockerImageName(dockerImageName)); addExposedPort(NGINX_DEFAULT_PORT); setCommand("nginx", "-g", "daemon off;"); } + public NginxContainer(final DockerImageName dockerImageName) { + super(dockerImageName); + } + @NotNull @Override protected Set getLivenessCheckPorts() { diff --git a/modules/oracle-xe/src/main/java/org/testcontainers/containers/OracleContainer.java b/modules/oracle-xe/src/main/java/org/testcontainers/containers/OracleContainer.java index d263a141d4f..8de0a2b5141 100644 --- a/modules/oracle-xe/src/main/java/org/testcontainers/containers/OracleContainer.java +++ b/modules/oracle-xe/src/main/java/org/testcontainers/containers/OracleContainer.java @@ -1,5 +1,6 @@ package org.testcontainers.containers; +import org.testcontainers.utility.DockerImageName; import org.testcontainers.utility.TestcontainersConfiguration; import java.util.concurrent.Future; @@ -32,11 +33,17 @@ private static String resolveImageName() { return image; } + @Deprecated public OracleContainer() { this(resolveImageName()); } + @Deprecated public OracleContainer(String dockerImageName) { + this(new DockerImageName(dockerImageName)); + } + + public OracleContainer(final DockerImageName dockerImageName) { super(dockerImageName); preconfigure(); } diff --git a/modules/orientdb/src/main/java/org/testcontainers/containers/OrientDBContainer.java b/modules/orientdb/src/main/java/org/testcontainers/containers/OrientDBContainer.java index b7fcc85573a..6d87e66dea7 100644 --- a/modules/orientdb/src/main/java/org/testcontainers/containers/OrientDBContainer.java +++ b/modules/orientdb/src/main/java/org/testcontainers/containers/OrientDBContainer.java @@ -13,6 +13,7 @@ import org.testcontainers.containers.wait.strategy.Wait; import org.testcontainers.containers.wait.strategy.WaitAllStrategy; import org.testcontainers.containers.wait.strategy.WaitStrategy; +import org.testcontainers.utility.DockerImageName; import java.io.IOException; import java.net.URL; @@ -48,11 +49,17 @@ public class OrientDBContainer extends GenericContainer { private OrientDB orientDB; private ODatabaseSession session; + @Deprecated public OrientDBContainer() { this(DOCKER_IMAGE_NAME); } + @Deprecated public OrientDBContainer(@NonNull String dockerImageName) { + this(new DockerImageName(dockerImageName)); + } + + public OrientDBContainer(final DockerImageName dockerImageName) { super(dockerImageName); serverPassword = DEFAULT_SERVER_PASSWORD; diff --git a/modules/postgresql/src/main/java/org/testcontainers/containers/PostgisContainerProvider.java b/modules/postgresql/src/main/java/org/testcontainers/containers/PostgisContainerProvider.java index 54c87a84648..b3038f32e9c 100644 --- a/modules/postgresql/src/main/java/org/testcontainers/containers/PostgisContainerProvider.java +++ b/modules/postgresql/src/main/java/org/testcontainers/containers/PostgisContainerProvider.java @@ -1,8 +1,7 @@ package org.testcontainers.containers; import org.testcontainers.jdbc.ConnectionUrl; - -import java.util.Objects; +import org.testcontainers.utility.DockerImageName; /** * Factory for PostGIS containers, which are a special flavour of PostgreSQL. @@ -28,7 +27,7 @@ public JdbcDatabaseContainer newInstance() { @Override public JdbcDatabaseContainer newInstance(String tag) { - return new PostgreSQLContainer(DEFAULT_IMAGE + ":" + tag); + return new PostgreSQLContainer(new DockerImageName(DEFAULT_IMAGE, DEFAULT_TAG)); } @Override diff --git a/modules/postgresql/src/main/java/org/testcontainers/containers/PostgreSQLContainer.java b/modules/postgresql/src/main/java/org/testcontainers/containers/PostgreSQLContainer.java index 1c814044023..d718aa5505a 100644 --- a/modules/postgresql/src/main/java/org/testcontainers/containers/PostgreSQLContainer.java +++ b/modules/postgresql/src/main/java/org/testcontainers/containers/PostgreSQLContainer.java @@ -2,6 +2,7 @@ import org.jetbrains.annotations.NotNull; import org.testcontainers.containers.wait.strategy.LogMessageWaitStrategy; +import org.testcontainers.utility.DockerImageName; import java.time.Duration; import java.util.HashSet; @@ -31,11 +32,17 @@ public class PostgreSQLContainer> extends private static final String QUERY_PARAM_SEPARATOR = "&"; + @Deprecated public PostgreSQLContainer() { this(IMAGE + ":" + DEFAULT_TAG); } + @Deprecated public PostgreSQLContainer(final String dockerImageName) { + this(new DockerImageName(dockerImageName)); + } + + public PostgreSQLContainer(final DockerImageName dockerImageName) { super(dockerImageName); this.waitStrategy = new LogMessageWaitStrategy() .withRegEx(".*database system is ready to accept connections.*\\s") diff --git a/modules/postgresql/src/main/java/org/testcontainers/containers/PostgreSQLContainerProvider.java b/modules/postgresql/src/main/java/org/testcontainers/containers/PostgreSQLContainerProvider.java index 77a0329c22c..77d6501064d 100644 --- a/modules/postgresql/src/main/java/org/testcontainers/containers/PostgreSQLContainerProvider.java +++ b/modules/postgresql/src/main/java/org/testcontainers/containers/PostgreSQLContainerProvider.java @@ -1,8 +1,7 @@ package org.testcontainers.containers; import org.testcontainers.jdbc.ConnectionUrl; - -import java.util.Objects; +import org.testcontainers.utility.DockerImageName; /** * Factory for PostgreSQL containers. @@ -24,7 +23,7 @@ public JdbcDatabaseContainer newInstance() { @Override public JdbcDatabaseContainer newInstance(String tag) { - return new PostgreSQLContainer(PostgreSQLContainer.IMAGE + ":" + tag); + return new PostgreSQLContainer(new DockerImageName(PostgreSQLContainer.IMAGE, tag)); } @Override diff --git a/modules/postgresql/src/test/java/org/testcontainers/containers/PostgreSQLR2DBCDatabaseContainerTest.java b/modules/postgresql/src/test/java/org/testcontainers/containers/PostgreSQLR2DBCDatabaseContainerTest.java index 505b37859ba..a3da6ea9b44 100644 --- a/modules/postgresql/src/test/java/org/testcontainers/containers/PostgreSQLR2DBCDatabaseContainerTest.java +++ b/modules/postgresql/src/test/java/org/testcontainers/containers/PostgreSQLR2DBCDatabaseContainerTest.java @@ -2,12 +2,13 @@ import io.r2dbc.spi.ConnectionFactoryOptions; import org.testcontainers.r2dbc.AbstractR2DBCDatabaseContainerTest; +import org.testcontainers.utility.DockerImageName; public class PostgreSQLR2DBCDatabaseContainerTest extends AbstractR2DBCDatabaseContainerTest> { @Override protected PostgreSQLContainer createContainer() { - return new PostgreSQLContainer<>(); + return new PostgreSQLContainer<>(new DockerImageName(PostgreSQLContainer.IMAGE, PostgreSQLContainer.DEFAULT_TAG)); } @Override diff --git a/modules/postgresql/src/test/java/org/testcontainers/junit/postgresql/CustomizablePostgreSQLTest.java b/modules/postgresql/src/test/java/org/testcontainers/junit/postgresql/CustomizablePostgreSQLTest.java index 8446440059e..f4cea8836ac 100644 --- a/modules/postgresql/src/test/java/org/testcontainers/junit/postgresql/CustomizablePostgreSQLTest.java +++ b/modules/postgresql/src/test/java/org/testcontainers/junit/postgresql/CustomizablePostgreSQLTest.java @@ -3,6 +3,7 @@ import org.junit.Test; import org.testcontainers.containers.PostgreSQLContainer; import org.testcontainers.db.AbstractContainerDatabaseTest; +import org.testcontainers.utility.DockerImageName; import java.sql.ResultSet; import java.sql.SQLException; @@ -19,7 +20,7 @@ public class CustomizablePostgreSQLTest extends AbstractContainerDatabaseTest { @Test public void testSimple() throws SQLException { - try (PostgreSQLContainer postgres = new PostgreSQLContainer<>("postgres:9.6.8") + try (PostgreSQLContainer postgres = new PostgreSQLContainer<>(new DockerImageName("postgres:9.6.8")) .withDatabaseName(DB_NAME) .withUsername(USER) .withPassword(PWD)) { diff --git a/modules/presto/src/main/java/org/testcontainers/containers/PrestoContainer.java b/modules/presto/src/main/java/org/testcontainers/containers/PrestoContainer.java index 56488525734..5e1bf3e2fc4 100644 --- a/modules/presto/src/main/java/org/testcontainers/containers/PrestoContainer.java +++ b/modules/presto/src/main/java/org/testcontainers/containers/PrestoContainer.java @@ -2,6 +2,7 @@ import org.jetbrains.annotations.NotNull; import org.testcontainers.containers.wait.strategy.LogMessageWaitStrategy; +import org.testcontainers.utility.DockerImageName; import java.sql.Connection; import java.sql.SQLException; @@ -23,11 +24,17 @@ public class PrestoContainer> extends JdbcDat private String username = "test"; private String catalog = null; + @Deprecated public PrestoContainer() { this(IMAGE + ":" + DEFAULT_TAG); } + @Deprecated public PrestoContainer(final String dockerImageName) { + this(new DockerImageName(dockerImageName)); + } + + public PrestoContainer(final DockerImageName dockerImageName) { super(dockerImageName); this.waitStrategy = new LogMessageWaitStrategy() .withRegEx(".*io.prestosql.server.PrestoServer\\s+======== SERVER STARTED ========.*") diff --git a/modules/presto/src/main/java/org/testcontainers/containers/PrestoContainerProvider.java b/modules/presto/src/main/java/org/testcontainers/containers/PrestoContainerProvider.java index 663cf9be4a9..fd87418cd17 100644 --- a/modules/presto/src/main/java/org/testcontainers/containers/PrestoContainerProvider.java +++ b/modules/presto/src/main/java/org/testcontainers/containers/PrestoContainerProvider.java @@ -1,8 +1,7 @@ package org.testcontainers.containers; import org.testcontainers.jdbc.ConnectionUrl; - -import java.util.Objects; +import org.testcontainers.utility.DockerImageName; /** * Factory for Presto containers. @@ -24,7 +23,7 @@ public JdbcDatabaseContainer newInstance() { @Override public JdbcDatabaseContainer newInstance(String tag) { - return new PrestoContainer(PrestoContainer.IMAGE + ":" + tag); + return new PrestoContainer(new DockerImageName(PrestoContainer.IMAGE, tag)); } @Override diff --git a/modules/pulsar/src/main/java/org/testcontainers/containers/PulsarContainer.java b/modules/pulsar/src/main/java/org/testcontainers/containers/PulsarContainer.java index c9532979057..65ab57ded4b 100644 --- a/modules/pulsar/src/main/java/org/testcontainers/containers/PulsarContainer.java +++ b/modules/pulsar/src/main/java/org/testcontainers/containers/PulsarContainer.java @@ -1,6 +1,7 @@ package org.testcontainers.containers; import org.testcontainers.containers.wait.strategy.Wait; +import org.testcontainers.utility.DockerImageName; import org.testcontainers.utility.TestcontainersConfiguration; /** @@ -12,14 +13,21 @@ public class PulsarContainer extends GenericContainer { public static final int BROKER_HTTP_PORT = 8080; public static final String METRICS_ENDPOINT = "/metrics"; - private static final String PULSAR_VERSION = "2.2.0"; + @Deprecated + private static final String DEFAULT_PULSAR_VERSION = "2.2.0"; + @Deprecated public PulsarContainer() { - this(PULSAR_VERSION); + this(DEFAULT_PULSAR_VERSION); } + @Deprecated public PulsarContainer(String pulsarVersion) { - super(TestcontainersConfiguration.getInstance().getPulsarImage() + ":" + pulsarVersion); + this(TestcontainersConfiguration.getInstance().getPulsarDockerImageName().withTag(pulsarVersion)); + } + + public PulsarContainer(final DockerImageName dockerImageName) { + super(dockerImageName); withExposedPorts(BROKER_PORT, BROKER_HTTP_PORT); withCommand("/pulsar/bin/pulsar", "standalone", "--no-functions-worker", "-nss"); waitingFor(Wait.forHttp(METRICS_ENDPOINT).forStatusCode(200).forPort(BROKER_HTTP_PORT)); diff --git a/modules/rabbitmq/src/main/java/org/testcontainers/containers/RabbitMQContainer.java b/modules/rabbitmq/src/main/java/org/testcontainers/containers/RabbitMQContainer.java index d8d46f51b1c..0cf20eeb119 100644 --- a/modules/rabbitmq/src/main/java/org/testcontainers/containers/RabbitMQContainer.java +++ b/modules/rabbitmq/src/main/java/org/testcontainers/containers/RabbitMQContainer.java @@ -5,6 +5,7 @@ import com.github.dockerjava.api.command.InspectContainerResponse; import org.jetbrains.annotations.NotNull; import org.testcontainers.containers.wait.strategy.Wait; +import org.testcontainers.utility.DockerImageName; import org.testcontainers.utility.MountableFile; import java.io.IOException; @@ -42,6 +43,7 @@ public class RabbitMQContainer extends GenericContainer { /** * Creates a Testcontainer using the official RabbitMQ docker image. */ + @Deprecated public RabbitMQContainer() { this(DEFAULT_IMAGE_NAME + ":" + DEFAULT_TAG); } @@ -49,10 +51,15 @@ public RabbitMQContainer() { /** * Creates a Testcontainer using a specific docker image. * - * @param image The docker image to use. + * @param dockerImageName The docker image to use. */ - public RabbitMQContainer(String image) { - super(image); + @Deprecated + public RabbitMQContainer(String dockerImageName) { + this(new DockerImageName(dockerImageName)); + } + + public RabbitMQContainer(final DockerImageName dockerImageName) { + super(dockerImageName); addExposedPorts(DEFAULT_AMQP_PORT, DEFAULT_AMQPS_PORT, DEFAULT_HTTP_PORT, DEFAULT_HTTPS_PORT); diff --git a/modules/selenium/src/main/java/org/testcontainers/containers/BrowserWebDriverContainer.java b/modules/selenium/src/main/java/org/testcontainers/containers/BrowserWebDriverContainer.java index 16127171c59..19c35b00dd6 100644 --- a/modules/selenium/src/main/java/org/testcontainers/containers/BrowserWebDriverContainer.java +++ b/modules/selenium/src/main/java/org/testcontainers/containers/BrowserWebDriverContainer.java @@ -1,12 +1,10 @@ package org.testcontainers.containers; +import com.github.dockerjava.api.command.InspectContainerResponse; import com.github.dockerjava.api.model.AccessMode; import com.github.dockerjava.api.model.Bind; import com.github.dockerjava.api.model.Volume; import com.google.common.collect.ImmutableSet; - -import com.github.dockerjava.api.command.InspectContainerResponse; - import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.openqa.selenium.Capabilities; @@ -25,6 +23,7 @@ import org.testcontainers.containers.wait.strategy.WaitStrategy; import org.testcontainers.lifecycle.TestDescription; import org.testcontainers.lifecycle.TestLifecycleAware; +import org.testcontainers.utility.DockerImageName; import java.io.File; import java.io.IOException; @@ -72,6 +71,7 @@ public class BrowserWebDriverContainer { private SolrContainerConfiguration configuration; + @Deprecated public SolrContainer() { this(IMAGE + ":" + DEFAULT_TAG); } + @Deprecated public SolrContainer(final String dockerImageName) { + this(new DockerImageName(dockerImageName)); + } + + public SolrContainer(final DockerImageName dockerImageName) { super(dockerImageName); this.waitStrategy = new LogMessageWaitStrategy() .withRegEx(".*o\\.e\\.j\\.s\\.Server Started.*") diff --git a/modules/toxiproxy/src/main/java/org/testcontainers/containers/ToxiproxyContainer.java b/modules/toxiproxy/src/main/java/org/testcontainers/containers/ToxiproxyContainer.java index f2915b5af11..37410e5ac5c 100644 --- a/modules/toxiproxy/src/main/java/org/testcontainers/containers/ToxiproxyContainer.java +++ b/modules/toxiproxy/src/main/java/org/testcontainers/containers/ToxiproxyContainer.java @@ -9,6 +9,7 @@ import lombok.Getter; import lombok.RequiredArgsConstructor; import org.testcontainers.containers.wait.strategy.HttpWaitStrategy; +import org.testcontainers.utility.DockerImageName; import java.io.IOException; import java.util.HashMap; @@ -29,12 +30,18 @@ public class ToxiproxyContainer extends GenericContainer { private final Map proxies = new HashMap<>(); private final AtomicInteger nextPort = new AtomicInteger(FIRST_PROXIED_PORT); + @Deprecated public ToxiproxyContainer() { this(IMAGE_NAME); } - public ToxiproxyContainer(String imageName) { - super(imageName); + @Deprecated + public ToxiproxyContainer(String dockerImageName) { + this(new DockerImageName(dockerImageName)); + } + + public ToxiproxyContainer(final DockerImageName dockerImageName) { + super(dockerImageName); addExposedPorts(TOXIPROXY_CONTROL_PORT); setWaitStrategy(new HttpWaitStrategy().forPath("/version").forPort(TOXIPROXY_CONTROL_PORT)); diff --git a/modules/toxiproxy/src/test/java/org/testcontainers/containers/ToxiproxyTest.java b/modules/toxiproxy/src/test/java/org/testcontainers/containers/ToxiproxyTest.java index d76851f57b5..710a73c9bb0 100644 --- a/modules/toxiproxy/src/test/java/org/testcontainers/containers/ToxiproxyTest.java +++ b/modules/toxiproxy/src/test/java/org/testcontainers/containers/ToxiproxyTest.java @@ -1,16 +1,19 @@ package org.testcontainers.containers; import eu.rekawek.toxiproxy.model.ToxicDirection; -import java.time.Duration; import org.junit.Rule; import org.junit.Test; +import org.testcontainers.utility.DockerImageName; import redis.clients.jedis.Jedis; import redis.clients.jedis.exceptions.JedisConnectionException; import java.io.IOException; +import java.time.Duration; import static java.lang.String.format; -import static org.rnorth.visibleassertions.VisibleAssertions.*; +import static org.rnorth.visibleassertions.VisibleAssertions.assertEquals; +import static org.rnorth.visibleassertions.VisibleAssertions.assertThrows; +import static org.rnorth.visibleassertions.VisibleAssertions.assertTrue; public class ToxiproxyTest { @@ -27,7 +30,7 @@ public class ToxiproxyTest { // The target container - this could be anything @Rule - public GenericContainer redis = new GenericContainer("redis:5.0.4") + public GenericContainer redis = new GenericContainer(new DockerImageName("redis:5.0.4")) .withExposedPorts(6379) .withNetwork(network); @@ -99,7 +102,7 @@ public void testConnectionCut() { @Test public void testMultipleProxiesCanBeCreated() { - try (GenericContainer secondRedis = new GenericContainer("redis:5.0.4") + try (GenericContainer secondRedis = new GenericContainer(new DockerImageName("redis:5.0.4")) .withExposedPorts(6379) .withNetwork(network)) { diff --git a/modules/vault/src/main/java/org/testcontainers/vault/VaultContainer.java b/modules/vault/src/main/java/org/testcontainers/vault/VaultContainer.java index ac4e730adb3..32e9648178c 100644 --- a/modules/vault/src/main/java/org/testcontainers/vault/VaultContainer.java +++ b/modules/vault/src/main/java/org/testcontainers/vault/VaultContainer.java @@ -3,6 +3,7 @@ import com.github.dockerjava.api.command.InspectContainerResponse; import org.testcontainers.containers.GenericContainer; import org.testcontainers.containers.wait.strategy.Wait; +import org.testcontainers.utility.DockerImageName; import java.io.IOException; import java.util.ArrayList; @@ -28,11 +29,17 @@ public class VaultContainer> extends GenericCo private int port = VAULT_PORT; + @Deprecated public VaultContainer() { this("vault:1.1.3"); } + @Deprecated public VaultContainer(String dockerImageName) { + this(new DockerImageName(dockerImageName)); + } + + public VaultContainer(final DockerImageName dockerImageName) { super(dockerImageName); // Use the vault healthcheck endpoint to check for readiness, per https://www.vaultproject.io/api/system/health.html From 46c7e1b8d6f16e68800681f1dc08694139bd4cf5 Mon Sep 17 00:00:00 2001 From: Richard North Date: Thu, 25 Jun 2020 14:18:30 +0100 Subject: [PATCH 02/17] WIP --- .../org/testcontainers/TestingImages.java | 13 +++++------- .../containers/output/ContainerLogsTest.java | 20 +++++++++---------- .../images/ImagePullPolicyTest.java | 2 +- .../junit/FileOperationsTest.java | 12 +++++------ .../junit/NonExistentImagePullTest.java | 2 +- .../junit/OutputStreamTest.java | 4 ++-- .../junit/OutputStreamWithTTYTest.java | 4 ++-- .../junit/WorkingDirectoryTest.java | 4 ++-- .../src/test/java/RedisBackedCacheTest.java | 3 ++- .../localstack/LocalstackContainerTest.java | 2 +- 10 files changed, 32 insertions(+), 34 deletions(-) diff --git a/core/src/test/java/org/testcontainers/TestingImages.java b/core/src/test/java/org/testcontainers/TestingImages.java index 8a18ec6e173..daca0b68c2c 100644 --- a/core/src/test/java/org/testcontainers/TestingImages.java +++ b/core/src/test/java/org/testcontainers/TestingImages.java @@ -3,13 +3,10 @@ import org.testcontainers.utility.DockerImageName; import org.testcontainers.utility.TestcontainersConfiguration; -/** - * TODO: Javadocs - */ public interface TestingImages { - public static final DockerImageName REDIS_IMAGE = new DockerImageName("redis:3.0.2"); - public static final DockerImageName RABBITMQ_IMAGE = new DockerImageName("rabbitmq:3.5.3"); - public static final DockerImageName MONGODB_IMAGE = new DockerImageName("mongo:3.1.5"); - public static final DockerImageName ALPINE_IMAGE = new DockerImageName("alpine:3.2"); - public static final DockerImageName TINY_IMAGE = TestcontainersConfiguration.getInstance().getTinyDockerImageName(); + DockerImageName REDIS_IMAGE = new DockerImageName("redis:3.0.2"); + DockerImageName RABBITMQ_IMAGE = new DockerImageName("rabbitmq:3.5.3"); + DockerImageName MONGODB_IMAGE = new DockerImageName("mongo:3.1.5"); + DockerImageName ALPINE_IMAGE = new DockerImageName("alpine:3.2"); + DockerImageName TINY_IMAGE = TestcontainersConfiguration.getInstance().getTinyDockerImageName(); } diff --git a/core/src/test/java/org/testcontainers/containers/output/ContainerLogsTest.java b/core/src/test/java/org/testcontainers/containers/output/ContainerLogsTest.java index 4e8d0314add..1f64c368847 100644 --- a/core/src/test/java/org/testcontainers/containers/output/ContainerLogsTest.java +++ b/core/src/test/java/org/testcontainers/containers/output/ContainerLogsTest.java @@ -4,10 +4,10 @@ import org.junit.Test; import org.testcontainers.containers.GenericContainer; import org.testcontainers.containers.startupcheck.OneShotStartupCheckStrategy; -import org.testcontainers.utility.DockerImageName; import static org.rnorth.visibleassertions.VisibleAssertions.assertEquals; import static org.rnorth.visibleassertions.VisibleAssertions.assertTrue; +import static org.testcontainers.TestingImages.ALPINE_IMAGE; import static org.testcontainers.containers.output.OutputFrame.OutputType.STDERR; import static org.testcontainers.containers.output.OutputFrame.OutputType.STDOUT; @@ -16,7 +16,7 @@ public class ContainerLogsTest { @Test @Ignore("fails due to the timing of the shell's decision to flush") public void getLogsReturnsAllLogsToDate() { - try (GenericContainer container = shortLivedContainer()) { + try (GenericContainer container = shortLivedContainer()) { container.start(); final String logs = container.getLogs(); @@ -26,7 +26,7 @@ public void getLogsReturnsAllLogsToDate() { @Test public void getLogsContainsBothOutputTypes() { - try (GenericContainer container = shortLivedContainer()) { + try (GenericContainer container = shortLivedContainer()) { container.start(); // docsGetAllLogs { @@ -39,7 +39,7 @@ public void getLogsContainsBothOutputTypes() { @Test public void getLogsReturnsStdOutToDate() { - try (GenericContainer container = shortLivedContainer()) { + try (GenericContainer container = shortLivedContainer()) { container.start(); // docsGetStdOut { @@ -51,7 +51,7 @@ public void getLogsReturnsStdOutToDate() { @Test public void getLogsReturnsStdErrToDate() { - try (GenericContainer container = shortLivedContainer()) { + try (GenericContainer container = shortLivedContainer()) { container.start(); // docsGetStdErr { @@ -63,7 +63,7 @@ public void getLogsReturnsStdErrToDate() { @Test public void getLogsForLongRunningContainer() throws InterruptedException { - try (GenericContainer container = longRunningContainer()) { + try (GenericContainer container = longRunningContainer()) { container.start(); Thread.sleep(1000L); @@ -73,14 +73,14 @@ public void getLogsForLongRunningContainer() throws InterruptedException { } } - private static GenericContainer shortLivedContainer() { - return new GenericContainer(new DockerImageName("alpine:3.3")) + private static GenericContainer shortLivedContainer() { + return new GenericContainer<>(ALPINE_IMAGE) .withCommand("/bin/sh", "-c", "echo -n 'stdout' && echo -n 'stderr' 1>&2") .withStartupCheckStrategy(new OneShotStartupCheckStrategy()); } - private static GenericContainer longRunningContainer() { - return new GenericContainer(new DockerImageName("alpine:3.3")) + private static GenericContainer longRunningContainer() { + return new GenericContainer<>(ALPINE_IMAGE) .withCommand("ping -c 100 127.0.0.1"); } } diff --git a/core/src/test/java/org/testcontainers/images/ImagePullPolicyTest.java b/core/src/test/java/org/testcontainers/images/ImagePullPolicyTest.java index 3145959ec2c..031c832562f 100644 --- a/core/src/test/java/org/testcontainers/images/ImagePullPolicyTest.java +++ b/core/src/test/java/org/testcontainers/images/ImagePullPolicyTest.java @@ -26,7 +26,7 @@ public class ImagePullPolicyTest { @ClassRule - public static GenericContainer registry = new GenericContainer(new DockerImageName("registry:2")) + public static GenericContainer registry = new GenericContainer<>(new DockerImageName("registry:2.7.0")) .withExposedPorts(5000); private static String imageName; diff --git a/core/src/test/java/org/testcontainers/junit/FileOperationsTest.java b/core/src/test/java/org/testcontainers/junit/FileOperationsTest.java index 4434bf7d20f..84b60ba7057 100644 --- a/core/src/test/java/org/testcontainers/junit/FileOperationsTest.java +++ b/core/src/test/java/org/testcontainers/junit/FileOperationsTest.java @@ -6,13 +6,13 @@ import org.junit.Test; import org.junit.rules.TemporaryFolder; import org.testcontainers.containers.GenericContainer; -import org.testcontainers.utility.DockerImageName; import org.testcontainers.utility.MountableFile; import java.io.File; import java.io.IOException; import static org.rnorth.visibleassertions.VisibleAssertions.assertTrue; +import static org.testcontainers.TestingImages.ALPINE_IMAGE; public class FileOperationsTest { @@ -22,7 +22,7 @@ public class FileOperationsTest { @Test public void copyFileToContainerFileTest() throws Exception { try ( - GenericContainer alpineCopyToContainer = new GenericContainer(new DockerImageName("alpine:3.2")) + GenericContainer alpineCopyToContainer = new GenericContainer(ALPINE_IMAGE) .withCommand("top") ) { alpineCopyToContainer.start(); @@ -40,7 +40,7 @@ public void copyFileToContainerFileTest() throws Exception { @Test public void copyFileToContainerFolderTest() throws Exception { try ( - GenericContainer alpineCopyToContainer = new GenericContainer(new DockerImageName("alpine:3.2")) + GenericContainer alpineCopyToContainer = new GenericContainer(ALPINE_IMAGE) .withCommand("top") ) { alpineCopyToContainer.start(); @@ -58,7 +58,7 @@ public void copyFileToContainerFolderTest() throws Exception { @Test public void copyFolderToContainerFolderTest() throws Exception { try ( - GenericContainer alpineCopyToContainer = new GenericContainer(new DockerImageName("alpine:3.2")) + GenericContainer alpineCopyToContainer = new GenericContainer(ALPINE_IMAGE) .withCommand("top") ) { @@ -77,7 +77,7 @@ public void copyFolderToContainerFolderTest() throws Exception { @Test(expected = NotFoundException.class) public void copyFromContainerShouldFailBecauseNoFileTest() throws NotFoundException { try ( - GenericContainer alpineCopyToContainer = new GenericContainer(new DockerImageName("alpine:3.2")) + GenericContainer alpineCopyToContainer = new GenericContainer(ALPINE_IMAGE) .withCommand("top") ) { alpineCopyToContainer.start(); @@ -88,7 +88,7 @@ public void copyFromContainerShouldFailBecauseNoFileTest() throws NotFoundExcept @Test public void shouldCopyFileFromContainerTest() throws IOException { try ( - GenericContainer alpineCopyToContainer = new GenericContainer(new DockerImageName("alpine:3.2")) + GenericContainer alpineCopyToContainer = new GenericContainer(ALPINE_IMAGE) .withCommand("top") ) { diff --git a/core/src/test/java/org/testcontainers/junit/NonExistentImagePullTest.java b/core/src/test/java/org/testcontainers/junit/NonExistentImagePullTest.java index ddc4ea9be15..7c89e0f23a4 100644 --- a/core/src/test/java/org/testcontainers/junit/NonExistentImagePullTest.java +++ b/core/src/test/java/org/testcontainers/junit/NonExistentImagePullTest.java @@ -17,7 +17,7 @@ public void pullingNonExistentImageFailsGracefully() { assertThrows("Pulling a nonexistent container will cause an exception to be thrown", ContainerFetchException.class, () -> { - new GenericContainer(new DockerImageName("richnorth/nonexistent:latest")).getDockerImageName(); + new GenericContainer<>(new DockerImageName("testcontainers/nonexistent:latest")).getDockerImageName(); }); } } diff --git a/core/src/test/java/org/testcontainers/junit/OutputStreamTest.java b/core/src/test/java/org/testcontainers/junit/OutputStreamTest.java index c9e61b6e3f4..fae1553755d 100644 --- a/core/src/test/java/org/testcontainers/junit/OutputStreamTest.java +++ b/core/src/test/java/org/testcontainers/junit/OutputStreamTest.java @@ -9,7 +9,6 @@ import org.testcontainers.containers.output.Slf4jLogConsumer; import org.testcontainers.containers.output.ToStringConsumer; import org.testcontainers.containers.output.WaitingConsumer; -import org.testcontainers.utility.DockerImageName; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; @@ -18,6 +17,7 @@ import static org.rnorth.visibleassertions.VisibleAssertions.assertFalse; import static org.rnorth.visibleassertions.VisibleAssertions.assertThrows; import static org.rnorth.visibleassertions.VisibleAssertions.assertTrue; +import static org.testcontainers.TestingImages.ALPINE_IMAGE; import static org.testcontainers.containers.output.OutputFrame.OutputType.STDOUT; /** @@ -26,7 +26,7 @@ public class OutputStreamTest { @Rule - public GenericContainer container = new GenericContainer(new DockerImageName("alpine:3.2")) + public GenericContainer container = new GenericContainer(ALPINE_IMAGE) .withCommand("ping -c 5 127.0.0.1"); private static final Logger LOGGER = LoggerFactory.getLogger(OutputStreamTest.class); diff --git a/core/src/test/java/org/testcontainers/junit/OutputStreamWithTTYTest.java b/core/src/test/java/org/testcontainers/junit/OutputStreamWithTTYTest.java index 183b2be8aaa..ffedf24916b 100644 --- a/core/src/test/java/org/testcontainers/junit/OutputStreamWithTTYTest.java +++ b/core/src/test/java/org/testcontainers/junit/OutputStreamWithTTYTest.java @@ -10,7 +10,6 @@ import org.testcontainers.containers.output.ToStringConsumer; import org.testcontainers.containers.output.WaitingConsumer; import org.testcontainers.containers.startupcheck.OneShotStartupCheckStrategy; -import org.testcontainers.utility.DockerImageName; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; @@ -19,13 +18,14 @@ import static org.rnorth.visibleassertions.VisibleAssertions.assertFalse; import static org.rnorth.visibleassertions.VisibleAssertions.assertThrows; import static org.rnorth.visibleassertions.VisibleAssertions.assertTrue; +import static org.testcontainers.TestingImages.ALPINE_IMAGE; import static org.testcontainers.containers.output.OutputFrame.OutputType.STDOUT; @Slf4j public class OutputStreamWithTTYTest { @Rule - public GenericContainer container = new GenericContainer(new DockerImageName("alpine:3.2")) + public GenericContainer container = new GenericContainer<>(ALPINE_IMAGE) .withCommand("ls -1") .withStartupCheckStrategy(new OneShotStartupCheckStrategy()) .withCreateContainerCmdModifier(command -> command.withTty(true)); diff --git a/core/src/test/java/org/testcontainers/junit/WorkingDirectoryTest.java b/core/src/test/java/org/testcontainers/junit/WorkingDirectoryTest.java index f9fa2fc293d..012138e986f 100644 --- a/core/src/test/java/org/testcontainers/junit/WorkingDirectoryTest.java +++ b/core/src/test/java/org/testcontainers/junit/WorkingDirectoryTest.java @@ -4,9 +4,9 @@ import org.junit.Test; import org.testcontainers.containers.GenericContainer; import org.testcontainers.containers.startupcheck.OneShotStartupCheckStrategy; -import org.testcontainers.utility.DockerImageName; import static org.rnorth.visibleassertions.VisibleAssertions.assertTrue; +import static org.testcontainers.TestingImages.ALPINE_IMAGE; /** * Created by rnorth on 26/07/2016. @@ -14,7 +14,7 @@ public class WorkingDirectoryTest { @ClassRule - public static GenericContainer container = new GenericContainer(new DockerImageName("alpine:3.2")) + public static GenericContainer container = new GenericContainer(ALPINE_IMAGE) .withWorkingDirectory("/etc") .withStartupCheckStrategy(new OneShotStartupCheckStrategy()) .withCommand("ls", "-al"); diff --git a/examples/redis-backed-cache-testng/src/test/java/RedisBackedCacheTest.java b/examples/redis-backed-cache-testng/src/test/java/RedisBackedCacheTest.java index 59b17b22f7e..92ea85e8c9a 100644 --- a/examples/redis-backed-cache-testng/src/test/java/RedisBackedCacheTest.java +++ b/examples/redis-backed-cache-testng/src/test/java/RedisBackedCacheTest.java @@ -1,6 +1,7 @@ import com.mycompany.cache.Cache; import com.mycompany.cache.RedisBackedCache; import org.testcontainers.containers.GenericContainer; +import org.testcontainers.utility.DockerImageName; import org.testng.annotations.AfterClass; import org.testng.annotations.BeforeClass; import org.testng.annotations.BeforeMethod; @@ -18,7 +19,7 @@ */ public class RedisBackedCacheTest { - private static GenericContainer redis = new GenericContainer(org.testcontainers.utility.DockerImageName.dockerImage("redis:3.0.6")).withExposedPorts(6379); + private static GenericContainer redis = new GenericContainer<>(new DockerImageName("redis:3.0.6")).withExposedPorts(6379); private Cache cache; diff --git a/modules/localstack/src/test/java/org/testcontainers/containers/localstack/LocalstackContainerTest.java b/modules/localstack/src/test/java/org/testcontainers/containers/localstack/LocalstackContainerTest.java index 5c04024e501..725e9537db9 100644 --- a/modules/localstack/src/test/java/org/testcontainers/containers/localstack/LocalstackContainerTest.java +++ b/modules/localstack/src/test/java/org/testcontainers/containers/localstack/LocalstackContainerTest.java @@ -168,7 +168,7 @@ public static class WithNetwork { // } @ClassRule - public static GenericContainer awsCliInDockerNetwork = new GenericContainer(new DockerImageName("atlassian/pipelines-awscli")) + public static GenericContainer awsCliInDockerNetwork = new GenericContainer<>(new DockerImageName("atlassian/pipelines-awscli")) .withNetwork(network) .withCreateContainerCmdModifier(cmd -> cmd.withEntrypoint("top")) .withEnv("AWS_ACCESS_KEY_ID", "accesskey") From 054b637698318f587a4c41f34e81149d2ae71cca Mon Sep 17 00:00:00 2001 From: Richard North Date: Thu, 25 Jun 2020 19:32:21 +0100 Subject: [PATCH 03/17] WIP --- core/src/test/java/org/testcontainers/DaemonTest.java | 1 + .../java/org/testcontainers/junit/CopyFileToContainerTest.java | 1 + .../test/java/org/testcontainers/junit/DependenciesTest.java | 2 ++ .../java/org/testcontainers/junit/DockerNetworkModeTest.java | 1 + 4 files changed, 5 insertions(+) diff --git a/core/src/test/java/org/testcontainers/DaemonTest.java b/core/src/test/java/org/testcontainers/DaemonTest.java index b4ccf4da374..8d814fb827b 100644 --- a/core/src/test/java/org/testcontainers/DaemonTest.java +++ b/core/src/test/java/org/testcontainers/DaemonTest.java @@ -10,6 +10,7 @@ import java.util.stream.Collectors; import static org.junit.Assert.assertEquals; +import static org.testcontainers.TestingImages.TINY_IMAGE; /** * This test forks a new JVM, otherwise it's not possible to reliably diff the threads diff --git a/core/src/test/java/org/testcontainers/junit/CopyFileToContainerTest.java b/core/src/test/java/org/testcontainers/junit/CopyFileToContainerTest.java index 4a10f9b1ea6..8001f730a51 100644 --- a/core/src/test/java/org/testcontainers/junit/CopyFileToContainerTest.java +++ b/core/src/test/java/org/testcontainers/junit/CopyFileToContainerTest.java @@ -11,6 +11,7 @@ import static org.rnorth.visibleassertions.VisibleAssertions.assertFalse; import static org.rnorth.visibleassertions.VisibleAssertions.assertTrue; +import static org.testcontainers.TestingImages.TINY_IMAGE; public class CopyFileToContainerTest { private static String containerPath = "/tmp/mappable-resource/"; diff --git a/core/src/test/java/org/testcontainers/junit/DependenciesTest.java b/core/src/test/java/org/testcontainers/junit/DependenciesTest.java index 4c98e0728f8..59e2c7ae0f6 100644 --- a/core/src/test/java/org/testcontainers/junit/DependenciesTest.java +++ b/core/src/test/java/org/testcontainers/junit/DependenciesTest.java @@ -16,6 +16,8 @@ import java.util.stream.Collectors; import java.util.stream.Stream; +import static org.testcontainers.TestingImages.TINY_IMAGE; + public class DependenciesTest { @Test diff --git a/core/src/test/java/org/testcontainers/junit/DockerNetworkModeTest.java b/core/src/test/java/org/testcontainers/junit/DockerNetworkModeTest.java index 74c3bbd576e..0b078752c8d 100644 --- a/core/src/test/java/org/testcontainers/junit/DockerNetworkModeTest.java +++ b/core/src/test/java/org/testcontainers/junit/DockerNetworkModeTest.java @@ -8,6 +8,7 @@ import static org.rnorth.visibleassertions.VisibleAssertions.assertEquals; import static org.rnorth.visibleassertions.VisibleAssertions.assertTrue; +import static org.testcontainers.TestingImages.TINY_IMAGE; /** * Simple tests of named network modes - more may be possible, but may not be reproducible From 196f1a9da93bd8ae36d36550d549c90fc5a6024e Mon Sep 17 00:00:00 2001 From: Richard North Date: Mon, 29 Jun 2020 19:16:41 +0100 Subject: [PATCH 04/17] WIP --- .../OutOfPackageImagePullPolicyTest.java | 4 ++- .../java/org/testcontainers/DaemonTest.java | 2 +- .../{TestingImages.java => TestImages.java} | 2 +- .../containers/ExposedHostTest.java | 2 +- .../containers/GenericContainerTest.java | 5 +-- .../containers/NetworkTest.java | 24 +++++++------- .../containers/output/ContainerLogsTest.java | 2 +- .../dockerclient/EventStreamTest.java | 2 +- .../dockerclient/ImagePullTest.java | 4 +-- .../junit/CopyFileToContainerTest.java | 2 +- .../junit/DependenciesTest.java | 2 +- .../junit/DockerNetworkModeTest.java | 2 +- .../junit/FileOperationsTest.java | 2 +- .../junit/FixedHostPortContainerTest.java | 2 +- .../junit/GenericContainerRuleTest.java | 10 +++--- .../junit/OutputStreamTest.java | 2 +- .../junit/OutputStreamWithTTYTest.java | 2 +- .../junit/WorkingDirectoryTest.java | 2 +- .../strategy/AbstractWaitStrategyTest.java | 21 ++++++------ .../strategy/HostPortWaitStrategyTest.java | 6 ++-- .../utility/AuthenticatedImagePullTest.java | 2 +- .../containers/MongoDbContainer.java | 9 ++++- .../containers/MongoDbContainerTest.java | 7 ++-- .../test/java/com/example/SolrQueryTest.java | 21 +++++++----- .../testcontainers/ClickhouseTestImages.java | 7 ++++ .../clickhouse/SimpleClickhouseTest.java | 3 +- .../testcontainers/CockroachDBTestImages.java | 7 ++++ .../cockroachdb/SimpleCockroachDBTest.java | 7 ++-- .../org/testcontainers/Db2TestImages.java | 7 ++++ .../junit/db2/SimpleDb2Test.java | 5 +-- .../ElasticsearchContainerTest.java | 1 + .../containers/InfluxDBContainerTest.java | 2 +- .../InfluxDBContainerWithUserTest.java | 4 +-- .../containers/InfluxDBTestImages.java | 7 ++++ .../junit/jupiter/JUnitJupiterTestImages.java | 8 +++++ .../junit/jupiter/PostgresContainerTests.java | 3 +- ...ntainersNestedRestartedContainerTests.java | 6 ++-- ...tcontainersNestedSharedContainerTests.java | 4 +-- .../TestcontainersRestartBetweenTests.java | 4 +-- .../TestcontainersSharedContainerTests.java | 4 +-- .../containers/KafkaContainerTest.java | 9 +++-- .../containers/KafkaTestImages.java | 8 +++++ .../localstack/LocalstackContainerTest.java | 12 ++++--- .../localstack/LocalstackTestImages.java | 8 +++++ .../org/testcontainers/MariaDBTestImages.java | 7 ++++ .../MariaDBR2DBCDatabaseContainerTest.java | 2 +- .../junit/mariadb/SimpleMariaDBTest.java | 12 ++++--- .../containers/MongoDBContainerTest.java | 3 +- .../containers/MongoTestImages.java | 7 ++++ .../testcontainers/MSSQLServerTestImages.java | 7 ++++ .../MSSQLR2DBCDatabaseContainerTest.java | 4 +-- .../CustomPasswordMSSQLServerTest.java | 4 +-- .../mssqlserver/SimpleMSSQLServerTest.java | 8 +++-- .../org/testcontainers/MySQLTestImages.java | 9 +++++ .../MySQLR2DBCDatabaseContainerTest.java | 4 +-- .../junit/mysql/CustomizableMysqlTest.java | 4 +-- .../junit/mysql/SimpleMySQLTest.java | 31 +++++++++-------- .../Neo4jContainerJUnitIntegrationTest.java | 11 ++++--- .../containers/Neo4jContainerTest.java | 33 ++++++++++--------- .../containers/Neo4jTestImages.java | 7 ++++ .../testcontainers/junit/SimpleNginxTest.java | 5 ++- .../containers/OrientDBContainerTest.java | 11 ++++--- .../testcontainers/PostgreSQLTestImages.java | 7 ++++ .../PostgreSQLR2DBCDatabaseContainerTest.java | 4 +-- .../CustomizablePostgreSQLTest.java | 4 +-- .../postgresql/SimplePostgreSQLTest.java | 11 ++++--- .../testcontainers/SeleniumTestImages.java | 7 ++++ .../junit/LinkedContainerTest.java | 12 ++++--- .../testcontainers/junit/Selenium3xTest.java | 4 ++- ...ecificImageNameWebDriverContainerTest.java | 8 ++--- .../containers/SolrContainerTest.java | 21 +++++++----- .../testcontainers/ToxiproxyTestImages.java | 8 +++++ .../containers/ToxiproxyTest.java | 8 ++--- .../testcontainers/vault/VaultClientTest.java | 3 +- .../vault/VaultContainerTest.java | 2 +- .../testcontainers/vault/VaultTestImages.java | 7 ++++ 76 files changed, 347 insertions(+), 183 deletions(-) rename core/src/test/java/org/testcontainers/{TestingImages.java => TestImages.java} (94%) create mode 100644 modules/clickhouse/src/test/java/org/testcontainers/ClickhouseTestImages.java create mode 100644 modules/cockroachdb/src/test/java/org/testcontainers/CockroachDBTestImages.java create mode 100644 modules/db2/src/test/java/org/testcontainers/Db2TestImages.java create mode 100644 modules/influxdb/src/test/java/org/testcontainers/containers/InfluxDBTestImages.java create mode 100644 modules/junit-jupiter/src/test/java/org/testcontainers/junit/jupiter/JUnitJupiterTestImages.java create mode 100644 modules/kafka/src/test/java/org/testcontainers/containers/KafkaTestImages.java create mode 100644 modules/localstack/src/test/java/org/testcontainers/containers/localstack/LocalstackTestImages.java create mode 100644 modules/mariadb/src/test/java/org/testcontainers/MariaDBTestImages.java create mode 100644 modules/mongodb/src/test/java/org/testcontainers/containers/MongoTestImages.java create mode 100644 modules/mssqlserver/src/test/java/org/testcontainers/MSSQLServerTestImages.java create mode 100644 modules/mysql/src/test/java/org/testcontainers/MySQLTestImages.java create mode 100644 modules/neo4j/src/test/java/org/testcontainers/containers/Neo4jTestImages.java create mode 100644 modules/postgresql/src/test/java/org/testcontainers/PostgreSQLTestImages.java create mode 100644 modules/selenium/src/test/java/org/testcontainers/SeleniumTestImages.java create mode 100644 modules/toxiproxy/src/test/java/org/testcontainers/ToxiproxyTestImages.java create mode 100644 modules/vault/src/test/java/org/testcontainers/vault/VaultTestImages.java diff --git a/core/src/test/java/alt/testcontainers/images/OutOfPackageImagePullPolicyTest.java b/core/src/test/java/alt/testcontainers/images/OutOfPackageImagePullPolicyTest.java index 2da41a8344e..e4197c7c1f6 100644 --- a/core/src/test/java/alt/testcontainers/images/OutOfPackageImagePullPolicyTest.java +++ b/core/src/test/java/alt/testcontainers/images/OutOfPackageImagePullPolicyTest.java @@ -7,11 +7,13 @@ import org.testcontainers.images.ImageData; import org.testcontainers.utility.DockerImageName; +import static org.testcontainers.TestImages.TINY_IMAGE; + public class OutOfPackageImagePullPolicyTest { @Test public void shouldSupportCustomPoliciesOutOfTestContainersPackage() { try ( - GenericContainer container = new GenericContainer<>() + GenericContainer container = new GenericContainer<>(TINY_IMAGE) .withImagePullPolicy(new AbstractImagePullPolicy() { @Override protected boolean shouldPullCached(DockerImageName imageName, ImageData localImageData) { diff --git a/core/src/test/java/org/testcontainers/DaemonTest.java b/core/src/test/java/org/testcontainers/DaemonTest.java index 8d814fb827b..f08614c8cdc 100644 --- a/core/src/test/java/org/testcontainers/DaemonTest.java +++ b/core/src/test/java/org/testcontainers/DaemonTest.java @@ -10,7 +10,7 @@ import java.util.stream.Collectors; import static org.junit.Assert.assertEquals; -import static org.testcontainers.TestingImages.TINY_IMAGE; +import static org.testcontainers.TestImages.TINY_IMAGE; /** * This test forks a new JVM, otherwise it's not possible to reliably diff the threads diff --git a/core/src/test/java/org/testcontainers/TestingImages.java b/core/src/test/java/org/testcontainers/TestImages.java similarity index 94% rename from core/src/test/java/org/testcontainers/TestingImages.java rename to core/src/test/java/org/testcontainers/TestImages.java index daca0b68c2c..dfacceb2a80 100644 --- a/core/src/test/java/org/testcontainers/TestingImages.java +++ b/core/src/test/java/org/testcontainers/TestImages.java @@ -3,7 +3,7 @@ import org.testcontainers.utility.DockerImageName; import org.testcontainers.utility.TestcontainersConfiguration; -public interface TestingImages { +public interface TestImages { DockerImageName REDIS_IMAGE = new DockerImageName("redis:3.0.2"); DockerImageName RABBITMQ_IMAGE = new DockerImageName("rabbitmq:3.5.3"); DockerImageName MONGODB_IMAGE = new DockerImageName("mongo:3.1.5"); diff --git a/core/src/test/java/org/testcontainers/containers/ExposedHostTest.java b/core/src/test/java/org/testcontainers/containers/ExposedHostTest.java index 008faf381ba..d17b0709dfa 100644 --- a/core/src/test/java/org/testcontainers/containers/ExposedHostTest.java +++ b/core/src/test/java/org/testcontainers/containers/ExposedHostTest.java @@ -12,7 +12,7 @@ import java.net.InetSocketAddress; import static org.rnorth.visibleassertions.VisibleAssertions.assertEquals; -import static org.testcontainers.TestingImages.TINY_IMAGE; +import static org.testcontainers.TestImages.TINY_IMAGE; public class ExposedHostTest { diff --git a/core/src/test/java/org/testcontainers/containers/GenericContainerTest.java b/core/src/test/java/org/testcontainers/containers/GenericContainerTest.java index 78a7a3b1bef..3a1b5b19633 100644 --- a/core/src/test/java/org/testcontainers/containers/GenericContainerTest.java +++ b/core/src/test/java/org/testcontainers/containers/GenericContainerTest.java @@ -9,6 +9,7 @@ import org.apache.commons.io.FileUtils; import org.junit.Test; import org.rnorth.ducttape.unreliables.Unreliables; +import org.testcontainers.TestImages; import org.testcontainers.containers.startupcheck.StartupCheckStrategy; import org.testcontainers.containers.wait.strategy.AbstractWaitStrategy; @@ -22,7 +23,7 @@ public class GenericContainerTest { @Test public void shouldReportOOMAfterWait() { try ( - GenericContainer container = new GenericContainer<>() + GenericContainer container = new GenericContainer<>(TestImages.TINY_IMAGE) .withStartupCheckStrategy(new NoopStartupCheckStrategy()) .waitingFor(new WaitForExitedState(ContainerState::getOOMKilled)) .withCreateContainerCmdModifier(it -> { @@ -43,7 +44,7 @@ public void shouldReportOOMAfterWait() { @Test public void shouldReportErrorAfterWait() { try ( - GenericContainer container = new GenericContainer<>() + GenericContainer container = new GenericContainer<>(TestImages.TINY_IMAGE) .withStartupCheckStrategy(new NoopStartupCheckStrategy()) .waitingFor(new WaitForExitedState(state -> state.getExitCode() > 0)) .withCommand("sh", "-c", "usleep 100; exit 123") diff --git a/core/src/test/java/org/testcontainers/containers/NetworkTest.java b/core/src/test/java/org/testcontainers/containers/NetworkTest.java index b717b8dc81a..a39f0552a5a 100644 --- a/core/src/test/java/org/testcontainers/containers/NetworkTest.java +++ b/core/src/test/java/org/testcontainers/containers/NetworkTest.java @@ -5,9 +5,11 @@ import org.junit.experimental.runners.Enclosed; import org.junit.runner.RunWith; import org.testcontainers.DockerClientFactory; -import org.testcontainers.containers.Network; +import org.testcontainers.TestImages; -import static org.rnorth.visibleassertions.VisibleAssertions.*; +import static org.rnorth.visibleassertions.VisibleAssertions.assertEquals; +import static org.rnorth.visibleassertions.VisibleAssertions.assertNotEquals; +import static org.rnorth.visibleassertions.VisibleAssertions.assertNotNull; import static org.testcontainers.containers.Network.newNetwork; @RunWith(Enclosed.class) @@ -19,13 +21,13 @@ public static class WithRules { public Network network = newNetwork(); @Rule - public GenericContainer foo = new GenericContainer() + public GenericContainer foo = new GenericContainer<>(TestImages.TINY_IMAGE) .withNetwork(network) .withNetworkAliases("foo") .withCommand("/bin/sh", "-c", "while true ; do printf 'HTTP/1.1 200 OK\\n\\nyay' | nc -l -p 8080; done"); @Rule - public GenericContainer bar = new GenericContainer() + public GenericContainer bar = new GenericContainer<>(TestImages.TINY_IMAGE) .withNetwork(network) .withCommand("top"); @@ -44,12 +46,12 @@ public void testNetworkSupport() throws Exception { try ( Network network = Network.newNetwork(); - GenericContainer foo = new GenericContainer() + GenericContainer foo = new GenericContainer<>(TestImages.TINY_IMAGE) .withNetwork(network) .withNetworkAliases("foo") .withCommand("/bin/sh", "-c", "while true ; do printf 'HTTP/1.1 200 OK\\n\\nyay' | nc -l -p 8080; done"); - GenericContainer bar = new GenericContainer() + GenericContainer bar = new GenericContainer<>(TestImages.TINY_IMAGE) .withNetwork(network) .withCommand("top") ) { @@ -63,11 +65,11 @@ public void testNetworkSupport() throws Exception { } @Test - public void testBuilder() throws Exception { + public void testBuilder() { try ( Network network = Network.builder() .driver("macvlan") - .build(); + .build() ) { String id = network.getId(); assertEquals( @@ -79,11 +81,11 @@ public void testBuilder() throws Exception { } @Test - public void testModifiers() throws Exception { + public void testModifiers() { try ( Network network = Network.builder() .createNetworkCmdModifier(cmd -> cmd.withDriver("macvlan")) - .build(); + .build() ) { String id = network.getId(); assertEquals( @@ -95,7 +97,7 @@ public void testModifiers() throws Exception { } @Test - public void testReusability() throws Exception { + public void testReusability() { try (Network network = Network.newNetwork()) { String firstId = network.getId(); assertNotNull( diff --git a/core/src/test/java/org/testcontainers/containers/output/ContainerLogsTest.java b/core/src/test/java/org/testcontainers/containers/output/ContainerLogsTest.java index 1f64c368847..05ef7373293 100644 --- a/core/src/test/java/org/testcontainers/containers/output/ContainerLogsTest.java +++ b/core/src/test/java/org/testcontainers/containers/output/ContainerLogsTest.java @@ -7,7 +7,7 @@ import static org.rnorth.visibleassertions.VisibleAssertions.assertEquals; import static org.rnorth.visibleassertions.VisibleAssertions.assertTrue; -import static org.testcontainers.TestingImages.ALPINE_IMAGE; +import static org.testcontainers.TestImages.ALPINE_IMAGE; import static org.testcontainers.containers.output.OutputFrame.OutputType.STDERR; import static org.testcontainers.containers.output.OutputFrame.OutputType.STDOUT; diff --git a/core/src/test/java/org/testcontainers/dockerclient/EventStreamTest.java b/core/src/test/java/org/testcontainers/dockerclient/EventStreamTest.java index f3a03a26677..a43a001ca5b 100644 --- a/core/src/test/java/org/testcontainers/dockerclient/EventStreamTest.java +++ b/core/src/test/java/org/testcontainers/dockerclient/EventStreamTest.java @@ -16,7 +16,7 @@ import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; -import static org.testcontainers.TestingImages.TINY_IMAGE; +import static org.testcontainers.TestImages.TINY_IMAGE; /** * Test that event streaming from the {@link DockerClient} works correctly diff --git a/core/src/test/java/org/testcontainers/dockerclient/ImagePullTest.java b/core/src/test/java/org/testcontainers/dockerclient/ImagePullTest.java index 9ddb4825c8f..b8b7c116b34 100644 --- a/core/src/test/java/org/testcontainers/dockerclient/ImagePullTest.java +++ b/core/src/test/java/org/testcontainers/dockerclient/ImagePullTest.java @@ -10,7 +10,7 @@ @RunWith(Parameterized.class) public class ImagePullTest { - private String image; + private final String image; @Parameterized.Parameters(name = "{0}") public static String[] parameters() { @@ -35,7 +35,7 @@ public ImagePullTest(String image) { @Test public void test() { - try (final GenericContainer container = new GenericContainer(new DockerImageName(image)) + try (final GenericContainer container = new GenericContainer<>(new DockerImageName(image)) .withCommand("/bin/sh", "-c", "sleep 0") .withStartupCheckStrategy(new OneShotStartupCheckStrategy())) { container.start(); diff --git a/core/src/test/java/org/testcontainers/junit/CopyFileToContainerTest.java b/core/src/test/java/org/testcontainers/junit/CopyFileToContainerTest.java index 8001f730a51..b0ed90d9c9e 100644 --- a/core/src/test/java/org/testcontainers/junit/CopyFileToContainerTest.java +++ b/core/src/test/java/org/testcontainers/junit/CopyFileToContainerTest.java @@ -11,7 +11,7 @@ import static org.rnorth.visibleassertions.VisibleAssertions.assertFalse; import static org.rnorth.visibleassertions.VisibleAssertions.assertTrue; -import static org.testcontainers.TestingImages.TINY_IMAGE; +import static org.testcontainers.TestImages.TINY_IMAGE; public class CopyFileToContainerTest { private static String containerPath = "/tmp/mappable-resource/"; diff --git a/core/src/test/java/org/testcontainers/junit/DependenciesTest.java b/core/src/test/java/org/testcontainers/junit/DependenciesTest.java index 59e2c7ae0f6..bd82c58a7f7 100644 --- a/core/src/test/java/org/testcontainers/junit/DependenciesTest.java +++ b/core/src/test/java/org/testcontainers/junit/DependenciesTest.java @@ -16,7 +16,7 @@ import java.util.stream.Collectors; import java.util.stream.Stream; -import static org.testcontainers.TestingImages.TINY_IMAGE; +import static org.testcontainers.TestImages.TINY_IMAGE; public class DependenciesTest { diff --git a/core/src/test/java/org/testcontainers/junit/DockerNetworkModeTest.java b/core/src/test/java/org/testcontainers/junit/DockerNetworkModeTest.java index 0b078752c8d..59c2a63127c 100644 --- a/core/src/test/java/org/testcontainers/junit/DockerNetworkModeTest.java +++ b/core/src/test/java/org/testcontainers/junit/DockerNetworkModeTest.java @@ -8,7 +8,7 @@ import static org.rnorth.visibleassertions.VisibleAssertions.assertEquals; import static org.rnorth.visibleassertions.VisibleAssertions.assertTrue; -import static org.testcontainers.TestingImages.TINY_IMAGE; +import static org.testcontainers.TestImages.TINY_IMAGE; /** * Simple tests of named network modes - more may be possible, but may not be reproducible diff --git a/core/src/test/java/org/testcontainers/junit/FileOperationsTest.java b/core/src/test/java/org/testcontainers/junit/FileOperationsTest.java index 84b60ba7057..5e12fafc064 100644 --- a/core/src/test/java/org/testcontainers/junit/FileOperationsTest.java +++ b/core/src/test/java/org/testcontainers/junit/FileOperationsTest.java @@ -12,7 +12,7 @@ import java.io.IOException; import static org.rnorth.visibleassertions.VisibleAssertions.assertTrue; -import static org.testcontainers.TestingImages.ALPINE_IMAGE; +import static org.testcontainers.TestImages.ALPINE_IMAGE; public class FileOperationsTest { diff --git a/core/src/test/java/org/testcontainers/junit/FixedHostPortContainerTest.java b/core/src/test/java/org/testcontainers/junit/FixedHostPortContainerTest.java index c2e76310dfa..34c039b4fd3 100644 --- a/core/src/test/java/org/testcontainers/junit/FixedHostPortContainerTest.java +++ b/core/src/test/java/org/testcontainers/junit/FixedHostPortContainerTest.java @@ -14,7 +14,7 @@ import static org.hamcrest.CoreMatchers.equalTo; import static org.hamcrest.MatcherAssert.assertThat; -import static org.testcontainers.TestingImages.TINY_IMAGE; +import static org.testcontainers.TestImages.TINY_IMAGE; /** * Test of {@link FixedHostPortGenericContainer}. Note that this is not an example of typical use (usually, a container diff --git a/core/src/test/java/org/testcontainers/junit/GenericContainerRuleTest.java b/core/src/test/java/org/testcontainers/junit/GenericContainerRuleTest.java index fee1b3ddc88..c13421029e0 100644 --- a/core/src/test/java/org/testcontainers/junit/GenericContainerRuleTest.java +++ b/core/src/test/java/org/testcontainers/junit/GenericContainerRuleTest.java @@ -50,11 +50,11 @@ import static org.rnorth.visibleassertions.VisibleAssertions.assertThat; import static org.rnorth.visibleassertions.VisibleAssertions.assertThrows; import static org.rnorth.visibleassertions.VisibleAssertions.assertTrue; -import static org.testcontainers.TestingImages.ALPINE_IMAGE; -import static org.testcontainers.TestingImages.MONGODB_IMAGE; -import static org.testcontainers.TestingImages.RABBITMQ_IMAGE; -import static org.testcontainers.TestingImages.REDIS_IMAGE; -import static org.testcontainers.TestingImages.TINY_IMAGE; +import static org.testcontainers.TestImages.ALPINE_IMAGE; +import static org.testcontainers.TestImages.MONGODB_IMAGE; +import static org.testcontainers.TestImages.RABBITMQ_IMAGE; +import static org.testcontainers.TestImages.REDIS_IMAGE; +import static org.testcontainers.TestImages.TINY_IMAGE; import static org.testcontainers.containers.BindMode.READ_ONLY; import static org.testcontainers.containers.BindMode.READ_WRITE; import static org.testcontainers.containers.SelinuxContext.SHARED; diff --git a/core/src/test/java/org/testcontainers/junit/OutputStreamTest.java b/core/src/test/java/org/testcontainers/junit/OutputStreamTest.java index fae1553755d..649a0b56fc4 100644 --- a/core/src/test/java/org/testcontainers/junit/OutputStreamTest.java +++ b/core/src/test/java/org/testcontainers/junit/OutputStreamTest.java @@ -17,7 +17,7 @@ import static org.rnorth.visibleassertions.VisibleAssertions.assertFalse; import static org.rnorth.visibleassertions.VisibleAssertions.assertThrows; import static org.rnorth.visibleassertions.VisibleAssertions.assertTrue; -import static org.testcontainers.TestingImages.ALPINE_IMAGE; +import static org.testcontainers.TestImages.ALPINE_IMAGE; import static org.testcontainers.containers.output.OutputFrame.OutputType.STDOUT; /** diff --git a/core/src/test/java/org/testcontainers/junit/OutputStreamWithTTYTest.java b/core/src/test/java/org/testcontainers/junit/OutputStreamWithTTYTest.java index ffedf24916b..b15f63f4158 100644 --- a/core/src/test/java/org/testcontainers/junit/OutputStreamWithTTYTest.java +++ b/core/src/test/java/org/testcontainers/junit/OutputStreamWithTTYTest.java @@ -18,7 +18,7 @@ import static org.rnorth.visibleassertions.VisibleAssertions.assertFalse; import static org.rnorth.visibleassertions.VisibleAssertions.assertThrows; import static org.rnorth.visibleassertions.VisibleAssertions.assertTrue; -import static org.testcontainers.TestingImages.ALPINE_IMAGE; +import static org.testcontainers.TestImages.ALPINE_IMAGE; import static org.testcontainers.containers.output.OutputFrame.OutputType.STDOUT; @Slf4j diff --git a/core/src/test/java/org/testcontainers/junit/WorkingDirectoryTest.java b/core/src/test/java/org/testcontainers/junit/WorkingDirectoryTest.java index 012138e986f..b23ddf2ca1c 100644 --- a/core/src/test/java/org/testcontainers/junit/WorkingDirectoryTest.java +++ b/core/src/test/java/org/testcontainers/junit/WorkingDirectoryTest.java @@ -6,7 +6,7 @@ import org.testcontainers.containers.startupcheck.OneShotStartupCheckStrategy; import static org.rnorth.visibleassertions.VisibleAssertions.assertTrue; -import static org.testcontainers.TestingImages.ALPINE_IMAGE; +import static org.testcontainers.TestImages.ALPINE_IMAGE; /** * Created by rnorth on 26/07/2016. diff --git a/core/src/test/java/org/testcontainers/junit/wait/strategy/AbstractWaitStrategyTest.java b/core/src/test/java/org/testcontainers/junit/wait/strategy/AbstractWaitStrategyTest.java index c5b6bcb7095..480536a54ef 100644 --- a/core/src/test/java/org/testcontainers/junit/wait/strategy/AbstractWaitStrategyTest.java +++ b/core/src/test/java/org/testcontainers/junit/wait/strategy/AbstractWaitStrategyTest.java @@ -4,10 +4,10 @@ import org.junit.Before; import org.rnorth.ducttape.RetryCountExceededException; import org.rnorth.visibleassertions.VisibleAssertions; +import org.testcontainers.TestImages; import org.testcontainers.containers.ContainerLaunchException; import org.testcontainers.containers.GenericContainer; import org.testcontainers.containers.wait.strategy.WaitStrategy; -import org.testcontainers.utility.DockerImageName; import java.time.Duration; import java.util.concurrent.atomic.AtomicBoolean; @@ -21,7 +21,6 @@ */ public abstract class AbstractWaitStrategyTest { static final long WAIT_TIMEOUT_MILLIS = 3000; - static final String IMAGE_NAME = "alpine:3.7"; /** * Indicates that the WaitStrategy has completed waiting successfully. @@ -39,36 +38,36 @@ public abstract class AbstractWaitStrategyTest { protected abstract W buildWaitStrategy(final AtomicBoolean ready); @Before - public void setUp() throws Exception { + public void setUp() { ready = new AtomicBoolean(false); } /** - * Starts a GenericContainer with the {@link #IMAGE_NAME} image, passing the given {@code shellCommand} as + * Starts a GenericContainer with the Alpine image, passing the given {@code shellCommand} as * a parameter to {@literal sh -c} (the container CMD). * * @param shellCommand the shell command to execute * @return the (unstarted) container */ - private GenericContainer startContainerWithCommand(String shellCommand) { + private GenericContainer startContainerWithCommand(String shellCommand) { return startContainerWithCommand(shellCommand, buildWaitStrategy(ready)); } /** - * Starts a GenericContainer with the {@link #IMAGE_NAME} image, passing the given {@code shellCommand} as + * Starts a GenericContainer with the Alpine image, passing the given {@code shellCommand} as * a parameter to {@literal sh -c} (the container CMD) and apply a give wait strategy. * Note that the timeout will be overwritten if any with {@link #WAIT_TIMEOUT_MILLIS}. * @param shellCommand the shell command to execute * @param waitStrategy The wait strategy to apply * @return the (unstarted) container */ - protected GenericContainer startContainerWithCommand(String shellCommand, WaitStrategy waitStrategy) { + protected GenericContainer startContainerWithCommand(String shellCommand, WaitStrategy waitStrategy) { return startContainerWithCommand(shellCommand, waitStrategy, 8080); } - protected GenericContainer startContainerWithCommand(String shellCommand, WaitStrategy waitStrategy, Integer... ports) { + protected GenericContainer startContainerWithCommand(String shellCommand, WaitStrategy waitStrategy, Integer... ports) { // apply WaitStrategy to container - return new GenericContainer(new DockerImageName(IMAGE_NAME)) + return new GenericContainer<>(TestImages.ALPINE_IMAGE) .withExposedPorts(ports) .withCommand("sh", "-c", shellCommand) .waitingFor(waitStrategy.withStartupTimeout(Duration.ofMillis(WAIT_TIMEOUT_MILLIS))); @@ -99,7 +98,7 @@ protected void waitUntilReadyAndTimeout(String shellCommand) { * * @param container the container to start */ - protected void waitUntilReadyAndTimeout(GenericContainer container) { + protected void waitUntilReadyAndTimeout(GenericContainer container) { // start() blocks until successful or timeout VisibleAssertions.assertThrows("an exception is thrown when timeout occurs (" + WAIT_TIMEOUT_MILLIS + "ms)", ContainerLaunchException.class, @@ -112,7 +111,7 @@ protected void waitUntilReadyAndTimeout(GenericContainer container) { * * @param container the container to start */ - protected void waitUntilReadyAndSucceed(GenericContainer container) { + protected void waitUntilReadyAndSucceed(GenericContainer container) { // start() blocks until successful or timeout container.start(); diff --git a/core/src/test/java/org/testcontainers/junit/wait/strategy/HostPortWaitStrategyTest.java b/core/src/test/java/org/testcontainers/junit/wait/strategy/HostPortWaitStrategyTest.java index 48d574f57fc..5c7d37a7da3 100644 --- a/core/src/test/java/org/testcontainers/junit/wait/strategy/HostPortWaitStrategyTest.java +++ b/core/src/test/java/org/testcontainers/junit/wait/strategy/HostPortWaitStrategyTest.java @@ -2,9 +2,9 @@ import org.junit.ClassRule; import org.junit.Test; +import org.testcontainers.TestImages; import org.testcontainers.containers.GenericContainer; import org.testcontainers.containers.wait.strategy.Wait; -import org.testcontainers.utility.DockerImageName; import java.time.Duration; @@ -16,10 +16,8 @@ */ public class HostPortWaitStrategyTest { - private static final String IMAGE_NAME = "alpine:3.7"; - @ClassRule - public static GenericContainer container = new GenericContainer(new DockerImageName(IMAGE_NAME)).withExposedPorts() + public static GenericContainer container = new GenericContainer<>(TestImages.ALPINE_IMAGE).withExposedPorts() .withCommand("sh", "-c", "while true; do nc -lp 8080; done") .withExposedPorts(8080) .waitingFor(Wait.forListeningPort().withStartupTimeout(Duration.ofSeconds(10))); diff --git a/core/src/test/java/org/testcontainers/utility/AuthenticatedImagePullTest.java b/core/src/test/java/org/testcontainers/utility/AuthenticatedImagePullTest.java index ad1fbc50732..b33499c0e06 100644 --- a/core/src/test/java/org/testcontainers/utility/AuthenticatedImagePullTest.java +++ b/core/src/test/java/org/testcontainers/utility/AuthenticatedImagePullTest.java @@ -99,7 +99,7 @@ public static void tearDown() { @Test public void testThatAuthLocatorIsUsedForContainerCreation() { // actually start a container, which will require an authenticated pull - try (final GenericContainer container = new GenericContainer(new DockerImageName(testImageNameWithTag)) + try (final GenericContainer container = new GenericContainer<>(new DockerImageName(testImageNameWithTag)) .withCommand("/bin/sh", "-c", "sleep 10")) { container.start(); diff --git a/examples/mongodb-container/src/test/java/org/testcontainers/containers/MongoDbContainer.java b/examples/mongodb-container/src/test/java/org/testcontainers/containers/MongoDbContainer.java index 00fd9c05b52..ee272f7c963 100644 --- a/examples/mongodb-container/src/test/java/org/testcontainers/containers/MongoDbContainer.java +++ b/examples/mongodb-container/src/test/java/org/testcontainers/containers/MongoDbContainer.java @@ -1,6 +1,7 @@ package org.testcontainers.containers; import org.jetbrains.annotations.NotNull; +import org.testcontainers.utility.DockerImageName; /** @@ -25,6 +26,7 @@ public class MongoDbContainer extends GenericContainer { /** * Creates a new {@link MongoDbContainer} with the {@value DEFAULT_IMAGE_AND_TAG} image. */ + @Deprecated public MongoDbContainer() { this(DEFAULT_IMAGE_AND_TAG); } @@ -34,8 +36,13 @@ public MongoDbContainer() { * * @param image the image (e.g. {@value DEFAULT_IMAGE_AND_TAG}) to use */ + @Deprecated public MongoDbContainer(@NotNull String image) { - super(image); + this(new DockerImageName(image)); + } + + public MongoDbContainer(final DockerImageName dockerImageName) { + super(dockerImageName); addExposedPort(MONGODB_PORT); } diff --git a/examples/mongodb-container/src/test/java/org/testcontainers/containers/MongoDbContainerTest.java b/examples/mongodb-container/src/test/java/org/testcontainers/containers/MongoDbContainerTest.java index 96096d51c1a..ec4f6cb5bcc 100644 --- a/examples/mongodb-container/src/test/java/org/testcontainers/containers/MongoDbContainerTest.java +++ b/examples/mongodb-container/src/test/java/org/testcontainers/containers/MongoDbContainerTest.java @@ -1,16 +1,17 @@ package org.testcontainers.containers; +import org.junit.Test; +import org.testcontainers.utility.DockerImageName; + import java.io.IOException; import java.net.Socket; -import org.junit.Test; - public class MongoDbContainerTest { @Test public void containerStartsAndPublicPortIsAvailable() { - try (MongoDbContainer container = new MongoDbContainer()) { + try (MongoDbContainer container = new MongoDbContainer(new DockerImageName("mongo:4.0"))) { container.start(); assertThatPortIsAvailable(container); } diff --git a/examples/solr-container/src/test/java/com/example/SolrQueryTest.java b/examples/solr-container/src/test/java/com/example/SolrQueryTest.java index 413d7937853..afdfa2be0f4 100644 --- a/examples/solr-container/src/test/java/com/example/SolrQueryTest.java +++ b/examples/solr-container/src/test/java/com/example/SolrQueryTest.java @@ -1,13 +1,5 @@ package com.example; -import static com.example.SolrSearchEngine.COLLECTION_NAME; -import static org.rnorth.visibleassertions.VisibleAssertions.assertEquals; - -import java.io.IOException; -import java.util.Collections; -import java.util.HashMap; -import java.util.Map; - import org.apache.solr.client.solrj.SolrClient; import org.apache.solr.client.solrj.SolrServerException; import org.apache.solr.client.solrj.impl.Http2SolrClient; @@ -16,10 +8,21 @@ import org.junit.BeforeClass; import org.junit.Test; import org.testcontainers.containers.SolrContainer; +import org.testcontainers.utility.DockerImageName; + +import java.io.IOException; +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; + +import static com.example.SolrSearchEngine.COLLECTION_NAME; +import static org.rnorth.visibleassertions.VisibleAssertions.assertEquals; public class SolrQueryTest { - public static final SolrContainer solrContainer = new SolrContainer() + private static final DockerImageName SOLR_IMAGE = new DockerImageName("solr:8.3.0"); + + public static final SolrContainer solrContainer = new SolrContainer(SOLR_IMAGE) .withCollection(COLLECTION_NAME); private static SolrClient solrClient; diff --git a/modules/clickhouse/src/test/java/org/testcontainers/ClickhouseTestImages.java b/modules/clickhouse/src/test/java/org/testcontainers/ClickhouseTestImages.java new file mode 100644 index 00000000000..b1662f41edd --- /dev/null +++ b/modules/clickhouse/src/test/java/org/testcontainers/ClickhouseTestImages.java @@ -0,0 +1,7 @@ +package org.testcontainers; + +import org.testcontainers.utility.DockerImageName; + +public interface ClickhouseTestImages { + DockerImageName CLICKHOUSE_IMAGE = new DockerImageName("yandex/clickhouse-server:18.10.3"); +} diff --git a/modules/clickhouse/src/test/java/org/testcontainers/junit/clickhouse/SimpleClickhouseTest.java b/modules/clickhouse/src/test/java/org/testcontainers/junit/clickhouse/SimpleClickhouseTest.java index 2dbce0b3593..8f3879673a0 100644 --- a/modules/clickhouse/src/test/java/org/testcontainers/junit/clickhouse/SimpleClickhouseTest.java +++ b/modules/clickhouse/src/test/java/org/testcontainers/junit/clickhouse/SimpleClickhouseTest.java @@ -8,12 +8,13 @@ import java.sql.SQLException; import static org.rnorth.visibleassertions.VisibleAssertions.assertEquals; +import static org.testcontainers.ClickhouseTestImages.CLICKHOUSE_IMAGE; public class SimpleClickhouseTest extends AbstractContainerDatabaseTest { @Test public void testSimple() throws SQLException { - try (ClickHouseContainer clickhouse = new ClickHouseContainer()) { + try (ClickHouseContainer clickhouse = new ClickHouseContainer(CLICKHOUSE_IMAGE)) { clickhouse.start(); ResultSet resultSet = performQuery(clickhouse, "SELECT 1"); diff --git a/modules/cockroachdb/src/test/java/org/testcontainers/CockroachDBTestImages.java b/modules/cockroachdb/src/test/java/org/testcontainers/CockroachDBTestImages.java new file mode 100644 index 00000000000..0d6084e1a69 --- /dev/null +++ b/modules/cockroachdb/src/test/java/org/testcontainers/CockroachDBTestImages.java @@ -0,0 +1,7 @@ +package org.testcontainers; + +import org.testcontainers.utility.DockerImageName; + +public interface CockroachDBTestImages { + DockerImageName COCKROACHDB_IMAGE = new DockerImageName("cockroachdb/cockroach:v19.1.1"); +} diff --git a/modules/cockroachdb/src/test/java/org/testcontainers/junit/cockroachdb/SimpleCockroachDBTest.java b/modules/cockroachdb/src/test/java/org/testcontainers/junit/cockroachdb/SimpleCockroachDBTest.java index 14fe20222a3..3121ad82100 100644 --- a/modules/cockroachdb/src/test/java/org/testcontainers/junit/cockroachdb/SimpleCockroachDBTest.java +++ b/modules/cockroachdb/src/test/java/org/testcontainers/junit/cockroachdb/SimpleCockroachDBTest.java @@ -12,6 +12,7 @@ import static org.hamcrest.CoreMatchers.containsString; import static org.junit.Assert.assertThat; import static org.rnorth.visibleassertions.VisibleAssertions.assertEquals; +import static org.testcontainers.CockroachDBTestImages.COCKROACHDB_IMAGE; public class SimpleCockroachDBTest extends AbstractContainerDatabaseTest { @@ -22,7 +23,7 @@ public class SimpleCockroachDBTest extends AbstractContainerDatabaseTest { @Test public void testSimple() throws SQLException { - try (CockroachContainer cockroach = new CockroachContainer()) { + try (CockroachContainer cockroach = new CockroachContainer(COCKROACHDB_IMAGE)) { cockroach.start(); ResultSet resultSet = performQuery(cockroach, "SELECT 1"); @@ -34,7 +35,7 @@ public void testSimple() throws SQLException { @Test public void testExplicitInitScript() throws SQLException { - try (CockroachContainer cockroach = new CockroachContainer() + try (CockroachContainer cockroach = new CockroachContainer(COCKROACHDB_IMAGE) .withInitScript("somepath/init_postgresql.sql")) { // CockroachDB is expected to be compatible with Postgres cockroach.start(); @@ -47,7 +48,7 @@ public void testExplicitInitScript() throws SQLException { @Test public void testWithAdditionalUrlParamInJdbcUrl() { - CockroachContainer cockroach = new CockroachContainer() + CockroachContainer cockroach = new CockroachContainer(COCKROACHDB_IMAGE) .withUrlParam("sslmode", "disable") .withUrlParam("application_name", "cockroach"); diff --git a/modules/db2/src/test/java/org/testcontainers/Db2TestImages.java b/modules/db2/src/test/java/org/testcontainers/Db2TestImages.java new file mode 100644 index 00000000000..4aedcc2a7c8 --- /dev/null +++ b/modules/db2/src/test/java/org/testcontainers/Db2TestImages.java @@ -0,0 +1,7 @@ +package org.testcontainers; + +import org.testcontainers.utility.DockerImageName; + +public interface Db2TestImages { + DockerImageName DB2_IMAGE = new DockerImageName("ibmcom/db2:11.5.0.0a"); +} diff --git a/modules/db2/src/test/java/org/testcontainers/junit/db2/SimpleDb2Test.java b/modules/db2/src/test/java/org/testcontainers/junit/db2/SimpleDb2Test.java index 6cc7535f785..b7a1d5478e8 100644 --- a/modules/db2/src/test/java/org/testcontainers/junit/db2/SimpleDb2Test.java +++ b/modules/db2/src/test/java/org/testcontainers/junit/db2/SimpleDb2Test.java @@ -10,12 +10,13 @@ import static org.hamcrest.CoreMatchers.containsString; import static org.junit.Assert.assertThat; import static org.rnorth.visibleassertions.VisibleAssertions.assertEquals; +import static org.testcontainers.Db2TestImages.DB2_IMAGE; public class SimpleDb2Test extends AbstractContainerDatabaseTest { @Test public void testSimple() throws SQLException { - try (Db2Container db2 = new Db2Container() + try (Db2Container db2 = new Db2Container(DB2_IMAGE) .acceptLicense()) { db2.start(); @@ -29,7 +30,7 @@ public void testSimple() throws SQLException { @Test public void testWithAdditionalUrlParamInJdbcUrl() { - try (Db2Container db2 = new Db2Container() + try (Db2Container db2 = new Db2Container(DB2_IMAGE) .withUrlParam("sslConnection", "false") .acceptLicense()) { diff --git a/modules/elasticsearch/src/test/java/org/testcontainers/elasticsearch/ElasticsearchContainerTest.java b/modules/elasticsearch/src/test/java/org/testcontainers/elasticsearch/ElasticsearchContainerTest.java index 358f98479ec..9b4dced1fbb 100644 --- a/modules/elasticsearch/src/test/java/org/testcontainers/elasticsearch/ElasticsearchContainerTest.java +++ b/modules/elasticsearch/src/test/java/org/testcontainers/elasticsearch/ElasticsearchContainerTest.java @@ -106,6 +106,7 @@ public void elasticsearchOssImage() throws IOException { } } + @SuppressWarnings("deprecation") // Using deprecated constructor for verification of backwards compatibility @Test public void restClientClusterHealth() throws IOException { // httpClientContainer { diff --git a/modules/influxdb/src/test/java/org/testcontainers/containers/InfluxDBContainerTest.java b/modules/influxdb/src/test/java/org/testcontainers/containers/InfluxDBContainerTest.java index fa2e54fd0c9..7acf030b5e4 100644 --- a/modules/influxdb/src/test/java/org/testcontainers/containers/InfluxDBContainerTest.java +++ b/modules/influxdb/src/test/java/org/testcontainers/containers/InfluxDBContainerTest.java @@ -11,7 +11,7 @@ public class InfluxDBContainerTest { @ClassRule - public static InfluxDBContainer influxDBContainer = new InfluxDBContainer(); + public static InfluxDBContainer influxDBContainer = new InfluxDBContainer<>(InfluxDBTestImages.INFLUXDB_TEST_IMAGE); @Test public void getUrl() { diff --git a/modules/influxdb/src/test/java/org/testcontainers/containers/InfluxDBContainerWithUserTest.java b/modules/influxdb/src/test/java/org/testcontainers/containers/InfluxDBContainerWithUserTest.java index 81ad62a7b47..b045ca297c1 100644 --- a/modules/influxdb/src/test/java/org/testcontainers/containers/InfluxDBContainerWithUserTest.java +++ b/modules/influxdb/src/test/java/org/testcontainers/containers/InfluxDBContainerWithUserTest.java @@ -17,13 +17,13 @@ public class InfluxDBContainerWithUserTest { - private static final String TEST_VERSION = "1.4.3"; + private static final String TEST_VERSION = InfluxDBTestImages.INFLUXDB_TEST_IMAGE.getVersionPart(); private static final String DATABASE = "test"; private static final String USER = "test-user"; private static final String PASSWORD = "test-password"; @Rule - public InfluxDBContainer influxDBContainer = new InfluxDBContainer(TEST_VERSION) + public InfluxDBContainer influxDBContainer = new InfluxDBContainer<>(InfluxDBTestImages.INFLUXDB_TEST_IMAGE) .withDatabase(DATABASE) .withUsername(USER) .withPassword(PASSWORD); diff --git a/modules/influxdb/src/test/java/org/testcontainers/containers/InfluxDBTestImages.java b/modules/influxdb/src/test/java/org/testcontainers/containers/InfluxDBTestImages.java new file mode 100644 index 00000000000..8b0252cb60c --- /dev/null +++ b/modules/influxdb/src/test/java/org/testcontainers/containers/InfluxDBTestImages.java @@ -0,0 +1,7 @@ +package org.testcontainers.containers; + +import org.testcontainers.utility.DockerImageName; + +public interface InfluxDBTestImages { + DockerImageName INFLUXDB_TEST_IMAGE = new DockerImageName("influxdb:1.4.3"); +} diff --git a/modules/junit-jupiter/src/test/java/org/testcontainers/junit/jupiter/JUnitJupiterTestImages.java b/modules/junit-jupiter/src/test/java/org/testcontainers/junit/jupiter/JUnitJupiterTestImages.java new file mode 100644 index 00000000000..f3be0fa0ed9 --- /dev/null +++ b/modules/junit-jupiter/src/test/java/org/testcontainers/junit/jupiter/JUnitJupiterTestImages.java @@ -0,0 +1,8 @@ +package org.testcontainers.junit.jupiter; + +import org.testcontainers.utility.DockerImageName; + +public interface JUnitJupiterTestImages { + DockerImageName POSTGRES_IMAGE = new DockerImageName("postgres:9.6.12"); + DockerImageName HTTPD_IMAGE = new DockerImageName("httpd:2.4-alpine"); +} diff --git a/modules/junit-jupiter/src/test/java/org/testcontainers/junit/jupiter/PostgresContainerTests.java b/modules/junit-jupiter/src/test/java/org/testcontainers/junit/jupiter/PostgresContainerTests.java index 765a9f6ff6b..4cbc331e64b 100644 --- a/modules/junit-jupiter/src/test/java/org/testcontainers/junit/jupiter/PostgresContainerTests.java +++ b/modules/junit-jupiter/src/test/java/org/testcontainers/junit/jupiter/PostgresContainerTests.java @@ -9,12 +9,13 @@ import java.sql.Statement; import static org.junit.Assert.assertEquals; +import static org.testcontainers.junit.jupiter.JUnitJupiterTestImages.POSTGRES_IMAGE; @Testcontainers class PostgresContainerTests { @Container - private static final PostgreSQLContainer POSTGRE_SQL_CONTAINER = new PostgreSQLContainer() + private static final PostgreSQLContainer POSTGRE_SQL_CONTAINER = new PostgreSQLContainer<>(POSTGRES_IMAGE) .withDatabaseName("foo") .withUsername("foo") .withPassword("secret"); diff --git a/modules/junit-jupiter/src/test/java/org/testcontainers/junit/jupiter/TestcontainersNestedRestartedContainerTests.java b/modules/junit-jupiter/src/test/java/org/testcontainers/junit/jupiter/TestcontainersNestedRestartedContainerTests.java index ac3a0e867c6..27a19f86d8b 100644 --- a/modules/junit-jupiter/src/test/java/org/testcontainers/junit/jupiter/TestcontainersNestedRestartedContainerTests.java +++ b/modules/junit-jupiter/src/test/java/org/testcontainers/junit/jupiter/TestcontainersNestedRestartedContainerTests.java @@ -3,16 +3,16 @@ import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; import org.testcontainers.containers.GenericContainer; -import org.testcontainers.utility.DockerImageName; import static org.junit.jupiter.api.Assertions.assertNotEquals; import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.testcontainers.junit.jupiter.JUnitJupiterTestImages.HTTPD_IMAGE; @Testcontainers class TestcontainersNestedRestartedContainerTests { @Container - private final GenericContainer topLevelContainer = new GenericContainer(new DockerImageName("httpd:2.4-alpine")) + private final GenericContainer topLevelContainer = new GenericContainer<>(HTTPD_IMAGE) .withExposedPorts(80); private static String topLevelContainerId; @@ -29,7 +29,7 @@ void top_level_container_should_be_running() { class NestedTestCase { @Container - private final GenericContainer nestedContainer = new GenericContainer(new DockerImageName("httpd:2.4-alpine")) + private final GenericContainer nestedContainer = new GenericContainer<>(HTTPD_IMAGE) .withExposedPorts(80); @Test diff --git a/modules/junit-jupiter/src/test/java/org/testcontainers/junit/jupiter/TestcontainersNestedSharedContainerTests.java b/modules/junit-jupiter/src/test/java/org/testcontainers/junit/jupiter/TestcontainersNestedSharedContainerTests.java index 0ee7b81f4b3..cf59e0338a2 100644 --- a/modules/junit-jupiter/src/test/java/org/testcontainers/junit/jupiter/TestcontainersNestedSharedContainerTests.java +++ b/modules/junit-jupiter/src/test/java/org/testcontainers/junit/jupiter/TestcontainersNestedSharedContainerTests.java @@ -3,16 +3,16 @@ import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; import org.testcontainers.containers.GenericContainer; -import org.testcontainers.utility.DockerImageName; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.testcontainers.junit.jupiter.JUnitJupiterTestImages.HTTPD_IMAGE; @Testcontainers class TestcontainersNestedSharedContainerTests { @Container - private static final GenericContainer TOP_LEVEL_CONTAINER = new GenericContainer(new DockerImageName("httpd:2.4-alpine")) + private static final GenericContainer TOP_LEVEL_CONTAINER = new GenericContainer<>(HTTPD_IMAGE) .withExposedPorts(80); private static String topLevelContainerId; diff --git a/modules/junit-jupiter/src/test/java/org/testcontainers/junit/jupiter/TestcontainersRestartBetweenTests.java b/modules/junit-jupiter/src/test/java/org/testcontainers/junit/jupiter/TestcontainersRestartBetweenTests.java index ca26785b02d..eeb63b72380 100644 --- a/modules/junit-jupiter/src/test/java/org/testcontainers/junit/jupiter/TestcontainersRestartBetweenTests.java +++ b/modules/junit-jupiter/src/test/java/org/testcontainers/junit/jupiter/TestcontainersRestartBetweenTests.java @@ -2,15 +2,15 @@ import org.junit.jupiter.api.Test; import org.testcontainers.containers.GenericContainer; -import org.testcontainers.utility.DockerImageName; import static org.junit.jupiter.api.Assertions.assertNotEquals; +import static org.testcontainers.junit.jupiter.JUnitJupiterTestImages.HTTPD_IMAGE; @Testcontainers class TestcontainersRestartBetweenTests { @Container - private GenericContainer genericContainer = new GenericContainer(new DockerImageName("httpd:2.4-alpine")) + private GenericContainer genericContainer = new GenericContainer<>(HTTPD_IMAGE) .withExposedPorts(80); private static String lastContainerId; diff --git a/modules/junit-jupiter/src/test/java/org/testcontainers/junit/jupiter/TestcontainersSharedContainerTests.java b/modules/junit-jupiter/src/test/java/org/testcontainers/junit/jupiter/TestcontainersSharedContainerTests.java index efc7177f80e..60094994f69 100644 --- a/modules/junit-jupiter/src/test/java/org/testcontainers/junit/jupiter/TestcontainersSharedContainerTests.java +++ b/modules/junit-jupiter/src/test/java/org/testcontainers/junit/jupiter/TestcontainersSharedContainerTests.java @@ -3,16 +3,16 @@ import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; import org.testcontainers.containers.GenericContainer; -import org.testcontainers.utility.DockerImageName; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.testcontainers.junit.jupiter.JUnitJupiterTestImages.HTTPD_IMAGE; @Testcontainers class TestcontainersSharedContainerTests { @Container - private static final GenericContainer GENERIC_CONTAINER = new GenericContainer(new DockerImageName("httpd:2.4-alpine")) + private static final GenericContainer GENERIC_CONTAINER = new GenericContainer<>(HTTPD_IMAGE) .withExposedPorts(80); private static String lastContainerId; diff --git a/modules/kafka/src/test/java/org/testcontainers/containers/KafkaContainerTest.java b/modules/kafka/src/test/java/org/testcontainers/containers/KafkaContainerTest.java index 30ed783d0b4..0642ddeb353 100644 --- a/modules/kafka/src/test/java/org/testcontainers/containers/KafkaContainerTest.java +++ b/modules/kafka/src/test/java/org/testcontainers/containers/KafkaContainerTest.java @@ -12,7 +12,6 @@ import org.apache.kafka.common.serialization.StringSerializer; import org.junit.Test; import org.rnorth.ducttape.unreliables.Unreliables; -import org.testcontainers.utility.DockerImageName; import java.time.Duration; import java.util.Arrays; @@ -26,7 +25,7 @@ public class KafkaContainerTest { @Test public void testUsage() throws Exception { - try (KafkaContainer kafka = new KafkaContainer()) { + try (KafkaContainer kafka = new KafkaContainer(KafkaTestImages.KAFKA_TEST_IMAGE)) { kafka.start(); testKafkaFunctionality(kafka.getBootstrapServers()); } @@ -42,7 +41,7 @@ public void testExternalZookeeperWithKafkaNetwork() throws Exception { KafkaContainer kafka = new KafkaContainer() .withExternalZookeeper("zookeeper:2181"); - GenericContainer zookeeper = new GenericContainer(new DockerImageName("confluentinc/cp-zookeeper:4.0.0")) + GenericContainer zookeeper = new GenericContainer<>(KafkaTestImages.ZOOKEEPER_TEST_IMAGE) .withNetwork(kafka.getNetwork()) .withNetworkAliases("zookeeper") .withEnv("ZOOKEEPER_CLIENT_PORT", "2181"); @@ -59,11 +58,11 @@ public void testExternalZookeeperWithExternalNetwork() throws Exception { try ( Network network = Network.newNetwork(); - KafkaContainer kafka = new KafkaContainer() + KafkaContainer kafka = new KafkaContainer(KafkaTestImages.KAFKA_TEST_IMAGE) .withNetwork(network) .withExternalZookeeper("zookeeper:2181"); - GenericContainer zookeeper = new GenericContainer(new DockerImageName("confluentinc/cp-zookeeper:4.0.0")) + GenericContainer zookeeper = new GenericContainer<>(KafkaTestImages.ZOOKEEPER_TEST_IMAGE) .withNetwork(network) .withNetworkAliases("zookeeper") .withEnv("ZOOKEEPER_CLIENT_PORT", "2181"); diff --git a/modules/kafka/src/test/java/org/testcontainers/containers/KafkaTestImages.java b/modules/kafka/src/test/java/org/testcontainers/containers/KafkaTestImages.java new file mode 100644 index 00000000000..c50bdc409ea --- /dev/null +++ b/modules/kafka/src/test/java/org/testcontainers/containers/KafkaTestImages.java @@ -0,0 +1,8 @@ +package org.testcontainers.containers; + +import org.testcontainers.utility.DockerImageName; + +public interface KafkaTestImages { + DockerImageName KAFKA_TEST_IMAGE = new DockerImageName("confluentinc/cp-kafka:5.2.1"); + DockerImageName ZOOKEEPER_TEST_IMAGE = new DockerImageName("confluentinc/cp-zookeeper:4.0.0"); +} diff --git a/modules/localstack/src/test/java/org/testcontainers/containers/localstack/LocalstackContainerTest.java b/modules/localstack/src/test/java/org/testcontainers/containers/localstack/LocalstackContainerTest.java index 725e9537db9..595db1e98c7 100644 --- a/modules/localstack/src/test/java/org/testcontainers/containers/localstack/LocalstackContainerTest.java +++ b/modules/localstack/src/test/java/org/testcontainers/containers/localstack/LocalstackContainerTest.java @@ -29,7 +29,6 @@ import org.testcontainers.containers.Container; import org.testcontainers.containers.GenericContainer; import org.testcontainers.containers.Network; -import org.testcontainers.utility.DockerImageName; import software.amazon.awssdk.auth.credentials.AwsBasicCredentials; import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider; import software.amazon.awssdk.regions.Region; @@ -44,7 +43,10 @@ import static org.rnorth.visibleassertions.VisibleAssertions.assertEquals; import static org.rnorth.visibleassertions.VisibleAssertions.assertThat; import static org.rnorth.visibleassertions.VisibleAssertions.assertTrue; -import static org.testcontainers.containers.localstack.LocalStackContainer.Service.*; +import static org.testcontainers.containers.localstack.LocalStackContainer.Service.CLOUDWATCHLOGS; +import static org.testcontainers.containers.localstack.LocalStackContainer.Service.KMS; +import static org.testcontainers.containers.localstack.LocalStackContainer.Service.S3; +import static org.testcontainers.containers.localstack.LocalStackContainer.Service.SQS; /** * Tests for Localstack Container, used both in bridge network (exposed to host) and docker network modes. @@ -61,7 +63,7 @@ public static class WithoutNetwork { // without_network { @ClassRule - public static LocalStackContainer localstack = new LocalStackContainer() + public static LocalStackContainer localstack = new LocalStackContainer(LocalstackTestImages.LOCALSTACK_IMAGE) .withServices(S3, SQS, CLOUDWATCHLOGS, KMS); // } @@ -161,14 +163,14 @@ public static class WithNetwork { private static Network network = Network.newNetwork(); @ClassRule - public static LocalStackContainer localstackInDockerNetwork = new LocalStackContainer() + public static LocalStackContainer localstackInDockerNetwork = new LocalStackContainer(LocalstackTestImages.LOCALSTACK_IMAGE) .withNetwork(network) .withNetworkAliases("notthis", "localstack") // the last alias is used for HOSTNAME_EXTERNAL .withServices(S3, SQS, CLOUDWATCHLOGS); // } @ClassRule - public static GenericContainer awsCliInDockerNetwork = new GenericContainer<>(new DockerImageName("atlassian/pipelines-awscli")) + public static GenericContainer awsCliInDockerNetwork = new GenericContainer<>(LocalstackTestImages.AWS_CLI_IMAGE) .withNetwork(network) .withCreateContainerCmdModifier(cmd -> cmd.withEntrypoint("top")) .withEnv("AWS_ACCESS_KEY_ID", "accesskey") diff --git a/modules/localstack/src/test/java/org/testcontainers/containers/localstack/LocalstackTestImages.java b/modules/localstack/src/test/java/org/testcontainers/containers/localstack/LocalstackTestImages.java new file mode 100644 index 00000000000..d6e513c7bb8 --- /dev/null +++ b/modules/localstack/src/test/java/org/testcontainers/containers/localstack/LocalstackTestImages.java @@ -0,0 +1,8 @@ +package org.testcontainers.containers.localstack; + +import org.testcontainers.utility.DockerImageName; + +public interface LocalstackTestImages { + DockerImageName LOCALSTACK_IMAGE = new DockerImageName("localstack/localstack:0.10.8"); + DockerImageName AWS_CLI_IMAGE = new DockerImageName("atlassian/pipelines-awscli:1.16.302"); +} diff --git a/modules/mariadb/src/test/java/org/testcontainers/MariaDBTestImages.java b/modules/mariadb/src/test/java/org/testcontainers/MariaDBTestImages.java new file mode 100644 index 00000000000..4a6c8a6f43c --- /dev/null +++ b/modules/mariadb/src/test/java/org/testcontainers/MariaDBTestImages.java @@ -0,0 +1,7 @@ +package org.testcontainers; + +import org.testcontainers.utility.DockerImageName; + +public interface MariaDBTestImages { + DockerImageName MARIADB_IMAGE = new DockerImageName("mariadb:10.3.6"); +} diff --git a/modules/mariadb/src/test/java/org/testcontainers/containers/MariaDBR2DBCDatabaseContainerTest.java b/modules/mariadb/src/test/java/org/testcontainers/containers/MariaDBR2DBCDatabaseContainerTest.java index ebb63edaa52..ccbb43afaa8 100644 --- a/modules/mariadb/src/test/java/org/testcontainers/containers/MariaDBR2DBCDatabaseContainerTest.java +++ b/modules/mariadb/src/test/java/org/testcontainers/containers/MariaDBR2DBCDatabaseContainerTest.java @@ -18,7 +18,7 @@ protected String createR2DBCUrl() { @Override protected MariaDBContainer createContainer() { - return new MariaDBContainer<>(new DockerImageName(MariaDBContainer.IMAGE, MariaDBContainer.DEFAULT_TAG)); + return new MariaDBContainer<>(new DockerImageName("mariadb:10.3.6")); } } diff --git a/modules/mariadb/src/test/java/org/testcontainers/junit/mariadb/SimpleMariaDBTest.java b/modules/mariadb/src/test/java/org/testcontainers/junit/mariadb/SimpleMariaDBTest.java index af503ce424b..ec24937f079 100644 --- a/modules/mariadb/src/test/java/org/testcontainers/junit/mariadb/SimpleMariaDBTest.java +++ b/modules/mariadb/src/test/java/org/testcontainers/junit/mariadb/SimpleMariaDBTest.java @@ -4,6 +4,7 @@ import org.junit.Test; import org.testcontainers.containers.MariaDBContainer; import org.testcontainers.db.AbstractContainerDatabaseTest; +import org.testcontainers.utility.DockerImageName; import java.sql.ResultSet; import java.sql.SQLException; @@ -13,13 +14,14 @@ import static org.junit.Assume.assumeFalse; import static org.rnorth.visibleassertions.VisibleAssertions.assertEquals; import static org.rnorth.visibleassertions.VisibleAssertions.assertTrue; +import static org.testcontainers.MariaDBTestImages.MARIADB_IMAGE; public class SimpleMariaDBTest extends AbstractContainerDatabaseTest { @Test public void testSimple() throws SQLException { - try (MariaDBContainer mariadb = new MariaDBContainer<>()) { + try (MariaDBContainer mariadb = new MariaDBContainer<>(MARIADB_IMAGE)) { mariadb.start(); @@ -32,7 +34,7 @@ public void testSimple() throws SQLException { @Test public void testSpecificVersion() throws SQLException { - try (MariaDBContainer mariadbOldVersion = new MariaDBContainer<>("mariadb:5.5.51")) { + try (MariaDBContainer mariadbOldVersion = new MariaDBContainer<>(new DockerImageName("mariadb:5.5.51"))) { mariadbOldVersion.start(); @@ -47,7 +49,7 @@ public void testSpecificVersion() throws SQLException { public void testMariaDBWithCustomIniFile() throws SQLException { assumeFalse(SystemUtils.IS_OS_WINDOWS); - try (MariaDBContainer mariadbCustomConfig = new MariaDBContainer<>("mariadb:10.1.16") + try (MariaDBContainer mariadbCustomConfig = new MariaDBContainer<>(MARIADB_IMAGE) .withConfigurationOverride("somepath/mariadb_conf_override")) { mariadbCustomConfig.start(); @@ -61,7 +63,7 @@ public void testMariaDBWithCustomIniFile() throws SQLException { @Test public void testMariaDBWithCommandOverride() throws SQLException { - try (MariaDBContainer mariadbCustomConfig = new MariaDBContainer<>("mariadb:10.1.16") + try (MariaDBContainer mariadbCustomConfig = new MariaDBContainer<>(MARIADB_IMAGE) .withCommand("mysqld --auto_increment_increment=10")) { mariadbCustomConfig.start(); ResultSet resultSet = performQuery(mariadbCustomConfig, "show variables like 'auto_increment_increment'"); @@ -73,7 +75,7 @@ public void testMariaDBWithCommandOverride() throws SQLException { @Test public void testWithAdditionalUrlParamInJdbcUrl() { - MariaDBContainer mariaDBContainer = (MariaDBContainer) new MariaDBContainer() + MariaDBContainer mariaDBContainer = new MariaDBContainer<>(MARIADB_IMAGE) .withUrlParam("connectTimeout", "40000") .withUrlParam("rewriteBatchedStatements", "true"); diff --git a/modules/mongodb/src/test/java/org/testcontainers/containers/MongoDBContainerTest.java b/modules/mongodb/src/test/java/org/testcontainers/containers/MongoDBContainerTest.java index 7c4f4c12408..ae602563f3e 100644 --- a/modules/mongodb/src/test/java/org/testcontainers/containers/MongoDBContainerTest.java +++ b/modules/mongodb/src/test/java/org/testcontainers/containers/MongoDBContainerTest.java @@ -17,6 +17,7 @@ public class MongoDBContainerTest { + /** * Taken from https://docs.mongodb.com */ @@ -24,7 +25,7 @@ public class MongoDBContainerTest { public void shouldExecuteTransactions() { try ( // creatingMongoDBContainer { - final MongoDBContainer mongoDBContainer = new MongoDBContainer() + final MongoDBContainer mongoDBContainer = new MongoDBContainer(MongoTestImages.MONGO_IMAGE_NAME) // } ) { diff --git a/modules/mongodb/src/test/java/org/testcontainers/containers/MongoTestImages.java b/modules/mongodb/src/test/java/org/testcontainers/containers/MongoTestImages.java new file mode 100644 index 00000000000..2327b3200b6 --- /dev/null +++ b/modules/mongodb/src/test/java/org/testcontainers/containers/MongoTestImages.java @@ -0,0 +1,7 @@ +package org.testcontainers.containers; + +import org.testcontainers.utility.DockerImageName; + +public interface MongoTestImages { + DockerImageName MONGO_IMAGE_NAME = new DockerImageName("mongo:4.0.10"); +} diff --git a/modules/mssqlserver/src/test/java/org/testcontainers/MSSQLServerTestImages.java b/modules/mssqlserver/src/test/java/org/testcontainers/MSSQLServerTestImages.java new file mode 100644 index 00000000000..3fd1993519d --- /dev/null +++ b/modules/mssqlserver/src/test/java/org/testcontainers/MSSQLServerTestImages.java @@ -0,0 +1,7 @@ +package org.testcontainers; + +import org.testcontainers.utility.DockerImageName; + +public interface MSSQLServerTestImages { + DockerImageName MSSQL_SERVER_IMAGE = new DockerImageName("mcr.microsoft.com/mssql/server:2017-CU12"); +} diff --git a/modules/mssqlserver/src/test/java/org/testcontainers/containers/MSSQLR2DBCDatabaseContainerTest.java b/modules/mssqlserver/src/test/java/org/testcontainers/containers/MSSQLR2DBCDatabaseContainerTest.java index 97700a251be..8c0c9ab1c2b 100644 --- a/modules/mssqlserver/src/test/java/org/testcontainers/containers/MSSQLR2DBCDatabaseContainerTest.java +++ b/modules/mssqlserver/src/test/java/org/testcontainers/containers/MSSQLR2DBCDatabaseContainerTest.java @@ -1,8 +1,8 @@ package org.testcontainers.containers; import io.r2dbc.spi.ConnectionFactoryOptions; +import org.testcontainers.MSSQLServerTestImages; import org.testcontainers.r2dbc.AbstractR2DBCDatabaseContainerTest; -import org.testcontainers.utility.DockerImageName; public class MSSQLR2DBCDatabaseContainerTest extends AbstractR2DBCDatabaseContainerTest> { @@ -18,6 +18,6 @@ protected String createR2DBCUrl() { @Override protected MSSQLServerContainer createContainer() { - return new MSSQLServerContainer<>(new DockerImageName(MSSQLServerContainer.IMAGE, MSSQLServerContainer.DEFAULT_TAG)); + return new MSSQLServerContainer<>(MSSQLServerTestImages.MSSQL_SERVER_IMAGE); } } diff --git a/modules/mssqlserver/src/test/java/org/testcontainers/junit/mssqlserver/CustomPasswordMSSQLServerTest.java b/modules/mssqlserver/src/test/java/org/testcontainers/junit/mssqlserver/CustomPasswordMSSQLServerTest.java index 6d07e945b38..3df8ff0fa3d 100644 --- a/modules/mssqlserver/src/test/java/org/testcontainers/junit/mssqlserver/CustomPasswordMSSQLServerTest.java +++ b/modules/mssqlserver/src/test/java/org/testcontainers/junit/mssqlserver/CustomPasswordMSSQLServerTest.java @@ -4,8 +4,8 @@ import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; +import org.testcontainers.MSSQLServerTestImages; import org.testcontainers.containers.MSSQLServerContainer; -import org.testcontainers.utility.DockerImageName; import java.util.Arrays; import java.util.Collection; @@ -67,7 +67,7 @@ public static Collection data() { @Test public void runPasswordTests() { try { - new MSSQLServerContainer<>(new DockerImageName("mcr.microsoft.com/mssql/server:2017-CU12")).withPassword(this.password); + new MSSQLServerContainer<>(MSSQLServerTestImages.MSSQL_SERVER_IMAGE).withPassword(this.password); if (!valid) fail("Password " + this.password + " is not valid. Expected exception"); } catch (IllegalArgumentException e) { diff --git a/modules/mssqlserver/src/test/java/org/testcontainers/junit/mssqlserver/SimpleMSSQLServerTest.java b/modules/mssqlserver/src/test/java/org/testcontainers/junit/mssqlserver/SimpleMSSQLServerTest.java index 71e12a6d864..100b29b34f7 100644 --- a/modules/mssqlserver/src/test/java/org/testcontainers/junit/mssqlserver/SimpleMSSQLServerTest.java +++ b/modules/mssqlserver/src/test/java/org/testcontainers/junit/mssqlserver/SimpleMSSQLServerTest.java @@ -1,6 +1,7 @@ package org.testcontainers.junit.mssqlserver; import org.junit.Test; +import org.testcontainers.MSSQLServerTestImages; import org.testcontainers.containers.MSSQLServerContainer; import org.testcontainers.db.AbstractContainerDatabaseTest; @@ -12,12 +13,13 @@ import static org.hamcrest.CoreMatchers.containsString; import static org.junit.Assert.assertThat; import static org.rnorth.visibleassertions.VisibleAssertions.assertEquals; +import static org.testcontainers.MSSQLServerTestImages.MSSQL_SERVER_IMAGE; public class SimpleMSSQLServerTest extends AbstractContainerDatabaseTest { @Test public void testSimple() throws SQLException { - try (MSSQLServerContainer mssqlServer = new MSSQLServerContainer<>()) { + try (MSSQLServerContainer mssqlServer = new MSSQLServerContainer<>(MSSQL_SERVER_IMAGE)) { mssqlServer.start(); ResultSet resultSet = performQuery(mssqlServer, "SELECT 1"); @@ -28,7 +30,7 @@ public void testSimple() throws SQLException { @Test public void testWithAdditionalUrlParamInJdbcUrl() { - try (MSSQLServerContainer mssqlServer = new MSSQLServerContainer<>() + try (MSSQLServerContainer mssqlServer = new MSSQLServerContainer<>(MSSQL_SERVER_IMAGE) .withUrlParam("integratedSecurity", "false") .withUrlParam("applicationName", "MyApp")) { @@ -42,7 +44,7 @@ public void testWithAdditionalUrlParamInJdbcUrl() { @Test public void testSetupDatabase() throws SQLException { - try (MSSQLServerContainer mssqlServer = new MSSQLServerContainer<>()) { + try (MSSQLServerContainer mssqlServer = new MSSQLServerContainer<>(MSSQL_SERVER_IMAGE)) { mssqlServer.start(); DataSource ds = getDataSource(mssqlServer); Statement statement = ds.getConnection().createStatement(); diff --git a/modules/mysql/src/test/java/org/testcontainers/MySQLTestImages.java b/modules/mysql/src/test/java/org/testcontainers/MySQLTestImages.java new file mode 100644 index 00000000000..5c8889fffbd --- /dev/null +++ b/modules/mysql/src/test/java/org/testcontainers/MySQLTestImages.java @@ -0,0 +1,9 @@ +package org.testcontainers; + +import org.testcontainers.utility.DockerImageName; + +public class MySQLTestImages { + public static final DockerImageName MYSQL_IMAGE = new DockerImageName("mysql:5.7.22"); + public static final DockerImageName MYSQL_55_IMAGE = new DockerImageName("mysql:5.5"); + public static final DockerImageName MYSQL_56_IMAGE = new DockerImageName("mysql:5.6"); +} diff --git a/modules/mysql/src/test/java/org/testcontainers/containers/MySQLR2DBCDatabaseContainerTest.java b/modules/mysql/src/test/java/org/testcontainers/containers/MySQLR2DBCDatabaseContainerTest.java index d64b4ef5193..38abf637c3a 100644 --- a/modules/mysql/src/test/java/org/testcontainers/containers/MySQLR2DBCDatabaseContainerTest.java +++ b/modules/mysql/src/test/java/org/testcontainers/containers/MySQLR2DBCDatabaseContainerTest.java @@ -1,8 +1,8 @@ package org.testcontainers.containers; import io.r2dbc.spi.ConnectionFactoryOptions; +import org.testcontainers.MySQLTestImages; import org.testcontainers.r2dbc.AbstractR2DBCDatabaseContainerTest; -import org.testcontainers.utility.DockerImageName; public class MySQLR2DBCDatabaseContainerTest extends AbstractR2DBCDatabaseContainerTest> { @@ -18,7 +18,7 @@ protected String createR2DBCUrl() { @Override protected MySQLContainer createContainer() { - return new MySQLContainer<>(new DockerImageName(MySQLContainer.IMAGE, MySQLContainer.DEFAULT_TAG)); + return new MySQLContainer<>(MySQLTestImages.MYSQL_IMAGE); } } diff --git a/modules/mysql/src/test/java/org/testcontainers/junit/mysql/CustomizableMysqlTest.java b/modules/mysql/src/test/java/org/testcontainers/junit/mysql/CustomizableMysqlTest.java index 685b2a7e5e9..708b2b987cd 100644 --- a/modules/mysql/src/test/java/org/testcontainers/junit/mysql/CustomizableMysqlTest.java +++ b/modules/mysql/src/test/java/org/testcontainers/junit/mysql/CustomizableMysqlTest.java @@ -1,9 +1,9 @@ package org.testcontainers.junit.mysql; import org.junit.Test; +import org.testcontainers.MySQLTestImages; import org.testcontainers.containers.MySQLContainer; import org.testcontainers.db.AbstractContainerDatabaseTest; -import org.testcontainers.utility.DockerImageName; import java.sql.ResultSet; import java.sql.SQLException; @@ -18,7 +18,7 @@ public class CustomizableMysqlTest extends AbstractContainerDatabaseTest { @Test public void testSimple() throws SQLException { // Add MYSQL_ROOT_HOST environment so that we can root login from anywhere for testing purposes - try (MySQLContainer mysql = new MySQLContainer<>(new DockerImageName("mysql:5.5")) + try (MySQLContainer mysql = new MySQLContainer<>(MySQLTestImages.MYSQL_IMAGE) .withDatabaseName(DB_NAME) .withUsername(USER) .withPassword(PWD) diff --git a/modules/mysql/src/test/java/org/testcontainers/junit/mysql/SimpleMySQLTest.java b/modules/mysql/src/test/java/org/testcontainers/junit/mysql/SimpleMySQLTest.java index 6d6f8d26453..0f1fa1ad06d 100644 --- a/modules/mysql/src/test/java/org/testcontainers/junit/mysql/SimpleMySQLTest.java +++ b/modules/mysql/src/test/java/org/testcontainers/junit/mysql/SimpleMySQLTest.java @@ -20,10 +20,13 @@ import static org.hamcrest.CoreMatchers.containsString; import static org.junit.Assert.assertThat; -import static org.junit.Assert.fail; import static org.junit.Assume.assumeFalse; import static org.rnorth.visibleassertions.VisibleAssertions.assertEquals; import static org.rnorth.visibleassertions.VisibleAssertions.assertTrue; +import static org.rnorth.visibleassertions.VisibleAssertions.fail; +import static org.testcontainers.MySQLTestImages.MYSQL_55_IMAGE; +import static org.testcontainers.MySQLTestImages.MYSQL_56_IMAGE; +import static org.testcontainers.MySQLTestImages.MYSQL_IMAGE; public class SimpleMySQLTest extends AbstractContainerDatabaseTest { @@ -37,19 +40,19 @@ public class SimpleMySQLTest extends AbstractContainerDatabaseTest { */ /* @ClassRule - public static MySQLContainer mysql = new MySQLContainer<>(); + public static MySQLContainer mysql = new MySQLContainer<>(MYSQL_IMAGE); @ClassRule - public static MySQLContainer mysqlOldVersion = new MySQLContainer<>("mysql:5.5"); + public static MySQLContainer mysqlOldVersion = new MySQLContainer<>(new DockerImageName("mysql:5.5");) @ClassRule - public static MySQLContainer mysqlCustomConfig = new MySQLContainer<>("mysql:5.6") + public static MySQLContainer mysqlCustomConfig = new MySQLContainer<>(new DockerImageName("mysql:5.6")) .withConfigurationOverride("somepath/mysql_conf_override"); */ @Test public void testSimple() throws SQLException { - try (MySQLContainer mysql = new MySQLContainer<>() + try (MySQLContainer mysql = new MySQLContainer<>(MYSQL_IMAGE) .withConfigurationOverride("somepath/mysql_conf_override") .withLogConsumer(new Slf4jLogConsumer(logger))) { @@ -64,7 +67,7 @@ public void testSimple() throws SQLException { @Test public void testSpecificVersion() throws SQLException { - try (MySQLContainer mysqlOldVersion = new MySQLContainer<>("mysql:5.5") + try (MySQLContainer mysqlOldVersion = new MySQLContainer<>(MYSQL_55_IMAGE) .withConfigurationOverride("somepath/mysql_conf_override") .withLogConsumer(new Slf4jLogConsumer(logger))) { @@ -81,7 +84,7 @@ public void testSpecificVersion() throws SQLException { public void testMySQLWithCustomIniFile() throws SQLException { assumeFalse(SystemUtils.IS_OS_WINDOWS); - try (MySQLContainer mysqlCustomConfig = new MySQLContainer<>("mysql:5.6") + try (MySQLContainer mysqlCustomConfig = new MySQLContainer<>(MYSQL_56_IMAGE) .withConfigurationOverride("somepath/mysql_conf_override")) { mysqlCustomConfig.start(); @@ -95,7 +98,7 @@ public void testMySQLWithCustomIniFile() throws SQLException { @Test public void testCommandOverride() throws SQLException { - try (MySQLContainer mysqlCustomConfig = new MySQLContainer<>() + try (MySQLContainer mysqlCustomConfig = new MySQLContainer<>(MYSQL_IMAGE) .withCommand("mysqld --auto_increment_increment=42")) { mysqlCustomConfig.start(); @@ -109,7 +112,7 @@ public void testCommandOverride() throws SQLException { @Test public void testExplicitInitScript() throws SQLException { - try (MySQLContainer container = new MySQLContainer<>() + try (MySQLContainer container = new MySQLContainer<>(MYSQL_IMAGE) .withInitScript("somepath/init_mysql.sql") .withLogConsumer(new Slf4jLogConsumer(logger))) { container.start(); @@ -123,7 +126,7 @@ public void testExplicitInitScript() throws SQLException { @Test(expected = ContainerLaunchException.class) public void testEmptyPasswordWithNonRootUser() { - try (MySQLContainer container = new MySQLContainer<>("mysql:5.5") + try (MySQLContainer container = new MySQLContainer<>(MYSQL_55_IMAGE) .withDatabaseName("TEST") .withUsername("test") .withPassword("") @@ -136,7 +139,7 @@ public void testEmptyPasswordWithNonRootUser() { @Test public void testEmptyPasswordWithRootUser() throws SQLException { // Add MYSQL_ROOT_HOST environment so that we can root login from anywhere for testing purposes - try (MySQLContainer mysql = new MySQLContainer<>("mysql:5.5") + try (MySQLContainer mysql = new MySQLContainer<>(MYSQL_55_IMAGE) .withDatabaseName("foo") .withUsername("root") .withPassword("") @@ -153,7 +156,7 @@ public void testEmptyPasswordWithRootUser() throws SQLException { @Test public void testWithAdditionalUrlParamTimeZone() throws SQLException { - MySQLContainer mysql = (MySQLContainer) new MySQLContainer() + MySQLContainer mysql = new MySQLContainer<>(MYSQL_IMAGE) .withUrlParam("serverTimezone", "Europe/Zurich") .withEnv("TZ", "Europe/Zurich") .withLogConsumer(new Slf4jLogConsumer(logger)); @@ -183,7 +186,7 @@ public void testWithAdditionalUrlParamTimeZone() throws SQLException { @Test public void testWithAdditionalUrlParamMultiQueries() throws SQLException { - MySQLContainer mysql = (MySQLContainer) new MySQLContainer() + MySQLContainer mysql = new MySQLContainer<>(MYSQL_IMAGE) .withUrlParam("allowMultiQueries", "true") .withLogConsumer(new Slf4jLogConsumer(logger)); mysql.start(); @@ -207,7 +210,7 @@ public void testWithAdditionalUrlParamMultiQueries() throws SQLException { @Test public void testWithAdditionalUrlParamInJdbcUrl() { - MySQLContainer mysql = (MySQLContainer) new MySQLContainer() + MySQLContainer mysql = new MySQLContainer<>(MYSQL_IMAGE) .withUrlParam("allowMultiQueries", "true") .withUrlParam("rewriteBatchedStatements", "true") .withLogConsumer(new Slf4jLogConsumer(logger)); diff --git a/modules/neo4j/src/test/java/org/testcontainers/containers/Neo4jContainerJUnitIntegrationTest.java b/modules/neo4j/src/test/java/org/testcontainers/containers/Neo4jContainerJUnitIntegrationTest.java index 96b7a48b96f..5a67674cbe8 100644 --- a/modules/neo4j/src/test/java/org/testcontainers/containers/Neo4jContainerJUnitIntegrationTest.java +++ b/modules/neo4j/src/test/java/org/testcontainers/containers/Neo4jContainerJUnitIntegrationTest.java @@ -1,9 +1,5 @@ package org.testcontainers.containers; -import static org.assertj.core.api.Assertions.*; - -import java.util.Collections; - import org.junit.ClassRule; import org.junit.Test; import org.neo4j.driver.v1.AuthTokens; @@ -11,6 +7,11 @@ import org.neo4j.driver.v1.GraphDatabase; import org.neo4j.driver.v1.Session; +import java.util.Collections; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.fail; + /** * Test for basic functionality when used as a @ClassRule. * @@ -19,7 +20,7 @@ public class Neo4jContainerJUnitIntegrationTest { @ClassRule - public static Neo4jContainer neo4jContainer = new Neo4jContainer(); + public static Neo4jContainer neo4jContainer = new Neo4jContainer<>(Neo4jTestImages.NEO4J_TEST_IMAGE); @Test public void shouldStart() { diff --git a/modules/neo4j/src/test/java/org/testcontainers/containers/Neo4jContainerTest.java b/modules/neo4j/src/test/java/org/testcontainers/containers/Neo4jContainerTest.java index cbbe5cb5729..6a32dac0af0 100644 --- a/modules/neo4j/src/test/java/org/testcontainers/containers/Neo4jContainerTest.java +++ b/modules/neo4j/src/test/java/org/testcontainers/containers/Neo4jContainerTest.java @@ -1,10 +1,5 @@ package org.testcontainers.containers; -import static org.assertj.core.api.Assertions.*; -import static org.assertj.core.api.Assumptions.*; - -import java.util.Collections; - import org.junit.Test; import org.neo4j.driver.v1.AuthToken; import org.neo4j.driver.v1.AuthTokens; @@ -15,6 +10,12 @@ import org.neo4j.driver.v1.StatementResult; import org.testcontainers.utility.MountableFile; +import java.util.Collections; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatExceptionOfType; +import static org.assertj.core.api.Assumptions.assumeThat; + /** * Tests of functionality special to the Neo4jContainer. * @@ -29,7 +30,7 @@ public class Neo4jContainerTest { public void shouldDisableAuthentication() { try ( - Neo4jContainer neo4jContainer = new Neo4jContainer().withoutAuthentication(); + Neo4jContainer neo4jContainer = new Neo4jContainer<>(Neo4jTestImages.NEO4J_TEST_IMAGE).withoutAuthentication() ) { neo4jContainer.start(); try (Driver driver = getDriver(neo4jContainer); @@ -44,8 +45,8 @@ public void shouldDisableAuthentication() { @Test public void shouldCopyDatabase() { try ( - Neo4jContainer neo4jContainer = new Neo4jContainer() - .withDatabase(MountableFile.forClasspathResource("/test-graph.db")); + Neo4jContainer neo4jContainer = new Neo4jContainer<>(Neo4jTestImages.NEO4J_TEST_IMAGE) + .withDatabase(MountableFile.forClasspathResource("/test-graph.db")) ) { neo4jContainer.start(); try ( @@ -62,8 +63,8 @@ public void shouldCopyDatabase() { @Test public void shouldCopyPlugins() { try ( - Neo4jContainer neo4jContainer = new Neo4jContainer() - .withPlugins(MountableFile.forClasspathResource("/custom-plugins")); + Neo4jContainer neo4jContainer = new Neo4jContainer<>(Neo4jTestImages.NEO4J_TEST_IMAGE) + .withPlugins(MountableFile.forClasspathResource("/custom-plugins")) ) { neo4jContainer.start(); try ( @@ -78,8 +79,8 @@ public void shouldCopyPlugins() { @Test public void shouldCopyPlugin() { try ( - Neo4jContainer neo4jContainer = new Neo4jContainer() - .withPlugins(MountableFile.forClasspathResource("/custom-plugins/hello-world.jar")); + Neo4jContainer neo4jContainer = new Neo4jContainer<>(Neo4jTestImages.NEO4J_TEST_IMAGE) + .withPlugins(MountableFile.forClasspathResource("/custom-plugins/hello-world.jar")) ) { neo4jContainer.start(); try ( @@ -105,7 +106,7 @@ public void shouldCheckEnterpriseLicense() { String expectedImageName = "neo4j:3.5.0-enterprise"; assertThatExceptionOfType(IllegalStateException.class) - .isThrownBy(() -> new Neo4jContainer().withEnterpriseEdition()) + .isThrownBy(() -> new Neo4jContainer<>(Neo4jTestImages.NEO4J_TEST_IMAGE).withEnterpriseEdition()) .withMessageContaining("The image " + expectedImageName + " requires you to accept a license agreement."); } @@ -114,7 +115,7 @@ public void shouldRunEnterprise() { assumeThat(Neo4jContainerTest.class.getResource(ACCEPTANCE_FILE_LOCATION)).isNotNull(); try ( - Neo4jContainer neo4jContainer = new Neo4jContainer() + Neo4jContainer neo4jContainer = new Neo4jContainer<>(Neo4jTestImages.NEO4J_TEST_IMAGE) .withEnterpriseEdition() .withAdminPassword("Picard123") ) { @@ -134,7 +135,7 @@ public void shouldRunEnterprise() { @Test public void shouldAddConfigToEnvironment() { - Neo4jContainer neo4jContainer = new Neo4jContainer() + Neo4jContainer neo4jContainer = new Neo4jContainer<>(Neo4jTestImages.NEO4J_TEST_IMAGE) .withNeo4jConfig("dbms.security.procedures.unrestricted", "apoc.*,algo.*") .withNeo4jConfig("dbms.tx_log.rotation.size", "42M"); @@ -144,7 +145,7 @@ public void shouldAddConfigToEnvironment() { .containsEntry("NEO4J_dbms_tx__log_rotation_size", "42M"); } - private static Driver getDriver(Neo4jContainer container) { + private static Driver getDriver(Neo4jContainer container) { AuthToken authToken = AuthTokens.none(); if (container.getAdminPassword() != null) { diff --git a/modules/neo4j/src/test/java/org/testcontainers/containers/Neo4jTestImages.java b/modules/neo4j/src/test/java/org/testcontainers/containers/Neo4jTestImages.java new file mode 100644 index 00000000000..4f54d04acb8 --- /dev/null +++ b/modules/neo4j/src/test/java/org/testcontainers/containers/Neo4jTestImages.java @@ -0,0 +1,7 @@ +package org.testcontainers.containers; + +import org.testcontainers.utility.DockerImageName; + +public interface Neo4jTestImages { + DockerImageName NEO4J_TEST_IMAGE = new DockerImageName("neo4j:3.5.0"); +} diff --git a/modules/nginx/src/test/java/org/testcontainers/junit/SimpleNginxTest.java b/modules/nginx/src/test/java/org/testcontainers/junit/SimpleNginxTest.java index b41a0d8361e..36a81a75015 100644 --- a/modules/nginx/src/test/java/org/testcontainers/junit/SimpleNginxTest.java +++ b/modules/nginx/src/test/java/org/testcontainers/junit/SimpleNginxTest.java @@ -6,6 +6,7 @@ import org.junit.Test; import org.testcontainers.containers.NginxContainer; import org.testcontainers.containers.wait.strategy.HttpWaitStrategy; +import org.testcontainers.utility.DockerImageName; import java.io.*; import java.net.URL; @@ -19,11 +20,13 @@ */ public class SimpleNginxTest { + private static final DockerImageName NGINX_IMAGE = new DockerImageName("nginx:1.9.4"); + private static String tmpDirectory = System.getProperty("user.home") + "/.tmp-test-container"; // creatingContainer { @Rule - public NginxContainer nginx = new NginxContainer<>() + public NginxContainer nginx = new NginxContainer<>(NGINX_IMAGE) .withCustomContent(tmpDirectory) .waitingFor(new HttpWaitStrategy()); // } diff --git a/modules/orientdb/src/test/java/org/testcontainers/containers/OrientDBContainerTest.java b/modules/orientdb/src/test/java/org/testcontainers/containers/OrientDBContainerTest.java index 54b0661cae2..67bf67a7471 100644 --- a/modules/orientdb/src/test/java/org/testcontainers/containers/OrientDBContainerTest.java +++ b/modules/orientdb/src/test/java/org/testcontainers/containers/OrientDBContainerTest.java @@ -2,6 +2,7 @@ import com.orientechnologies.orient.core.db.ODatabaseSession; import org.junit.Test; +import org.testcontainers.utility.DockerImageName; import static org.assertj.core.api.Assertions.*; @@ -10,9 +11,11 @@ */ public class OrientDBContainerTest { + public static final DockerImageName ORIENTDB_IMAGE = new DockerImageName("orientdb:3.0.24-tp3"); + @Test public void shouldReturnTheSameSession() { - try (OrientDBContainer container = new OrientDBContainer()) { + try (OrientDBContainer container = new OrientDBContainer(ORIENTDB_IMAGE)) { container.start(); final ODatabaseSession session = container.getSession(); @@ -24,7 +27,7 @@ public void shouldReturnTheSameSession() { @Test public void shouldInitializeWithCommands() { - try (OrientDBContainer container = new OrientDBContainer()) { + try (OrientDBContainer container = new OrientDBContainer(ORIENTDB_IMAGE)) { container.start(); final ODatabaseSession session = container.getSession(); @@ -40,7 +43,7 @@ public void shouldInitializeWithCommands() { @Test public void shouldQueryWithGremlin() { - try (OrientDBContainer container = new OrientDBContainer()) { + try (OrientDBContainer container = new OrientDBContainer(ORIENTDB_IMAGE)) { container.start(); final ODatabaseSession session = container.getSession("admin", "admin"); @@ -56,7 +59,7 @@ public void shouldQueryWithGremlin() { @Test public void shouldInitializeDatabaseFromScript() { - try (OrientDBContainer container = new OrientDBContainer() + try (OrientDBContainer container = new OrientDBContainer(ORIENTDB_IMAGE) .withScriptPath("initscript.osql") .withDatabaseName("persons")) { diff --git a/modules/postgresql/src/test/java/org/testcontainers/PostgreSQLTestImages.java b/modules/postgresql/src/test/java/org/testcontainers/PostgreSQLTestImages.java new file mode 100644 index 00000000000..2fac41ed7e8 --- /dev/null +++ b/modules/postgresql/src/test/java/org/testcontainers/PostgreSQLTestImages.java @@ -0,0 +1,7 @@ +package org.testcontainers; + +import org.testcontainers.utility.DockerImageName; + +public class PostgreSQLTestImages { + public static final DockerImageName POSTGRES_TEST_IMAGE = new DockerImageName("postgres:9.6.12"); +} diff --git a/modules/postgresql/src/test/java/org/testcontainers/containers/PostgreSQLR2DBCDatabaseContainerTest.java b/modules/postgresql/src/test/java/org/testcontainers/containers/PostgreSQLR2DBCDatabaseContainerTest.java index a3da6ea9b44..46e439aaf66 100644 --- a/modules/postgresql/src/test/java/org/testcontainers/containers/PostgreSQLR2DBCDatabaseContainerTest.java +++ b/modules/postgresql/src/test/java/org/testcontainers/containers/PostgreSQLR2DBCDatabaseContainerTest.java @@ -1,14 +1,14 @@ package org.testcontainers.containers; import io.r2dbc.spi.ConnectionFactoryOptions; +import org.testcontainers.PostgreSQLTestImages; import org.testcontainers.r2dbc.AbstractR2DBCDatabaseContainerTest; -import org.testcontainers.utility.DockerImageName; public class PostgreSQLR2DBCDatabaseContainerTest extends AbstractR2DBCDatabaseContainerTest> { @Override protected PostgreSQLContainer createContainer() { - return new PostgreSQLContainer<>(new DockerImageName(PostgreSQLContainer.IMAGE, PostgreSQLContainer.DEFAULT_TAG)); + return new PostgreSQLContainer<>(PostgreSQLTestImages.POSTGRES_TEST_IMAGE); } @Override diff --git a/modules/postgresql/src/test/java/org/testcontainers/junit/postgresql/CustomizablePostgreSQLTest.java b/modules/postgresql/src/test/java/org/testcontainers/junit/postgresql/CustomizablePostgreSQLTest.java index f4cea8836ac..8fd523434dd 100644 --- a/modules/postgresql/src/test/java/org/testcontainers/junit/postgresql/CustomizablePostgreSQLTest.java +++ b/modules/postgresql/src/test/java/org/testcontainers/junit/postgresql/CustomizablePostgreSQLTest.java @@ -1,9 +1,9 @@ package org.testcontainers.junit.postgresql; import org.junit.Test; +import org.testcontainers.PostgreSQLTestImages; import org.testcontainers.containers.PostgreSQLContainer; import org.testcontainers.db.AbstractContainerDatabaseTest; -import org.testcontainers.utility.DockerImageName; import java.sql.ResultSet; import java.sql.SQLException; @@ -20,7 +20,7 @@ public class CustomizablePostgreSQLTest extends AbstractContainerDatabaseTest { @Test public void testSimple() throws SQLException { - try (PostgreSQLContainer postgres = new PostgreSQLContainer<>(new DockerImageName("postgres:9.6.8")) + try (PostgreSQLContainer postgres = new PostgreSQLContainer<>(PostgreSQLTestImages.POSTGRES_TEST_IMAGE) .withDatabaseName(DB_NAME) .withUsername(USER) .withPassword(PWD)) { diff --git a/modules/postgresql/src/test/java/org/testcontainers/junit/postgresql/SimplePostgreSQLTest.java b/modules/postgresql/src/test/java/org/testcontainers/junit/postgresql/SimplePostgreSQLTest.java index 36ece03b604..95e1fdf10fd 100644 --- a/modules/postgresql/src/test/java/org/testcontainers/junit/postgresql/SimplePostgreSQLTest.java +++ b/modules/postgresql/src/test/java/org/testcontainers/junit/postgresql/SimplePostgreSQLTest.java @@ -13,6 +13,7 @@ import static org.junit.Assert.assertThat; import static org.rnorth.visibleassertions.VisibleAssertions.assertEquals; import static org.rnorth.visibleassertions.VisibleAssertions.assertNotEquals; +import static org.testcontainers.PostgreSQLTestImages.POSTGRES_TEST_IMAGE; public class SimplePostgreSQLTest extends AbstractContainerDatabaseTest { @@ -23,7 +24,7 @@ public class SimplePostgreSQLTest extends AbstractContainerDatabaseTest { @Test public void testSimple() throws SQLException { - try (PostgreSQLContainer postgres = new PostgreSQLContainer<>()) { + try (PostgreSQLContainer postgres = new PostgreSQLContainer<>(POSTGRES_TEST_IMAGE)) { postgres.start(); ResultSet resultSet = performQuery(postgres, "SELECT 1"); @@ -34,7 +35,7 @@ public void testSimple() throws SQLException { @Test public void testCommandOverride() throws SQLException { - try (PostgreSQLContainer postgres = new PostgreSQLContainer<>().withCommand("postgres -c max_connections=42")) { + try (PostgreSQLContainer postgres = new PostgreSQLContainer<>(POSTGRES_TEST_IMAGE).withCommand("postgres -c max_connections=42")) { postgres.start(); ResultSet resultSet = performQuery(postgres, "SELECT current_setting('max_connections')"); @@ -45,7 +46,7 @@ public void testCommandOverride() throws SQLException { @Test public void testUnsetCommand() throws SQLException { - try (PostgreSQLContainer postgres = new PostgreSQLContainer<>().withCommand("postgres -c max_connections=42").withCommand()) { + try (PostgreSQLContainer postgres = new PostgreSQLContainer<>(POSTGRES_TEST_IMAGE).withCommand("postgres -c max_connections=42").withCommand()) { postgres.start(); ResultSet resultSet = performQuery(postgres, "SELECT current_setting('max_connections')"); @@ -56,7 +57,7 @@ public void testUnsetCommand() throws SQLException { @Test public void testExplicitInitScript() throws SQLException { - try (PostgreSQLContainer postgres = new PostgreSQLContainer<>().withInitScript("somepath/init_postgresql.sql")) { + try (PostgreSQLContainer postgres = new PostgreSQLContainer<>(POSTGRES_TEST_IMAGE).withInitScript("somepath/init_postgresql.sql")) { postgres.start(); ResultSet resultSet = performQuery(postgres, "SELECT foo FROM bar"); @@ -68,7 +69,7 @@ public void testExplicitInitScript() throws SQLException { @Test public void testWithAdditionalUrlParamInJdbcUrl() { - try (PostgreSQLContainer postgres = new PostgreSQLContainer<>() + try (PostgreSQLContainer postgres = new PostgreSQLContainer<>(POSTGRES_TEST_IMAGE) .withUrlParam("charSet", "UNICODE")) { postgres.start(); diff --git a/modules/selenium/src/test/java/org/testcontainers/SeleniumTestImages.java b/modules/selenium/src/test/java/org/testcontainers/SeleniumTestImages.java new file mode 100644 index 00000000000..1a1e9f31635 --- /dev/null +++ b/modules/selenium/src/test/java/org/testcontainers/SeleniumTestImages.java @@ -0,0 +1,7 @@ +package org.testcontainers; + +import org.testcontainers.utility.DockerImageName; + +public interface SeleniumTestImages { + DockerImageName NGINX_TEST_IMAGE = new DockerImageName("nginx:1.9.4"); +} diff --git a/modules/selenium/src/test/java/org/testcontainers/junit/LinkedContainerTest.java b/modules/selenium/src/test/java/org/testcontainers/junit/LinkedContainerTest.java index 1a703ad3ea7..d3e458e07ec 100644 --- a/modules/selenium/src/test/java/org/testcontainers/junit/LinkedContainerTest.java +++ b/modules/selenium/src/test/java/org/testcontainers/junit/LinkedContainerTest.java @@ -7,13 +7,17 @@ import org.openqa.selenium.By; import org.openqa.selenium.chrome.ChromeOptions; import org.openqa.selenium.remote.RemoteWebDriver; +import org.testcontainers.SeleniumTestImages; import org.testcontainers.containers.BrowserWebDriverContainer; import org.testcontainers.containers.Network; import org.testcontainers.containers.NginxContainer; -import java.io.*; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.PrintStream; -import static org.rnorth.visibleassertions.VisibleAssertions.*; +import static org.rnorth.visibleassertions.VisibleAssertions.assertEquals; /** @@ -27,13 +31,13 @@ public class LinkedContainerTest { public Network network = Network.newNetwork(); @Rule - public NginxContainer nginx = new NginxContainer<>() + public NginxContainer nginx = new NginxContainer<>(SeleniumTestImages.NGINX_TEST_IMAGE) .withNetwork(network) .withNetworkAliases("nginx") .withCustomContent(contentFolder.toString()); @Rule - public BrowserWebDriverContainer chrome = new BrowserWebDriverContainer<>() + public BrowserWebDriverContainer chrome = new BrowserWebDriverContainer<>() .withNetwork(network) .withCapabilities(new ChromeOptions()); diff --git a/modules/selenium/src/test/java/org/testcontainers/junit/Selenium3xTest.java b/modules/selenium/src/test/java/org/testcontainers/junit/Selenium3xTest.java index f7415471bc8..ba95528eebd 100644 --- a/modules/selenium/src/test/java/org/testcontainers/junit/Selenium3xTest.java +++ b/modules/selenium/src/test/java/org/testcontainers/junit/Selenium3xTest.java @@ -5,6 +5,7 @@ import org.junit.runners.Parameterized; import org.openqa.selenium.chrome.ChromeOptions; import org.testcontainers.containers.BrowserWebDriverContainer; +import org.testcontainers.utility.DockerImageName; /** * Simple test to check that readiness detection works correctly across major versions of the containers. @@ -22,7 +23,8 @@ public static String[] data() { @Test public void testAdditionalStartupString() { - try (BrowserWebDriverContainer chrome = new BrowserWebDriverContainer("selenium/standalone-chrome-debug:" + tag) + final DockerImageName imageName = new DockerImageName("selenium/standalone-chrome-debug", tag); + try (BrowserWebDriverContainer chrome = new BrowserWebDriverContainer<>(imageName) .withCapabilities(new ChromeOptions())) { chrome.start(); } diff --git a/modules/selenium/src/test/java/org/testcontainers/junit/SpecificImageNameWebDriverContainerTest.java b/modules/selenium/src/test/java/org/testcontainers/junit/SpecificImageNameWebDriverContainerTest.java index 01edd70c102..7be2610a198 100644 --- a/modules/selenium/src/test/java/org/testcontainers/junit/SpecificImageNameWebDriverContainerTest.java +++ b/modules/selenium/src/test/java/org/testcontainers/junit/SpecificImageNameWebDriverContainerTest.java @@ -4,14 +4,14 @@ import org.junit.Test; import org.openqa.selenium.firefox.FirefoxOptions; import org.testcontainers.containers.BrowserWebDriverContainer; +import org.testcontainers.utility.DockerImageName; -/** - * - */ public class SpecificImageNameWebDriverContainerTest extends BaseWebDriverContainerTest { + private static final DockerImageName FIREFOX_IMAGE = new DockerImageName("selenium/standalone-firefox:2.53.1-beryllium"); + @Rule - public BrowserWebDriverContainer firefox = new BrowserWebDriverContainer("selenium/standalone-firefox:2.53.1-beryllium") + public BrowserWebDriverContainer firefox = new BrowserWebDriverContainer<>(FIREFOX_IMAGE) .withCapabilities(new FirefoxOptions()); @Test diff --git a/modules/solr/src/test/java/org/testcontainers/containers/SolrContainerTest.java b/modules/solr/src/test/java/org/testcontainers/containers/SolrContainerTest.java index 48cb04b7053..51790324a94 100644 --- a/modules/solr/src/test/java/org/testcontainers/containers/SolrContainerTest.java +++ b/modules/solr/src/test/java/org/testcontainers/containers/SolrContainerTest.java @@ -1,23 +1,26 @@ package org.testcontainers.containers; -import static org.hamcrest.CoreMatchers.containsString; -import static org.hamcrest.CoreMatchers.is; -import static org.hamcrest.MatcherAssert.assertThat; - -import java.io.IOException; - import org.apache.solr.client.solrj.SolrClient; import org.apache.solr.client.solrj.SolrServerException; import org.apache.solr.client.solrj.impl.Http2SolrClient; import org.apache.solr.client.solrj.response.SolrPingResponse; import org.junit.After; import org.junit.Test; +import org.testcontainers.utility.DockerImageName; + +import java.io.IOException; + +import static org.hamcrest.CoreMatchers.containsString; +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.MatcherAssert.assertThat; /** * @author Simon Schneider */ public class SolrContainerTest { + private static final DockerImageName SOLR_IMAGE = new DockerImageName("solr:8.3.0"); + private SolrClient client = null; @After @@ -30,7 +33,7 @@ public void stopRestClient() throws IOException { @Test public void solrCloudTest() throws IOException, SolrServerException { - try (SolrContainer container = new SolrContainer()) { + try (SolrContainer container = new SolrContainer(SOLR_IMAGE)) { container.start(); SolrPingResponse response = getClient(container).ping("dummy"); assertThat(response.getStatus(), is(0)); @@ -40,7 +43,7 @@ public void solrCloudTest() throws IOException, SolrServerException { @Test public void solrStandaloneTest() throws IOException, SolrServerException { - try (SolrContainer container = new SolrContainer().withZookeeper(false)) { + try (SolrContainer container = new SolrContainer(SOLR_IMAGE).withZookeeper(false)) { container.start(); SolrPingResponse response = getClient(container).ping("dummy"); assertThat(response.getStatus(), is(0)); @@ -52,7 +55,7 @@ public void solrStandaloneTest() throws IOException, SolrServerException { public void solrCloudPingTest() throws IOException, SolrServerException { // solrContainerUsage { // Create the solr container. - SolrContainer container = new SolrContainer(); + SolrContainer container = new SolrContainer(SOLR_IMAGE); // Start the container. This step might take some time... container.start(); diff --git a/modules/toxiproxy/src/test/java/org/testcontainers/ToxiproxyTestImages.java b/modules/toxiproxy/src/test/java/org/testcontainers/ToxiproxyTestImages.java new file mode 100644 index 00000000000..9d7e4252176 --- /dev/null +++ b/modules/toxiproxy/src/test/java/org/testcontainers/ToxiproxyTestImages.java @@ -0,0 +1,8 @@ +package org.testcontainers; + +import org.testcontainers.utility.DockerImageName; + +public interface ToxiproxyTestImages { + DockerImageName REDIS_IMAGE = new DockerImageName("redis:5.0.4"); + DockerImageName TOXIPROXY_IMAGE = new DockerImageName("shopify/toxiproxy:2.1.0"); +} diff --git a/modules/toxiproxy/src/test/java/org/testcontainers/containers/ToxiproxyTest.java b/modules/toxiproxy/src/test/java/org/testcontainers/containers/ToxiproxyTest.java index 710a73c9bb0..2c0470e9270 100644 --- a/modules/toxiproxy/src/test/java/org/testcontainers/containers/ToxiproxyTest.java +++ b/modules/toxiproxy/src/test/java/org/testcontainers/containers/ToxiproxyTest.java @@ -3,7 +3,7 @@ import eu.rekawek.toxiproxy.model.ToxicDirection; import org.junit.Rule; import org.junit.Test; -import org.testcontainers.utility.DockerImageName; +import org.testcontainers.ToxiproxyTestImages; import redis.clients.jedis.Jedis; import redis.clients.jedis.exceptions.JedisConnectionException; @@ -30,13 +30,13 @@ public class ToxiproxyTest { // The target container - this could be anything @Rule - public GenericContainer redis = new GenericContainer(new DockerImageName("redis:5.0.4")) + public GenericContainer redis = new GenericContainer<>(ToxiproxyTestImages.REDIS_IMAGE) .withExposedPorts(6379) .withNetwork(network); // Toxiproxy container, which will be used as a TCP proxy @Rule - public ToxiproxyContainer toxiproxy = new ToxiproxyContainer() + public ToxiproxyContainer toxiproxy = new ToxiproxyContainer(ToxiproxyTestImages.TOXIPROXY_IMAGE) .withNetwork(network) .withNetworkAliases(TOXIPROXY_NETWORK_ALIAS); // } @@ -102,7 +102,7 @@ public void testConnectionCut() { @Test public void testMultipleProxiesCanBeCreated() { - try (GenericContainer secondRedis = new GenericContainer(new DockerImageName("redis:5.0.4")) + try (GenericContainer secondRedis = new GenericContainer<>(ToxiproxyTestImages.REDIS_IMAGE) .withExposedPorts(6379) .withNetwork(network)) { diff --git a/modules/vault/src/test/java/org/testcontainers/vault/VaultClientTest.java b/modules/vault/src/test/java/org/testcontainers/vault/VaultClientTest.java index dfe73cae4b9..4a1a800da17 100644 --- a/modules/vault/src/test/java/org/testcontainers/vault/VaultClientTest.java +++ b/modules/vault/src/test/java/org/testcontainers/vault/VaultClientTest.java @@ -10,6 +10,7 @@ import java.util.Map; import static org.assertj.core.api.Assertions.assertThat; +import static org.testcontainers.vault.VaultTestImages.VAULT_IMAGE; public class VaultClientTest { @@ -18,7 +19,7 @@ public class VaultClientTest { @Test public void writeAndReadMultipleValues() throws VaultException { try ( - VaultContainer vaultContainer = new VaultContainer<>() + VaultContainer vaultContainer = new VaultContainer<>(VAULT_IMAGE) .withVaultToken(VAULT_TOKEN) ) { diff --git a/modules/vault/src/test/java/org/testcontainers/vault/VaultContainerTest.java b/modules/vault/src/test/java/org/testcontainers/vault/VaultContainerTest.java index d7ac5ca8686..b3dd788f053 100644 --- a/modules/vault/src/test/java/org/testcontainers/vault/VaultContainerTest.java +++ b/modules/vault/src/test/java/org/testcontainers/vault/VaultContainerTest.java @@ -19,7 +19,7 @@ public class VaultContainerTest { private static final String VAULT_TOKEN = "my-root-token"; @ClassRule - public static VaultContainer vaultContainer = new VaultContainer<>() + public static VaultContainer vaultContainer = new VaultContainer<>(VaultTestImages.VAULT_IMAGE) .withVaultToken(VAULT_TOKEN) .withSecretInVault("secret/testing1", "top_secret=password123") .withSecretInVault("secret/testing2", diff --git a/modules/vault/src/test/java/org/testcontainers/vault/VaultTestImages.java b/modules/vault/src/test/java/org/testcontainers/vault/VaultTestImages.java new file mode 100644 index 00000000000..81b4eeab5c1 --- /dev/null +++ b/modules/vault/src/test/java/org/testcontainers/vault/VaultTestImages.java @@ -0,0 +1,7 @@ +package org.testcontainers.vault; + +import org.testcontainers.utility.DockerImageName; + +public interface VaultTestImages { + DockerImageName VAULT_IMAGE = new DockerImageName("vault:1.1.3"); +} From f3fe8078ac4500d09dfa706d2a1c692358bbd6d1 Mon Sep 17 00:00:00 2001 From: Richard North Date: Thu, 2 Jul 2020 15:04:43 +0100 Subject: [PATCH 05/17] Tidy up test image references --- .../containers/ReusabilityUnitTests.java | 2 +- .../LinkedContainerTestImages.java | 8 +++ .../linkedcontainer/RedmineClientTest.java | 4 +- .../linkedcontainer/RedmineContainer.java | 3 +- .../couchbase/CouchbaseContainerTest.java | 4 +- .../dynamodb/DynaliteContainerTest.java | 4 +- .../ElasticsearchContainerTest.java | 3 +- .../jupiter/inheritance/RedisContainer.java | 7 +-- .../containers/KafkaContainerTest.java | 12 +++-- .../containers/KafkaTestImages.java | 8 --- .../localstack/LocalstackContainerTest.java | 10 ++-- .../localstack/LocalstackTestImages.java | 8 --- .../junit/mariadb/SimpleMariaDBTest.java | 5 +- .../containers/MockServerContainer.java | 9 +++- .../containers/MockServerContainerTest.java | 7 ++- .../containers/MongoDBContainerTest.java | 5 +- .../containers/MongoTestImages.java | 7 --- .../junit/mysql/MultiVersionMySQLTest.java | 7 ++- .../containers/Neo4jContainer.java | 10 ++-- .../containers/OrientDBContainerTest.java | 2 +- .../testcontainers/PostgreSQLTestImages.java | 4 +- .../PostgreSQLConnectionURLTest.java | 7 +++ .../org/testcontainers/PrestoTestImages.java | 8 +++ .../containers/PrestoContainerTest.java | 14 ++--- .../containers/PulsarContainerTest.java | 4 +- ...RabbitMQContainerJUnitIntegrationTest.java | 2 +- .../containers/RabbitMQContainerTest.java | 51 ++++++++----------- .../containers/RabbitMQTestImages.java | 7 +++ .../containers/SolrContainerTest.java | 1 - .../spock/MySqlContainerIT.groovy | 2 +- .../spock/PostgresContainerIT.groovy | 2 +- .../spock/SpockTestImages.groovy | 11 ++++ .../spock/TestHierarchyIT.groovy | 2 +- .../TestLifecycleAwareContainerMock.java | 6 +++ ...TestcontainersRestartBetweenTestsIT.groovy | 2 +- .../TestcontainersSharedContainerIT.groovy | 2 +- .../testcontainers/ToxiproxyTestImages.java | 8 --- .../containers/ToxiproxyTest.java | 10 ++-- 38 files changed, 155 insertions(+), 113 deletions(-) create mode 100644 examples/linked-container/src/test/java/com/example/linkedcontainer/LinkedContainerTestImages.java delete mode 100644 modules/kafka/src/test/java/org/testcontainers/containers/KafkaTestImages.java delete mode 100644 modules/localstack/src/test/java/org/testcontainers/containers/localstack/LocalstackTestImages.java delete mode 100644 modules/mongodb/src/test/java/org/testcontainers/containers/MongoTestImages.java create mode 100644 modules/presto/src/test/java/org/testcontainers/PrestoTestImages.java create mode 100644 modules/rabbitmq/src/test/java/org/testcontainers/containers/RabbitMQTestImages.java create mode 100644 modules/spock/src/test/groovy/org/testcontainers/spock/SpockTestImages.groovy delete mode 100644 modules/toxiproxy/src/test/java/org/testcontainers/ToxiproxyTestImages.java diff --git a/core/src/test/java/org/testcontainers/containers/ReusabilityUnitTests.java b/core/src/test/java/org/testcontainers/containers/ReusabilityUnitTests.java index c2caa2b42e2..6a8fe491c19 100644 --- a/core/src/test/java/org/testcontainers/containers/ReusabilityUnitTests.java +++ b/core/src/test/java/org/testcontainers/containers/ReusabilityUnitTests.java @@ -56,7 +56,7 @@ public class ReusabilityUnitTests { static final CompletableFuture IMAGE_FUTURE = CompletableFuture.completedFuture( - TestcontainersConfiguration.getInstance().getTinyImage() + TestcontainersConfiguration.getInstance().getTinyDockerImageName().toString() ); @RunWith(Parameterized.class) diff --git a/examples/linked-container/src/test/java/com/example/linkedcontainer/LinkedContainerTestImages.java b/examples/linked-container/src/test/java/com/example/linkedcontainer/LinkedContainerTestImages.java new file mode 100644 index 00000000000..de1c4fc8de0 --- /dev/null +++ b/examples/linked-container/src/test/java/com/example/linkedcontainer/LinkedContainerTestImages.java @@ -0,0 +1,8 @@ +package com.example.linkedcontainer; + +import org.testcontainers.utility.DockerImageName; + +public interface LinkedContainerTestImages { + DockerImageName POSTGRES_TEST_IMAGE = new DockerImageName("postgres:9.6.12"); + DockerImageName REDMINE_TEST_IMAGE = new DockerImageName("redmine:3.3.2"); +} diff --git a/examples/linked-container/src/test/java/com/example/linkedcontainer/RedmineClientTest.java b/examples/linked-container/src/test/java/com/example/linkedcontainer/RedmineClientTest.java index 82275dcc71c..b84b2a9e2c9 100644 --- a/examples/linked-container/src/test/java/com/example/linkedcontainer/RedmineClientTest.java +++ b/examples/linked-container/src/test/java/com/example/linkedcontainer/RedmineClientTest.java @@ -15,11 +15,11 @@ public class RedmineClientTest { private static final String POSTGRES_USERNAME = "redmine"; private static final String POSTGRES_PASSWORD = "secret"; - private PostgreSQLContainer postgreSQLContainer = new PostgreSQLContainer("postgres:9.6.2") + private PostgreSQLContainer postgreSQLContainer = new PostgreSQLContainer<>(LinkedContainerTestImages.POSTGRES_TEST_IMAGE) .withUsername(POSTGRES_USERNAME) .withPassword(POSTGRES_PASSWORD); - private RedmineContainer redmineContainer = new RedmineContainer("redmine:3.3.2") + private RedmineContainer redmineContainer = new RedmineContainer(LinkedContainerTestImages.REDMINE_TEST_IMAGE) .withLinkToContainer(postgreSQLContainer, "postgres") .withEnv("POSTGRES_ENV_POSTGRES_USER", POSTGRES_USERNAME) .withEnv("POSTGRES_ENV_POSTGRES_PASSWORD", POSTGRES_PASSWORD); diff --git a/examples/linked-container/src/test/java/com/example/linkedcontainer/RedmineContainer.java b/examples/linked-container/src/test/java/com/example/linkedcontainer/RedmineContainer.java index 113d0a76ec0..a75867205ab 100644 --- a/examples/linked-container/src/test/java/com/example/linkedcontainer/RedmineContainer.java +++ b/examples/linked-container/src/test/java/com/example/linkedcontainer/RedmineContainer.java @@ -3,6 +3,7 @@ import org.testcontainers.containers.GenericContainer; import org.testcontainers.containers.traits.LinkableContainer; import org.testcontainers.containers.wait.strategy.Wait; +import org.testcontainers.utility.DockerImageName; /** * A Redmine container. @@ -11,7 +12,7 @@ public class RedmineContainer extends GenericContainer { private static final int REDMINE_PORT = 3000; - public RedmineContainer(String dockerImageName) { + public RedmineContainer(DockerImageName dockerImageName) { super(dockerImageName); } diff --git a/modules/couchbase/src/test/java/org/testcontainers/couchbase/CouchbaseContainerTest.java b/modules/couchbase/src/test/java/org/testcontainers/couchbase/CouchbaseContainerTest.java index 586a7a457bb..8d251d8b0a4 100644 --- a/modules/couchbase/src/test/java/org/testcontainers/couchbase/CouchbaseContainerTest.java +++ b/modules/couchbase/src/test/java/org/testcontainers/couchbase/CouchbaseContainerTest.java @@ -31,6 +31,8 @@ public class CouchbaseContainerTest { + private static final DockerImageName COUCHBASE_IMAGE = new DockerImageName("couchbase/server:6.5.1"); + @Test public void testBasicContainerUsage() { // bucket_definition { @@ -39,7 +41,7 @@ public void testBasicContainerUsage() { try ( // container_definition { - CouchbaseContainer container = new CouchbaseContainer(new DockerImageName("couchbase/server:6.5.1")) + CouchbaseContainer container = new CouchbaseContainer(COUCHBASE_IMAGE) .withBucket(bucketDefinition) // } ) { diff --git a/modules/dynalite/src/test/java/org/testcontainers/dynamodb/DynaliteContainerTest.java b/modules/dynalite/src/test/java/org/testcontainers/dynamodb/DynaliteContainerTest.java index 3406ea850ef..229433770ae 100644 --- a/modules/dynalite/src/test/java/org/testcontainers/dynamodb/DynaliteContainerTest.java +++ b/modules/dynalite/src/test/java/org/testcontainers/dynamodb/DynaliteContainerTest.java @@ -18,8 +18,10 @@ public class DynaliteContainerTest { + private static final DockerImageName DYNALITE_IMAGE = new DockerImageName("quay.io/testcontainers/dynalite:v1.2.1-1"); + @Rule - public DynaliteContainer dynamoDB = new DynaliteContainer(new DockerImageName("quay.io/testcontainers/dynalite:v1.2.1-1")); + public DynaliteContainer dynamoDB = new DynaliteContainer(DYNALITE_IMAGE); @Test public void simpleTestWithManualClientCreation() { diff --git a/modules/elasticsearch/src/test/java/org/testcontainers/elasticsearch/ElasticsearchContainerTest.java b/modules/elasticsearch/src/test/java/org/testcontainers/elasticsearch/ElasticsearchContainerTest.java index 9b4dced1fbb..707ed95d07e 100644 --- a/modules/elasticsearch/src/test/java/org/testcontainers/elasticsearch/ElasticsearchContainerTest.java +++ b/modules/elasticsearch/src/test/java/org/testcontainers/elasticsearch/ElasticsearchContainerTest.java @@ -34,6 +34,7 @@ public class ElasticsearchContainerTest { * Elasticsearch version which should be used for the Tests */ private static final String ELASTICSEARCH_VERSION = Version.CURRENT.toString(); + private static final DockerImageName ELASTICSEARCH_IMAGE = new DockerImageName("docker.elastic.co/elasticsearch/elasticsearch", ELASTICSEARCH_VERSION); /** * Elasticsearch default username, when secured with a license > basic @@ -80,7 +81,7 @@ public void elasticsearchDefaultTest() throws IOException { @Test public void elasticsearchVersion() throws IOException { - try (ElasticsearchContainer container = new ElasticsearchContainer(new DockerImageName("docker.elastic.co/elasticsearch/elasticsearch", ELASTICSEARCH_VERSION))) { + try (ElasticsearchContainer container = new ElasticsearchContainer(ELASTICSEARCH_IMAGE)) { container.start(); Response response = getClient(container).performRequest(new Request("GET", "/")); assertThat(response.getStatusLine().getStatusCode(), is(200)); diff --git a/modules/junit-jupiter/src/test/java/org/testcontainers/junit/jupiter/inheritance/RedisContainer.java b/modules/junit-jupiter/src/test/java/org/testcontainers/junit/jupiter/inheritance/RedisContainer.java index 177a48bb9d0..170b5eda2b6 100644 --- a/modules/junit-jupiter/src/test/java/org/testcontainers/junit/jupiter/inheritance/RedisContainer.java +++ b/modules/junit-jupiter/src/test/java/org/testcontainers/junit/jupiter/inheritance/RedisContainer.java @@ -1,16 +1,13 @@ package org.testcontainers.junit.jupiter.inheritance; import org.testcontainers.containers.GenericContainer; +import org.testcontainers.utility.DockerImageName; import redis.clients.jedis.Jedis; public class RedisContainer extends GenericContainer { public RedisContainer() { - this("redis:3.2.11"); - } - - public RedisContainer(String dockerImageName) { - super(dockerImageName); + super(new DockerImageName("redis:3.2.11")); withExposedPorts(6379); } diff --git a/modules/kafka/src/test/java/org/testcontainers/containers/KafkaContainerTest.java b/modules/kafka/src/test/java/org/testcontainers/containers/KafkaContainerTest.java index 0642ddeb353..f2aa8850128 100644 --- a/modules/kafka/src/test/java/org/testcontainers/containers/KafkaContainerTest.java +++ b/modules/kafka/src/test/java/org/testcontainers/containers/KafkaContainerTest.java @@ -12,6 +12,7 @@ import org.apache.kafka.common.serialization.StringSerializer; import org.junit.Test; import org.rnorth.ducttape.unreliables.Unreliables; +import org.testcontainers.utility.DockerImageName; import java.time.Duration; import java.util.Arrays; @@ -23,9 +24,12 @@ public class KafkaContainerTest { + private static final DockerImageName KAFKA_TEST_IMAGE = new DockerImageName("confluentinc/cp-kafka:5.2.1"); + private static final DockerImageName ZOOKEEPER_TEST_IMAGE = new DockerImageName("confluentinc/cp-zookeeper:4.0.0"); + @Test public void testUsage() throws Exception { - try (KafkaContainer kafka = new KafkaContainer(KafkaTestImages.KAFKA_TEST_IMAGE)) { + try (KafkaContainer kafka = new KafkaContainer(KAFKA_TEST_IMAGE)) { kafka.start(); testKafkaFunctionality(kafka.getBootstrapServers()); } @@ -41,7 +45,7 @@ public void testExternalZookeeperWithKafkaNetwork() throws Exception { KafkaContainer kafka = new KafkaContainer() .withExternalZookeeper("zookeeper:2181"); - GenericContainer zookeeper = new GenericContainer<>(KafkaTestImages.ZOOKEEPER_TEST_IMAGE) + GenericContainer zookeeper = new GenericContainer<>(ZOOKEEPER_TEST_IMAGE) .withNetwork(kafka.getNetwork()) .withNetworkAliases("zookeeper") .withEnv("ZOOKEEPER_CLIENT_PORT", "2181"); @@ -58,11 +62,11 @@ public void testExternalZookeeperWithExternalNetwork() throws Exception { try ( Network network = Network.newNetwork(); - KafkaContainer kafka = new KafkaContainer(KafkaTestImages.KAFKA_TEST_IMAGE) + KafkaContainer kafka = new KafkaContainer(KAFKA_TEST_IMAGE) .withNetwork(network) .withExternalZookeeper("zookeeper:2181"); - GenericContainer zookeeper = new GenericContainer<>(KafkaTestImages.ZOOKEEPER_TEST_IMAGE) + GenericContainer zookeeper = new GenericContainer<>(ZOOKEEPER_TEST_IMAGE) .withNetwork(network) .withNetworkAliases("zookeeper") .withEnv("ZOOKEEPER_CLIENT_PORT", "2181"); diff --git a/modules/kafka/src/test/java/org/testcontainers/containers/KafkaTestImages.java b/modules/kafka/src/test/java/org/testcontainers/containers/KafkaTestImages.java deleted file mode 100644 index c50bdc409ea..00000000000 --- a/modules/kafka/src/test/java/org/testcontainers/containers/KafkaTestImages.java +++ /dev/null @@ -1,8 +0,0 @@ -package org.testcontainers.containers; - -import org.testcontainers.utility.DockerImageName; - -public interface KafkaTestImages { - DockerImageName KAFKA_TEST_IMAGE = new DockerImageName("confluentinc/cp-kafka:5.2.1"); - DockerImageName ZOOKEEPER_TEST_IMAGE = new DockerImageName("confluentinc/cp-zookeeper:4.0.0"); -} diff --git a/modules/localstack/src/test/java/org/testcontainers/containers/localstack/LocalstackContainerTest.java b/modules/localstack/src/test/java/org/testcontainers/containers/localstack/LocalstackContainerTest.java index 595db1e98c7..8edfe510e48 100644 --- a/modules/localstack/src/test/java/org/testcontainers/containers/localstack/LocalstackContainerTest.java +++ b/modules/localstack/src/test/java/org/testcontainers/containers/localstack/LocalstackContainerTest.java @@ -29,6 +29,7 @@ import org.testcontainers.containers.Container; import org.testcontainers.containers.GenericContainer; import org.testcontainers.containers.Network; +import org.testcontainers.utility.DockerImageName; import software.amazon.awssdk.auth.credentials.AwsBasicCredentials; import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider; import software.amazon.awssdk.regions.Region; @@ -59,11 +60,14 @@ @RunWith(Enclosed.class) public class LocalstackContainerTest { + private static final DockerImageName LOCALSTACK_IMAGE = new DockerImageName("localstack/localstack:0.10.8"); + private static final DockerImageName AWS_CLI_IMAGE = new DockerImageName("atlassian/pipelines-awscli:1.16.302"); + public static class WithoutNetwork { // without_network { @ClassRule - public static LocalStackContainer localstack = new LocalStackContainer(LocalstackTestImages.LOCALSTACK_IMAGE) + public static LocalStackContainer localstack = new LocalStackContainer(LOCALSTACK_IMAGE) .withServices(S3, SQS, CLOUDWATCHLOGS, KMS); // } @@ -163,14 +167,14 @@ public static class WithNetwork { private static Network network = Network.newNetwork(); @ClassRule - public static LocalStackContainer localstackInDockerNetwork = new LocalStackContainer(LocalstackTestImages.LOCALSTACK_IMAGE) + public static LocalStackContainer localstackInDockerNetwork = new LocalStackContainer(LOCALSTACK_IMAGE) .withNetwork(network) .withNetworkAliases("notthis", "localstack") // the last alias is used for HOSTNAME_EXTERNAL .withServices(S3, SQS, CLOUDWATCHLOGS); // } @ClassRule - public static GenericContainer awsCliInDockerNetwork = new GenericContainer<>(LocalstackTestImages.AWS_CLI_IMAGE) + public static GenericContainer awsCliInDockerNetwork = new GenericContainer<>(AWS_CLI_IMAGE) .withNetwork(network) .withCreateContainerCmdModifier(cmd -> cmd.withEntrypoint("top")) .withEnv("AWS_ACCESS_KEY_ID", "accesskey") diff --git a/modules/localstack/src/test/java/org/testcontainers/containers/localstack/LocalstackTestImages.java b/modules/localstack/src/test/java/org/testcontainers/containers/localstack/LocalstackTestImages.java deleted file mode 100644 index d6e513c7bb8..00000000000 --- a/modules/localstack/src/test/java/org/testcontainers/containers/localstack/LocalstackTestImages.java +++ /dev/null @@ -1,8 +0,0 @@ -package org.testcontainers.containers.localstack; - -import org.testcontainers.utility.DockerImageName; - -public interface LocalstackTestImages { - DockerImageName LOCALSTACK_IMAGE = new DockerImageName("localstack/localstack:0.10.8"); - DockerImageName AWS_CLI_IMAGE = new DockerImageName("atlassian/pipelines-awscli:1.16.302"); -} diff --git a/modules/mariadb/src/test/java/org/testcontainers/junit/mariadb/SimpleMariaDBTest.java b/modules/mariadb/src/test/java/org/testcontainers/junit/mariadb/SimpleMariaDBTest.java index ec24937f079..4ea98bbe1fe 100644 --- a/modules/mariadb/src/test/java/org/testcontainers/junit/mariadb/SimpleMariaDBTest.java +++ b/modules/mariadb/src/test/java/org/testcontainers/junit/mariadb/SimpleMariaDBTest.java @@ -4,7 +4,6 @@ import org.junit.Test; import org.testcontainers.containers.MariaDBContainer; import org.testcontainers.db.AbstractContainerDatabaseTest; -import org.testcontainers.utility.DockerImageName; import java.sql.ResultSet; import java.sql.SQLException; @@ -34,7 +33,7 @@ public void testSimple() throws SQLException { @Test public void testSpecificVersion() throws SQLException { - try (MariaDBContainer mariadbOldVersion = new MariaDBContainer<>(new DockerImageName("mariadb:5.5.51"))) { + try (MariaDBContainer mariadbOldVersion = new MariaDBContainer<>(MARIADB_IMAGE.withTag("5.5.51"))) { mariadbOldVersion.start(); @@ -49,7 +48,7 @@ public void testSpecificVersion() throws SQLException { public void testMariaDBWithCustomIniFile() throws SQLException { assumeFalse(SystemUtils.IS_OS_WINDOWS); - try (MariaDBContainer mariadbCustomConfig = new MariaDBContainer<>(MARIADB_IMAGE) + try (MariaDBContainer mariadbCustomConfig = new MariaDBContainer<>(MARIADB_IMAGE.withTag("10.1.16")) .withConfigurationOverride("somepath/mariadb_conf_override")) { mariadbCustomConfig.start(); diff --git a/modules/mockserver/src/main/java/org/testcontainers/containers/MockServerContainer.java b/modules/mockserver/src/main/java/org/testcontainers/containers/MockServerContainer.java index e35370f4b27..4349b3e789b 100644 --- a/modules/mockserver/src/main/java/org/testcontainers/containers/MockServerContainer.java +++ b/modules/mockserver/src/main/java/org/testcontainers/containers/MockServerContainer.java @@ -1,6 +1,7 @@ package org.testcontainers.containers; import lombok.extern.slf4j.Slf4j; +import org.testcontainers.utility.DockerImageName; @Slf4j public class MockServerContainer extends GenericContainer { @@ -9,12 +10,18 @@ public class MockServerContainer extends GenericContainer { public static final int PORT = 1080; + @Deprecated public MockServerContainer() { this(VERSION); } + @Deprecated public MockServerContainer(String version) { - super("jamesdbloom/mockserver:mockserver-" + version); + this(new DockerImageName("jamesdbloom/mockserver:mockserver-" + version)); + } + + public MockServerContainer(DockerImageName dockerImageName) { + super(dockerImageName); withCommand("-logLevel INFO -serverPort " + PORT); addExposedPorts(PORT); } diff --git a/modules/mockserver/src/test/java/org/testcontainers/containers/MockServerContainerTest.java b/modules/mockserver/src/test/java/org/testcontainers/containers/MockServerContainerTest.java index 91f740b4bd8..55ca2ea9494 100644 --- a/modules/mockserver/src/test/java/org/testcontainers/containers/MockServerContainerTest.java +++ b/modules/mockserver/src/test/java/org/testcontainers/containers/MockServerContainerTest.java @@ -4,6 +4,7 @@ import org.junit.Rule; import org.junit.Test; import org.mockserver.client.MockServerClient; +import org.testcontainers.utility.DockerImageName; import java.io.BufferedReader; import java.io.IOException; @@ -19,9 +20,11 @@ public class MockServerContainerTest { + public static final DockerImageName MOCKSERVER_IMAGE = new DockerImageName("jamesdbloom/mockserver:mockserver-5.5.4"); + // creatingProxy { @Rule - public MockServerContainer mockServer = new MockServerContainer(); + public MockServerContainer mockServer = new MockServerContainer(MOCKSERVER_IMAGE); // } private static String responseFromMockserver(MockServerContainer mockServer, String path) throws IOException { @@ -52,7 +55,7 @@ public void shouldReturnExpectation() throws Exception { @Test public void shouldCallActualMockserverVersion() throws Exception { String actualVersion = MockServerClient.class.getPackage().getImplementationVersion(); - try (MockServerContainer mockServer = new MockServerContainer(actualVersion)) { + try (MockServerContainer mockServer = new MockServerContainer(MOCKSERVER_IMAGE.withTag("mockserver-" + actualVersion))) { mockServer.start(); String expectedBody = "Hello World!"; diff --git a/modules/mongodb/src/test/java/org/testcontainers/containers/MongoDBContainerTest.java b/modules/mongodb/src/test/java/org/testcontainers/containers/MongoDBContainerTest.java index ae602563f3e..5c65d2fef19 100644 --- a/modules/mongodb/src/test/java/org/testcontainers/containers/MongoDBContainerTest.java +++ b/modules/mongodb/src/test/java/org/testcontainers/containers/MongoDBContainerTest.java @@ -11,6 +11,7 @@ import com.mongodb.client.TransactionBody; import org.bson.Document; import org.junit.Test; +import org.testcontainers.utility.DockerImageName; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; @@ -18,6 +19,8 @@ public class MongoDBContainerTest { + private static final DockerImageName MONGO_IMAGE = new DockerImageName("mongo:4.0.10"); + /** * Taken from https://docs.mongodb.com */ @@ -25,7 +28,7 @@ public class MongoDBContainerTest { public void shouldExecuteTransactions() { try ( // creatingMongoDBContainer { - final MongoDBContainer mongoDBContainer = new MongoDBContainer(MongoTestImages.MONGO_IMAGE_NAME) + final MongoDBContainer mongoDBContainer = new MongoDBContainer(MONGO_IMAGE) // } ) { diff --git a/modules/mongodb/src/test/java/org/testcontainers/containers/MongoTestImages.java b/modules/mongodb/src/test/java/org/testcontainers/containers/MongoTestImages.java deleted file mode 100644 index 2327b3200b6..00000000000 --- a/modules/mongodb/src/test/java/org/testcontainers/containers/MongoTestImages.java +++ /dev/null @@ -1,7 +0,0 @@ -package org.testcontainers.containers; - -import org.testcontainers.utility.DockerImageName; - -public interface MongoTestImages { - DockerImageName MONGO_IMAGE_NAME = new DockerImageName("mongo:4.0.10"); -} diff --git a/modules/mysql/src/test/java/org/testcontainers/junit/mysql/MultiVersionMySQLTest.java b/modules/mysql/src/test/java/org/testcontainers/junit/mysql/MultiVersionMySQLTest.java index 3c0c86ffafa..b8f1a136d9a 100644 --- a/modules/mysql/src/test/java/org/testcontainers/junit/mysql/MultiVersionMySQLTest.java +++ b/modules/mysql/src/test/java/org/testcontainers/junit/mysql/MultiVersionMySQLTest.java @@ -3,8 +3,10 @@ import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; +import org.testcontainers.MySQLTestImages; import org.testcontainers.containers.MySQLContainer; import org.testcontainers.db.AbstractContainerDatabaseTest; +import org.testcontainers.utility.DockerImageName; import java.sql.ResultSet; import java.sql.SQLException; @@ -27,7 +29,10 @@ public MultiVersionMySQLTest(String version) { @Test public void versionCheckTest() throws SQLException { - try (MySQLContainer mysql = new MySQLContainer<>("mysql:" + version)) { + + final DockerImageName dockerImageName = MySQLTestImages.MYSQL_IMAGE.withTag(version); + + try (MySQLContainer mysql = new MySQLContainer<>(dockerImageName)) { mysql.start(); final ResultSet resultSet = performQuery(mysql, "SELECT VERSION()"); final String resultSetString = resultSet.getString(1); diff --git a/modules/neo4j/src/main/java/org/testcontainers/containers/Neo4jContainer.java b/modules/neo4j/src/main/java/org/testcontainers/containers/Neo4jContainer.java index 44bce6eea32..e7f87430e0d 100644 --- a/modules/neo4j/src/main/java/org/testcontainers/containers/Neo4jContainer.java +++ b/modules/neo4j/src/main/java/org/testcontainers/containers/Neo4jContainer.java @@ -59,7 +59,7 @@ public class Neo4jContainer> extends GenericContaine private String adminPassword = DEFAULT_ADMIN_PASSWORD; - private boolean defaultImage = false; + private boolean standardImage = false; /** * Creates a Testcontainer using the official Neo4j docker image. @@ -67,8 +67,6 @@ public class Neo4jContainer> extends GenericContaine @Deprecated public Neo4jContainer() { this(DOCKER_IMAGE_NAME); - - this.defaultImage = true; } /** @@ -96,6 +94,10 @@ public Neo4jContainer(final DockerImageName dockerImageName) { .withStartupTimeout(Duration.ofMinutes(2)); addExposedPorts(DEFAULT_BOLT_PORT, DEFAULT_HTTP_PORT, DEFAULT_HTTPS_PORT); + + if (dockerImageName.getUnversionedPart().equals(DEFAULT_IMAGE_NAME)) { + this.standardImage = true; + } } @Override @@ -146,7 +148,7 @@ public String getHttpsUrl() { */ public S withEnterpriseEdition() { - if (!defaultImage) { + if (!standardImage) { throw new IllegalStateException( String.format("Cannot use enterprise version with alternative image %s.", getDockerImageName())); } diff --git a/modules/orientdb/src/test/java/org/testcontainers/containers/OrientDBContainerTest.java b/modules/orientdb/src/test/java/org/testcontainers/containers/OrientDBContainerTest.java index 67bf67a7471..e029f491a68 100644 --- a/modules/orientdb/src/test/java/org/testcontainers/containers/OrientDBContainerTest.java +++ b/modules/orientdb/src/test/java/org/testcontainers/containers/OrientDBContainerTest.java @@ -11,7 +11,7 @@ */ public class OrientDBContainerTest { - public static final DockerImageName ORIENTDB_IMAGE = new DockerImageName("orientdb:3.0.24-tp3"); + private static final DockerImageName ORIENTDB_IMAGE = new DockerImageName("orientdb:3.0.24-tp3"); @Test public void shouldReturnTheSameSession() { diff --git a/modules/postgresql/src/test/java/org/testcontainers/PostgreSQLTestImages.java b/modules/postgresql/src/test/java/org/testcontainers/PostgreSQLTestImages.java index 2fac41ed7e8..929df0dfb01 100644 --- a/modules/postgresql/src/test/java/org/testcontainers/PostgreSQLTestImages.java +++ b/modules/postgresql/src/test/java/org/testcontainers/PostgreSQLTestImages.java @@ -2,6 +2,6 @@ import org.testcontainers.utility.DockerImageName; -public class PostgreSQLTestImages { - public static final DockerImageName POSTGRES_TEST_IMAGE = new DockerImageName("postgres:9.6.12"); +public interface PostgreSQLTestImages { + DockerImageName POSTGRES_TEST_IMAGE = new DockerImageName("postgres:9.6.12"); } diff --git a/modules/postgresql/src/test/java/org/testcontainers/containers/PostgreSQLConnectionURLTest.java b/modules/postgresql/src/test/java/org/testcontainers/containers/PostgreSQLConnectionURLTest.java index c0ba7e40d44..c18f19a109e 100644 --- a/modules/postgresql/src/test/java/org/testcontainers/containers/PostgreSQLConnectionURLTest.java +++ b/modules/postgresql/src/test/java/org/testcontainers/containers/PostgreSQLConnectionURLTest.java @@ -1,6 +1,7 @@ package org.testcontainers.containers; import org.junit.Test; +import org.testcontainers.PostgreSQLTestImages; import static org.rnorth.visibleassertions.VisibleAssertions.assertEquals; import static org.rnorth.visibleassertions.VisibleAssertions.assertFalse; @@ -46,6 +47,9 @@ public void shouldRejectInvalidQueryString() { } static class FixedJdbcUrlPostgreSQLContainer extends PostgreSQLContainer { + public FixedJdbcUrlPostgreSQLContainer() { + super(PostgreSQLTestImages.POSTGRES_TEST_IMAGE); + } @Override public String getHost() { @@ -59,6 +63,9 @@ public Integer getMappedPort(int originalPort) { } static class NoParamsUrlPostgreSQLContainer extends PostgreSQLContainer { + public NoParamsUrlPostgreSQLContainer() { + super(PostgreSQLTestImages.POSTGRES_TEST_IMAGE); + } @Override public String getJdbcUrl() { diff --git a/modules/presto/src/test/java/org/testcontainers/PrestoTestImages.java b/modules/presto/src/test/java/org/testcontainers/PrestoTestImages.java new file mode 100644 index 00000000000..74c1bee6a46 --- /dev/null +++ b/modules/presto/src/test/java/org/testcontainers/PrestoTestImages.java @@ -0,0 +1,8 @@ +package org.testcontainers; + +import org.testcontainers.utility.DockerImageName; + +public interface PrestoTestImages { + DockerImageName PRESTO_TEST_IMAGE = new DockerImageName("prestosql/presto:329"); + DockerImageName PRESTO_PREVIOUS_VERSION_TEST_IMAGE = new DockerImageName("prestosql/presto:328"); +} diff --git a/modules/presto/src/test/java/org/testcontainers/containers/PrestoContainerTest.java b/modules/presto/src/test/java/org/testcontainers/containers/PrestoContainerTest.java index 07fb6fa30ed..d5a4d9587a6 100644 --- a/modules/presto/src/test/java/org/testcontainers/containers/PrestoContainerTest.java +++ b/modules/presto/src/test/java/org/testcontainers/containers/PrestoContainerTest.java @@ -2,6 +2,8 @@ import org.junit.Assert; import org.junit.Test; +import org.testcontainers.PrestoTestImages; +import org.testcontainers.utility.DockerImageName; import java.sql.Connection; import java.sql.DriverManager; @@ -22,9 +24,10 @@ * @author findepi */ public class PrestoContainerTest { + @Test public void testSimple() throws Exception { - try (PrestoContainer prestoSql = new PrestoContainer<>()) { + try (PrestoContainer prestoSql = new PrestoContainer<>(PrestoTestImages.PRESTO_TEST_IMAGE)) { prestoSql.start(); try (Connection connection = prestoSql.createConnection(); Statement statement = connection.createStatement(); @@ -37,21 +40,20 @@ public void testSimple() throws Exception { @Test public void testSpecificVersion() throws Exception { - String prestoVersion = Integer.toString(parseInt(PrestoContainer.DEFAULT_TAG) - 1); - try (PrestoContainer prestoSql = new PrestoContainer<>("prestosql/presto:" + prestoVersion)) { + try (PrestoContainer prestoSql = new PrestoContainer<>(PrestoTestImages.PRESTO_PREVIOUS_VERSION_TEST_IMAGE)) { prestoSql.start(); try (Connection connection = prestoSql.createConnection(); Statement statement = connection.createStatement(); ResultSet resultSet = statement.executeQuery("SELECT DISTINCT node_version FROM system.runtime.nodes")) { assertTrue("No result", resultSet.next()); - assertEquals("Presto version", prestoVersion, resultSet.getString("node_version")); + assertEquals("Presto version", PrestoTestImages.PRESTO_PREVIOUS_VERSION_TEST_IMAGE.getVersionPart(), resultSet.getString("node_version")); } } } @Test public void testQueryMemoryAndTpch() throws SQLException { - try (PrestoContainer prestoSql = new PrestoContainer<>()) { + try (PrestoContainer prestoSql = new PrestoContainer<>(PrestoTestImages.PRESTO_TEST_IMAGE)) { prestoSql.start(); try (Connection connection = prestoSql.createConnection(); Statement statement = connection.createStatement()) { @@ -77,7 +79,7 @@ public void testQueryMemoryAndTpch() throws SQLException { @Test public void testInitScript() throws Exception { - try (PrestoContainer prestoSql = new PrestoContainer<>()) { + try (PrestoContainer prestoSql = new PrestoContainer<>(PrestoTestImages.PRESTO_TEST_IMAGE)) { prestoSql.withInitScript("initial.sql"); prestoSql.start(); try (Connection connection = prestoSql.createConnection(); diff --git a/modules/pulsar/src/test/java/org/testcontainers/containers/PulsarContainerTest.java b/modules/pulsar/src/test/java/org/testcontainers/containers/PulsarContainerTest.java index cacf79729e0..22f8cd1c35b 100644 --- a/modules/pulsar/src/test/java/org/testcontainers/containers/PulsarContainerTest.java +++ b/modules/pulsar/src/test/java/org/testcontainers/containers/PulsarContainerTest.java @@ -5,6 +5,7 @@ import org.apache.pulsar.client.api.Producer; import org.apache.pulsar.client.api.PulsarClient; import org.junit.Test; +import org.testcontainers.utility.DockerImageName; import java.util.concurrent.CompletableFuture; import java.util.concurrent.TimeUnit; @@ -14,10 +15,11 @@ public class PulsarContainerTest { public static final String TEST_TOPIC = "test_topic"; + private static final DockerImageName PULSAR_IMAGE = new DockerImageName("apachepulsar/pulsar:2.2.0"); @Test public void testUsage() throws Exception { - try (PulsarContainer pulsar = new PulsarContainer()) { + try (PulsarContainer pulsar = new PulsarContainer(PULSAR_IMAGE)) { pulsar.start(); testPulsarFunctionality(pulsar.getPulsarBrokerUrl()); } diff --git a/modules/rabbitmq/src/test/java/org/testcontainers/containers/RabbitMQContainerJUnitIntegrationTest.java b/modules/rabbitmq/src/test/java/org/testcontainers/containers/RabbitMQContainerJUnitIntegrationTest.java index ff71db44348..7473f470f6f 100644 --- a/modules/rabbitmq/src/test/java/org/testcontainers/containers/RabbitMQContainerJUnitIntegrationTest.java +++ b/modules/rabbitmq/src/test/java/org/testcontainers/containers/RabbitMQContainerJUnitIntegrationTest.java @@ -13,7 +13,7 @@ public class RabbitMQContainerJUnitIntegrationTest { @ClassRule - public static RabbitMQContainer rabbitMQContainer = new RabbitMQContainer(); + public static RabbitMQContainer rabbitMQContainer = new RabbitMQContainer(RabbitMQTestImages.RABBITMQ_IMAGE); @Test public void shouldStart() { diff --git a/modules/rabbitmq/src/test/java/org/testcontainers/containers/RabbitMQContainerTest.java b/modules/rabbitmq/src/test/java/org/testcontainers/containers/RabbitMQContainerTest.java index d8e9c7658c0..9ed83ce3960 100644 --- a/modules/rabbitmq/src/test/java/org/testcontainers/containers/RabbitMQContainerTest.java +++ b/modules/rabbitmq/src/test/java/org/testcontainers/containers/RabbitMQContainerTest.java @@ -1,15 +1,16 @@ package org.testcontainers.containers; -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatCode; -import static org.testcontainers.containers.RabbitMQContainer.SslVerification.VERIFY_PEER; -import static org.testcontainers.utility.MountableFile.forClasspathResource; - import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; import com.rabbitmq.client.Channel; import com.rabbitmq.client.Connection; import com.rabbitmq.client.ConnectionFactory; +import org.junit.Test; +import org.testcontainers.utility.MountableFile; + +import javax.net.ssl.KeyManagerFactory; +import javax.net.ssl.SSLContext; +import javax.net.ssl.TrustManagerFactory; import java.io.File; import java.io.FileInputStream; import java.io.IOException; @@ -20,18 +21,17 @@ import java.security.UnrecoverableKeyException; import java.security.cert.CertificateException; import java.util.Collections; -import javax.net.ssl.KeyManagerFactory; -import javax.net.ssl.SSLContext; -import javax.net.ssl.TrustManagerFactory; -import org.junit.Test; -import org.testcontainers.utility.MountableFile; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatCode; +import static org.testcontainers.containers.RabbitMQContainer.SslVerification.VERIFY_PEER; +import static org.testcontainers.utility.MountableFile.forClasspathResource; /** * @author Martin Greber */ public class RabbitMQContainerTest { - public static final String DEFAULT_IMAGE = "rabbitmq:3.7.25-management-alpine"; public static final int DEFAULT_AMQPS_PORT = 5671; public static final int DEFAULT_AMQP_PORT = 5672; public static final int DEFAULT_HTTPS_PORT = 15671; @@ -40,9 +40,8 @@ public class RabbitMQContainerTest { @Test public void shouldCreateRabbitMQContainer() { - try (RabbitMQContainer container = new RabbitMQContainer()) { + try (RabbitMQContainer container = new RabbitMQContainer(RabbitMQTestImages.RABBITMQ_IMAGE)) { - assertThat(container.getDockerImageName()).isEqualTo(DEFAULT_IMAGE); assertThat(container.getAdminPassword()).isEqualTo("guest"); assertThat(container.getAdminUsername()).isEqualTo("guest"); @@ -71,18 +70,10 @@ public void shouldCreateRabbitMQContainer() } } - @Test - public void shouldCreateRabbitMQContainerWithTag() - { - try (RabbitMQContainer container = new RabbitMQContainer(DEFAULT_IMAGE)) { - assertThat(container.getDockerImageName()).isEqualTo(DEFAULT_IMAGE); - } - } - @Test public void shouldCreateRabbitMQContainerWithExchange() throws IOException, InterruptedException { - try (RabbitMQContainer container = new RabbitMQContainer()) { + try (RabbitMQContainer container = new RabbitMQContainer(RabbitMQTestImages.RABBITMQ_IMAGE)) { container.withExchange("test-exchange", "direct"); container.start(); @@ -95,7 +86,7 @@ public void shouldCreateRabbitMQContainerWithExchange() throws IOException, Inte @Test public void shouldCreateRabbitMQContainerWithExchangeInVhost() throws IOException, InterruptedException { - try (RabbitMQContainer container = new RabbitMQContainer()) { + try (RabbitMQContainer container = new RabbitMQContainer(RabbitMQTestImages.RABBITMQ_IMAGE)) { container.withVhost("test-vhost"); container.withExchange("test-vhost", "test-exchange", "direct", false, false, false, Collections.emptyMap()); @@ -109,7 +100,7 @@ public void shouldCreateRabbitMQContainerWithExchangeInVhost() throws IOExceptio @Test public void shouldCreateRabbitMQContainerWithQueues() throws IOException, InterruptedException { - try (RabbitMQContainer container = new RabbitMQContainer()) { + try (RabbitMQContainer container = new RabbitMQContainer(RabbitMQTestImages.RABBITMQ_IMAGE)) { container.withQueue("queue-one") .withQueue("queue-two", false, true, ImmutableMap.of("x-message-ttl", 1000)); @@ -126,7 +117,7 @@ public void shouldCreateRabbitMQContainerWithQueues() throws IOException, Interr @Test public void shouldMountConfigurationFile() { - try (RabbitMQContainer container = new RabbitMQContainer()) { + try (RabbitMQContainer container = new RabbitMQContainer(RabbitMQTestImages.RABBITMQ_IMAGE)) { container.withRabbitMQConfig(MountableFile.forClasspathResource("/rabbitmq-custom.conf")); container.start(); @@ -140,7 +131,7 @@ public void shouldMountConfigurationFile() @Test public void shouldMountConfigurationFileErlang() { - try (RabbitMQContainer container = new RabbitMQContainer()) { + try (RabbitMQContainer container = new RabbitMQContainer(RabbitMQTestImages.RABBITMQ_IMAGE)) { container.withRabbitMQConfigErlang(MountableFile.forClasspathResource("/rabbitmq-custom.config")); container.start(); @@ -154,7 +145,7 @@ public void shouldMountConfigurationFileErlang() @Test public void shouldMountConfigurationFileSysctl() { - try (RabbitMQContainer container = new RabbitMQContainer()) { + try (RabbitMQContainer container = new RabbitMQContainer(RabbitMQTestImages.RABBITMQ_IMAGE)) { container.withRabbitMQConfig(MountableFile.forClasspathResource("/rabbitmq-custom.conf")); container.start(); @@ -167,7 +158,7 @@ public void shouldMountConfigurationFileSysctl() @Test public void shouldStartTheWholeEnchilada() throws IOException, InterruptedException { - try (RabbitMQContainer container = new RabbitMQContainer()) { + try (RabbitMQContainer container = new RabbitMQContainer(RabbitMQTestImages.RABBITMQ_IMAGE)) { container .withVhost("vhost1") .withVhostLimit("vhost1", "max-connections", 1) @@ -229,7 +220,7 @@ public void shouldStartTheWholeEnchilada() throws IOException, InterruptedExcept @Test public void shouldThrowExceptionForDodgyJson() { - try (RabbitMQContainer container = new RabbitMQContainer()) { + try (RabbitMQContainer container = new RabbitMQContainer(RabbitMQTestImages.RABBITMQ_IMAGE)) { assertThatCode(() -> container.withQueue( @@ -245,7 +236,7 @@ public void shouldThrowExceptionForDodgyJson() @Test public void shouldWorkWithSSL() { - try (RabbitMQContainer container = new RabbitMQContainer()) { + try (RabbitMQContainer container = new RabbitMQContainer(RabbitMQTestImages.RABBITMQ_IMAGE)) { container.withSSL( forClasspathResource("/certs/server_key.pem", 0644), forClasspathResource("/certs/server_certificate.pem", 0644), diff --git a/modules/rabbitmq/src/test/java/org/testcontainers/containers/RabbitMQTestImages.java b/modules/rabbitmq/src/test/java/org/testcontainers/containers/RabbitMQTestImages.java new file mode 100644 index 00000000000..e8280b63429 --- /dev/null +++ b/modules/rabbitmq/src/test/java/org/testcontainers/containers/RabbitMQTestImages.java @@ -0,0 +1,7 @@ +package org.testcontainers.containers; + +import org.testcontainers.utility.DockerImageName; + +public interface RabbitMQTestImages { + DockerImageName RABBITMQ_IMAGE = new DockerImageName("rabbitmq:3.7.25-management-alpine"); +} diff --git a/modules/solr/src/test/java/org/testcontainers/containers/SolrContainerTest.java b/modules/solr/src/test/java/org/testcontainers/containers/SolrContainerTest.java index 51790324a94..66a25115105 100644 --- a/modules/solr/src/test/java/org/testcontainers/containers/SolrContainerTest.java +++ b/modules/solr/src/test/java/org/testcontainers/containers/SolrContainerTest.java @@ -20,7 +20,6 @@ public class SolrContainerTest { private static final DockerImageName SOLR_IMAGE = new DockerImageName("solr:8.3.0"); - private SolrClient client = null; @After diff --git a/modules/spock/src/test/groovy/org/testcontainers/spock/MySqlContainerIT.groovy b/modules/spock/src/test/groovy/org/testcontainers/spock/MySqlContainerIT.groovy index 7a68302289f..639b46f5886 100644 --- a/modules/spock/src/test/groovy/org/testcontainers/spock/MySqlContainerIT.groovy +++ b/modules/spock/src/test/groovy/org/testcontainers/spock/MySqlContainerIT.groovy @@ -15,7 +15,7 @@ import spock.lang.Specification class MySqlContainerIT extends Specification { @Shared - MySQLContainer mySQLContainer = new MySQLContainer() + MySQLContainer mySQLContainer = new MySQLContainer(SpockTestImages.MYSQL_IMAGE) def "dummy test"() { expect: diff --git a/modules/spock/src/test/groovy/org/testcontainers/spock/PostgresContainerIT.groovy b/modules/spock/src/test/groovy/org/testcontainers/spock/PostgresContainerIT.groovy index 4ac095bed6f..a886d552732 100644 --- a/modules/spock/src/test/groovy/org/testcontainers/spock/PostgresContainerIT.groovy +++ b/modules/spock/src/test/groovy/org/testcontainers/spock/PostgresContainerIT.groovy @@ -14,7 +14,7 @@ import java.sql.Statement class PostgresContainerIT extends Specification { @Shared - PostgreSQLContainer postgreSQLContainer = new PostgreSQLContainer() + PostgreSQLContainer postgreSQLContainer = new PostgreSQLContainer(SpockTestImages.POSTGRES_TEST_IMAGE) .withDatabaseName("foo") .withUsername("foo") .withPassword("secret") diff --git a/modules/spock/src/test/groovy/org/testcontainers/spock/SpockTestImages.groovy b/modules/spock/src/test/groovy/org/testcontainers/spock/SpockTestImages.groovy new file mode 100644 index 00000000000..a307a3beb86 --- /dev/null +++ b/modules/spock/src/test/groovy/org/testcontainers/spock/SpockTestImages.groovy @@ -0,0 +1,11 @@ +package org.testcontainers.spock; + +import org.testcontainers.utility.DockerImageName +import org.testcontainers.utility.TestcontainersConfiguration; + +interface SpockTestImages { + DockerImageName MYSQL_IMAGE = new DockerImageName("mysql:5.7.22") + DockerImageName POSTGRES_TEST_IMAGE = new DockerImageName("postgres:9.6.12") + DockerImageName HTTPD_IMAGE = new DockerImageName("httpd:2.4-alpine") + DockerImageName TINY_IMAGE = TestcontainersConfiguration.getInstance().getTinyDockerImageName() +} diff --git a/modules/spock/src/test/groovy/org/testcontainers/spock/TestHierarchyIT.groovy b/modules/spock/src/test/groovy/org/testcontainers/spock/TestHierarchyIT.groovy index 123828327bc..7fb37446ca5 100644 --- a/modules/spock/src/test/groovy/org/testcontainers/spock/TestHierarchyIT.groovy +++ b/modules/spock/src/test/groovy/org/testcontainers/spock/TestHierarchyIT.groovy @@ -10,7 +10,7 @@ import spock.lang.Shared class TestHierarchyIT extends MySqlContainerIT { @Shared - PostgreSQLContainer postgreSQLContainer = new PostgreSQLContainer() + PostgreSQLContainer postgreSQLContainer = new PostgreSQLContainer(SpockTestImages.POSTGRES_TEST_IMAGE) .withDatabaseName("foo") .withUsername("foo") .withPassword("secret") diff --git a/modules/spock/src/test/groovy/org/testcontainers/spock/TestLifecycleAwareContainerMock.java b/modules/spock/src/test/groovy/org/testcontainers/spock/TestLifecycleAwareContainerMock.java index 43be6d32ca4..eb628fd2f33 100644 --- a/modules/spock/src/test/groovy/org/testcontainers/spock/TestLifecycleAwareContainerMock.java +++ b/modules/spock/src/test/groovy/org/testcontainers/spock/TestLifecycleAwareContainerMock.java @@ -8,6 +8,8 @@ import java.util.List; import java.util.Optional; +import static org.testcontainers.spock.SpockTestImages.TINY_IMAGE; + public class TestLifecycleAwareContainerMock extends GenericContainer implements TestLifecycleAware { static final String BEFORE_TEST = "beforeTest"; @@ -18,6 +20,10 @@ public class TestLifecycleAwareContainerMock extends GenericContainer redis = new GenericContainer<>(ToxiproxyTestImages.REDIS_IMAGE) + public GenericContainer redis = new GenericContainer<>(REDIS_IMAGE) .withExposedPorts(6379) .withNetwork(network); + private static final DockerImageName TOXIPROXY_IMAGE = new DockerImageName("shopify/toxiproxy:2.1.0"); // Toxiproxy container, which will be used as a TCP proxy @Rule - public ToxiproxyContainer toxiproxy = new ToxiproxyContainer(ToxiproxyTestImages.TOXIPROXY_IMAGE) + public ToxiproxyContainer toxiproxy = new ToxiproxyContainer(TOXIPROXY_IMAGE) .withNetwork(network) .withNetworkAliases(TOXIPROXY_NETWORK_ALIAS); // } @@ -102,7 +104,7 @@ public void testConnectionCut() { @Test public void testMultipleProxiesCanBeCreated() { - try (GenericContainer secondRedis = new GenericContainer<>(ToxiproxyTestImages.REDIS_IMAGE) + try (GenericContainer secondRedis = new GenericContainer<>(REDIS_IMAGE) .withExposedPorts(6379) .withNetwork(network)) { From 296f9f7a90a03b173fa24a1b2a57cd973d80b995 Mon Sep 17 00:00:00 2001 From: Richard North Date: Thu, 2 Jul 2020 15:31:37 +0100 Subject: [PATCH 06/17] Update docs re contrainer creation and specifying versions --- .../test/java/generic/ContainerCreationTest.java | 14 ++++++++++---- docs/features/creating_container.md | 16 +++++++++++++++- 2 files changed, 25 insertions(+), 5 deletions(-) diff --git a/docs/examples/junit4/generic/src/test/java/generic/ContainerCreationTest.java b/docs/examples/junit4/generic/src/test/java/generic/ContainerCreationTest.java index 658d28e025f..934a7728734 100644 --- a/docs/examples/junit4/generic/src/test/java/generic/ContainerCreationTest.java +++ b/docs/examples/junit4/generic/src/test/java/generic/ContainerCreationTest.java @@ -9,20 +9,26 @@ public class ContainerCreationTest { + // simple { + public static final DockerImageName REDIS_IMAGE = new DockerImageName("redis:3.0.2"); + // } + // simple { @ClassRule - public static GenericContainer redis = - new GenericContainer(new DockerImageName("redis:3.0.2")) + public static GenericContainer redis = + new GenericContainer<>(REDIS_IMAGE) .withExposedPorts(6379); // } + public static final DockerImageName ALPINE_IMAGE = new DockerImageName("alpine:3.2"); + // withOptions { // Set up a plain OS container and customize environment, // command and exposed ports. This just listens on port 80 // and always returns '42' @ClassRule - public static GenericContainer alpine = - new GenericContainer(new DockerImageName("alpine:3.2")) + public static GenericContainer alpine = + new GenericContainer<>(ALPINE_IMAGE) .withExposedPorts(80) .withEnv("MAGIC_NUMBER", "42") .withCommand("/bin/sh", "-c", diff --git a/docs/features/creating_container.md b/docs/features/creating_container.md index e92f20e71cd..85d799f0fef 100644 --- a/docs/features/creating_container.md +++ b/docs/features/creating_container.md @@ -12,9 +12,23 @@ images as temporary test dependencies. For example, if you might use it to test With a generic container, you set the container image using a parameter to the rule constructor, e.g.: ```java -new GenericContainer("jboss/wildfly:9.0.1.Final") +new GenericContainer(new DockerImageName("jboss/wildfly:9.0.1.Final")) ``` +### Specifying an image + +Many Container classes in Testcontainers have historically supported: + +* a no-args constructor - for example `new GenericContainer()` and `new ElasticsearchContainer()`. With these constructors, Testcontainers has traditionally used a default image name (including a fixed image tag/version). This has caused a conflict between the need to keep the defaults sane (i.e. up to date) and the need to avoid silently upgrading these dependencies along with new versions of Testcontainers. +* a single string-argument constructor, which has taken either a version or an image name as a String. This has caused some ambiguity and confusion. + +Since v1.15.0, both of these constructor types have been deprecated, for the reasons given above. + +Instead, it is highly recommended that _all containers_ be constructed using a constructor that accepts a `DockerImageName` object. +The `DockerImageName` class is an unambiguous reference to a docker image. + +It is suggested that developers treat `DockerImageName`s as you would any other potentially-constant value - consider defining a constant in your test codebase that matches the production version of the dependency you are using. + ### Examples A generic container rule can be used with any public docker image; for example: From aa94289f1b3d69548a39c818329e7cb368d1754f Mon Sep 17 00:00:00 2001 From: Richard North Date: Thu, 2 Jul 2020 15:49:33 +0100 Subject: [PATCH 07/17] Update Javadocs with deprecation warnings. --- .../containers/FixedHostPortGenericContainer.java | 4 ++++ .../testcontainers/containers/GenericContainer.java | 8 ++++++-- .../testcontainers/containers/SocatContainer.java | 3 +++ .../testcontainers/containers/MongoDbContainer.java | 5 +++++ .../containers/ClickHouseContainer.java | 6 ++++++ .../containers/CockroachContainer.java | 6 ++++++ .../testcontainers/couchbase/CouchbaseContainer.java | 6 ++++++ .../org/testcontainers/containers/Db2Container.java | 6 ++++++ .../testcontainers/dynamodb/DynaliteContainer.java | 6 ++++++ .../elasticsearch/ElasticsearchContainer.java | 4 ++++ .../testcontainers/containers/InfluxDBContainer.java | 7 ++++++- .../containers/JdbcDatabaseContainer.java | 3 +++ .../testcontainers/containers/KafkaContainer.java | 6 ++++++ .../containers/localstack/LocalStackContainer.java | 6 ++++++ .../testcontainers/containers/MariaDBContainer.java | 6 ++++++ .../containers/MockServerContainer.java | 6 ++++++ .../testcontainers/containers/MongoDBContainer.java | 8 +++++++- .../containers/MSSQLServerContainer.java | 6 ++++++ .../testcontainers/containers/MySQLContainer.java | 6 ++++++ .../testcontainers/containers/Neo4jContainer.java | 2 ++ .../testcontainers/containers/NginxContainer.java | 6 ++++++ .../testcontainers/containers/OracleContainer.java | 6 ++++++ .../testcontainers/containers/OrientDBContainer.java | 6 ++++++ .../containers/PostgreSQLContainer.java | 6 ++++++ .../testcontainers/containers/PrestoContainer.java | 6 ++++++ .../testcontainers/containers/PulsarContainer.java | 6 ++++++ .../testcontainers/containers/RabbitMQContainer.java | 2 ++ .../containers/BrowserWebDriverContainer.java | 12 ++++++++++++ .../org/testcontainers/containers/SolrContainer.java | 6 ++++++ .../containers/ToxiproxyContainer.java | 6 ++++++ .../org/testcontainers/vault/VaultContainer.java | 6 ++++++ 31 files changed, 174 insertions(+), 4 deletions(-) diff --git a/core/src/main/java/org/testcontainers/containers/FixedHostPortGenericContainer.java b/core/src/main/java/org/testcontainers/containers/FixedHostPortGenericContainer.java index d679023f342..6477c28042e 100644 --- a/core/src/main/java/org/testcontainers/containers/FixedHostPortGenericContainer.java +++ b/core/src/main/java/org/testcontainers/containers/FixedHostPortGenericContainer.java @@ -12,6 +12,10 @@ * not available - which could manifest as flaky or unstable tests.

*/ public class FixedHostPortGenericContainer> extends GenericContainer { + + /** + * @deprecated it is highly recommended that {@link FixedHostPortGenericContainer} not be used, as it risks port conflicts. + */ @Deprecated public FixedHostPortGenericContainer(@NotNull String dockerImageName) { super(dockerImageName); diff --git a/core/src/main/java/org/testcontainers/containers/GenericContainer.java b/core/src/main/java/org/testcontainers/containers/GenericContainer.java index 8d31542d0eb..2e3e1443869 100644 --- a/core/src/main/java/org/testcontainers/containers/GenericContainer.java +++ b/core/src/main/java/org/testcontainers/containers/GenericContainer.java @@ -12,7 +12,6 @@ import com.github.dockerjava.api.model.ContainerNetwork; import com.github.dockerjava.api.model.ExposedPort; import com.github.dockerjava.api.model.HostConfig; -import com.github.dockerjava.api.model.Info; import com.github.dockerjava.api.model.Link; import com.github.dockerjava.api.model.PortBinding; import com.github.dockerjava.api.model.Volume; @@ -234,12 +233,17 @@ public GenericContainer(@NonNull final RemoteDockerImage image) { this.image = image; } - + /** + * @deprecated use {@link GenericContainer(DockerImageName)} instead + */ @Deprecated public GenericContainer() { this(TestcontainersConfiguration.getInstance().getTinyImage()); } + /** + * @deprecated use {@link GenericContainer(DockerImageName)} instead + */ @Deprecated public GenericContainer(@NonNull final String dockerImageName) { this.setDockerImageName(dockerImageName); diff --git a/core/src/main/java/org/testcontainers/containers/SocatContainer.java b/core/src/main/java/org/testcontainers/containers/SocatContainer.java index bcf2b1670fd..7263ac6562a 100644 --- a/core/src/main/java/org/testcontainers/containers/SocatContainer.java +++ b/core/src/main/java/org/testcontainers/containers/SocatContainer.java @@ -16,6 +16,9 @@ public class SocatContainer extends GenericContainer { private final Map targets = new HashMap<>(); + /** + * @deprecated use {@link SocatContainer(DockerImageName)} instead + */ @Deprecated public SocatContainer() { this(new DockerImageName(TestcontainersConfiguration.getInstance().getSocatContainerImage())); diff --git a/examples/mongodb-container/src/test/java/org/testcontainers/containers/MongoDbContainer.java b/examples/mongodb-container/src/test/java/org/testcontainers/containers/MongoDbContainer.java index ee272f7c963..7341c9771d8 100644 --- a/examples/mongodb-container/src/test/java/org/testcontainers/containers/MongoDbContainer.java +++ b/examples/mongodb-container/src/test/java/org/testcontainers/containers/MongoDbContainer.java @@ -25,6 +25,7 @@ public class MongoDbContainer extends GenericContainer { /** * Creates a new {@link MongoDbContainer} with the {@value DEFAULT_IMAGE_AND_TAG} image. + * @deprecated use {@link MongoDbContainer(DockerImageName)} instead */ @Deprecated public MongoDbContainer() { @@ -35,12 +36,16 @@ public MongoDbContainer() { * Creates a new {@link MongoDbContainer} with the given {@code 'image'}. * * @param image the image (e.g. {@value DEFAULT_IMAGE_AND_TAG}) to use + * @deprecated use {@link MongoDbContainer(DockerImageName)} instead */ @Deprecated public MongoDbContainer(@NotNull String image) { this(new DockerImageName(image)); } + /** + * Creates a new {@link MongoDbContainer} with the specified image. + */ public MongoDbContainer(final DockerImageName dockerImageName) { super(dockerImageName); addExposedPort(MONGODB_PORT); diff --git a/modules/clickhouse/src/main/java/org/testcontainers/containers/ClickHouseContainer.java b/modules/clickhouse/src/main/java/org/testcontainers/containers/ClickHouseContainer.java index 65955c584a7..4851b441624 100644 --- a/modules/clickhouse/src/main/java/org/testcontainers/containers/ClickHouseContainer.java +++ b/modules/clickhouse/src/main/java/org/testcontainers/containers/ClickHouseContainer.java @@ -22,11 +22,17 @@ public class ClickHouseContainer extends JdbcDatabaseContainer { private String username = "default"; private String password = ""; + /** + * @deprecated use {@link ClickHouseContainer(DockerImageName)} instead + */ @Deprecated public ClickHouseContainer() { super(IMAGE + ":" + DEFAULT_TAG); } + /** + * @deprecated use {@link ClickHouseContainer(DockerImageName)} instead + */ @Deprecated public ClickHouseContainer(String dockerImageName) { this(new DockerImageName(dockerImageName)); diff --git a/modules/cockroachdb/src/main/java/org/testcontainers/containers/CockroachContainer.java b/modules/cockroachdb/src/main/java/org/testcontainers/containers/CockroachContainer.java index 055806a3e2b..330155bad71 100644 --- a/modules/cockroachdb/src/main/java/org/testcontainers/containers/CockroachContainer.java +++ b/modules/cockroachdb/src/main/java/org/testcontainers/containers/CockroachContainer.java @@ -19,11 +19,17 @@ public class CockroachContainer extends JdbcDatabaseContainer { /** * Creates a new couchbase container with the default image and version. + * @deprecated use {@link CouchbaseContainer(DockerImageName)} instead */ @Deprecated public CouchbaseContainer() { @@ -98,12 +99,17 @@ public CouchbaseContainer() { * Creates a new couchbase container with a custom image name. * * @param dockerImageName the image name that should be used. + * @deprecated use {@link CouchbaseContainer(DockerImageName)} instead */ @Deprecated public CouchbaseContainer(final String dockerImageName) { this(new DockerImageName(dockerImageName)); } + /** + * Create a new couchbase container with the specified image name. + * @param dockerImageName + */ public CouchbaseContainer(final DockerImageName dockerImageName) { super(dockerImageName); } diff --git a/modules/db2/src/main/java/org/testcontainers/containers/Db2Container.java b/modules/db2/src/main/java/org/testcontainers/containers/Db2Container.java index 462c944bd8d..67288ce6a37 100644 --- a/modules/db2/src/main/java/org/testcontainers/containers/Db2Container.java +++ b/modules/db2/src/main/java/org/testcontainers/containers/Db2Container.java @@ -20,11 +20,17 @@ public class Db2Container extends JdbcDatabaseContainer { private String username = "db2inst1"; private String password = "foobar1234"; + /** + * @deprecated use {@link Db2Container(DockerImageName)} instead + */ @Deprecated public Db2Container() { this(DEFAULT_DB2_IMAGE_NAME + ":" + DEFAULT_TAG); } + /** + * @deprecated use {@link Db2Container(DockerImageName)} instead + */ @Deprecated public Db2Container(String dockerImageName) { this(new DockerImageName(dockerImageName)); diff --git a/modules/dynalite/src/main/java/org/testcontainers/dynamodb/DynaliteContainer.java b/modules/dynalite/src/main/java/org/testcontainers/dynamodb/DynaliteContainer.java index 8711cee90e0..a3013516c34 100644 --- a/modules/dynalite/src/main/java/org/testcontainers/dynamodb/DynaliteContainer.java +++ b/modules/dynalite/src/main/java/org/testcontainers/dynamodb/DynaliteContainer.java @@ -17,12 +17,18 @@ public class DynaliteContainer extends GenericContainer { private static final String IMAGE_NAME = "quay.io/testcontainers/dynalite:v1.2.1-1"; private static final int MAPPED_PORT = 4567; + /** + * @deprecated use {@link DynaliteContainer(DockerImageName)} instead + */ @Deprecated public DynaliteContainer() { this(IMAGE_NAME); withExposedPorts(MAPPED_PORT); } + /** + * @deprecated use {@link DynaliteContainer(DockerImageName)} instead + */ @Deprecated public DynaliteContainer(String dockerImageName) { this(new DockerImageName(dockerImageName)); diff --git a/modules/elasticsearch/src/main/java/org/testcontainers/elasticsearch/ElasticsearchContainer.java b/modules/elasticsearch/src/main/java/org/testcontainers/elasticsearch/ElasticsearchContainer.java index b149fe30408..c65d9ec0e90 100644 --- a/modules/elasticsearch/src/main/java/org/testcontainers/elasticsearch/ElasticsearchContainer.java +++ b/modules/elasticsearch/src/main/java/org/testcontainers/elasticsearch/ElasticsearchContainer.java @@ -37,6 +37,9 @@ public class ElasticsearchContainer extends GenericContainer> extends Gen private String username = "any"; private String password = "any"; - + /** + * @deprecated use {@link InfluxDBContainer(DockerImageName)} instead + */ @Deprecated public InfluxDBContainer() { this(VERSION); } + /** + * @deprecated use {@link InfluxDBContainer(DockerImageName)} instead + */ @Deprecated public InfluxDBContainer(final String version) { this(new DockerImageName(IMAGE_NAME + ":" + version)); diff --git a/modules/jdbc/src/main/java/org/testcontainers/containers/JdbcDatabaseContainer.java b/modules/jdbc/src/main/java/org/testcontainers/containers/JdbcDatabaseContainer.java index 132365c04c5..52b76070510 100644 --- a/modules/jdbc/src/main/java/org/testcontainers/containers/JdbcDatabaseContainer.java +++ b/modules/jdbc/src/main/java/org/testcontainers/containers/JdbcDatabaseContainer.java @@ -39,6 +39,9 @@ public abstract class JdbcDatabaseContainer { private int port = PORT_NOT_ASSIGNED; + /** + * @deprecated use {@link KafkaContainer(DockerImageName)} instead + */ @Deprecated public KafkaContainer() { this("5.2.1"); } + /** + * @deprecated use {@link KafkaContainer(DockerImageName)} instead + */ @Deprecated public KafkaContainer(String confluentPlatformVersion) { this(new DockerImageName(TestcontainersConfiguration.getInstance().getKafkaImage() + ":" + confluentPlatformVersion)); diff --git a/modules/localstack/src/main/java/org/testcontainers/containers/localstack/LocalStackContainer.java b/modules/localstack/src/main/java/org/testcontainers/containers/localstack/LocalStackContainer.java index d07d7f56fb4..c285e1b7ac1 100644 --- a/modules/localstack/src/main/java/org/testcontainers/containers/localstack/LocalStackContainer.java +++ b/modules/localstack/src/main/java/org/testcontainers/containers/localstack/LocalStackContainer.java @@ -37,11 +37,17 @@ public class LocalStackContainer extends GenericContainer { private final List services = new ArrayList<>(); + /** + * @deprecated use {@link LocalStackContainer(DockerImageName)} instead + */ @Deprecated public LocalStackContainer() { this(VERSION); } + /** + * @deprecated use {@link LocalStackContainer(DockerImageName)} instead + */ @Deprecated public LocalStackContainer(String version) { this(new DockerImageName(TestcontainersConfiguration.getInstance().getLocalStackImage() + ":" + version)); diff --git a/modules/mariadb/src/main/java/org/testcontainers/containers/MariaDBContainer.java b/modules/mariadb/src/main/java/org/testcontainers/containers/MariaDBContainer.java index 59a44ca29c6..02cfce06d66 100644 --- a/modules/mariadb/src/main/java/org/testcontainers/containers/MariaDBContainer.java +++ b/modules/mariadb/src/main/java/org/testcontainers/containers/MariaDBContainer.java @@ -24,11 +24,17 @@ public class MariaDBContainer> extends JdbcD private static final String MARIADB_ROOT_USER = "root"; private static final String MY_CNF_CONFIG_OVERRIDE_PARAM_NAME = "TC_MY_CNF"; + /** + * @deprecated use {@link MariaDBContainer(DockerImageName)} instead + */ @Deprecated public MariaDBContainer() { this(IMAGE + ":" + DEFAULT_TAG); } + /** + * @deprecated use {@link MariaDBContainer(DockerImageName)} instead + */ @Deprecated public MariaDBContainer(String dockerImageName) { this(new DockerImageName(dockerImageName)); diff --git a/modules/mockserver/src/main/java/org/testcontainers/containers/MockServerContainer.java b/modules/mockserver/src/main/java/org/testcontainers/containers/MockServerContainer.java index 4349b3e789b..a6bb000bc59 100644 --- a/modules/mockserver/src/main/java/org/testcontainers/containers/MockServerContainer.java +++ b/modules/mockserver/src/main/java/org/testcontainers/containers/MockServerContainer.java @@ -10,11 +10,17 @@ public class MockServerContainer extends GenericContainer { public static final int PORT = 1080; + /** + * @deprecated use {@link MockServerContainer(DockerImageName)} instead + */ @Deprecated public MockServerContainer() { this(VERSION); } + /** + * @deprecated use {@link MockServerContainer(DockerImageName)} instead + */ @Deprecated public MockServerContainer(String version) { this(new DockerImageName("jamesdbloom/mockserver:mockserver-" + version)); diff --git a/modules/mongodb/src/main/java/org/testcontainers/containers/MongoDBContainer.java b/modules/mongodb/src/main/java/org/testcontainers/containers/MongoDBContainer.java index 6d88ccbb1f2..f163afea4c9 100644 --- a/modules/mongodb/src/main/java/org/testcontainers/containers/MongoDBContainer.java +++ b/modules/mongodb/src/main/java/org/testcontainers/containers/MongoDBContainer.java @@ -22,11 +22,17 @@ public class MongoDBContainer extends GenericContainer { private static final String MONGODB_VERSION_DEFAULT = "4.0.10"; private static final String MONGODB_DATABASE_NAME_DEFAULT = "test"; + /** + * @deprecated use {@link MongoDBContainer(DockerImageName)} instead + */ @Deprecated public MongoDBContainer() { this("mongo:" + MONGODB_VERSION_DEFAULT); } - + + /** + * @deprecated use {@link MongoDBContainer(DockerImageName)} instead + */ @Deprecated public MongoDBContainer(@NonNull final String dockerImageName) { this(new DockerImageName(dockerImageName)); diff --git a/modules/mssqlserver/src/main/java/org/testcontainers/containers/MSSQLServerContainer.java b/modules/mssqlserver/src/main/java/org/testcontainers/containers/MSSQLServerContainer.java index 7866d6c1ea7..439ffa8b99c 100644 --- a/modules/mssqlserver/src/main/java/org/testcontainers/containers/MSSQLServerContainer.java +++ b/modules/mssqlserver/src/main/java/org/testcontainers/containers/MSSQLServerContainer.java @@ -33,11 +33,17 @@ public class MSSQLServerContainer> exten Pattern.compile("[^a-zA-Z0-9]+", Pattern.CASE_INSENSITIVE) }; + /** + * @deprecated use {@link MSSQLServerContainer(DockerImageName)} instead + */ @Deprecated public MSSQLServerContainer() { this(IMAGE + ":" + DEFAULT_TAG); } + /** + * @deprecated use {@link MSSQLServerContainer(DockerImageName)} instead + */ @Deprecated public MSSQLServerContainer(final String dockerImageName) { this(new DockerImageName(dockerImageName)); diff --git a/modules/mysql/src/main/java/org/testcontainers/containers/MySQLContainer.java b/modules/mysql/src/main/java/org/testcontainers/containers/MySQLContainer.java index fc4d62f3587..ddc3a2c8481 100644 --- a/modules/mysql/src/main/java/org/testcontainers/containers/MySQLContainer.java +++ b/modules/mysql/src/main/java/org/testcontainers/containers/MySQLContainer.java @@ -26,11 +26,17 @@ public class MySQLContainer> extends JdbcDatab private String password = DEFAULT_PASSWORD; private static final String MYSQL_ROOT_USER = "root"; + /** + * @deprecated use {@link MySQLContainer(DockerImageName)} instead + */ @Deprecated public MySQLContainer() { this(IMAGE + ":" + DEFAULT_TAG); } + /** + * @deprecated use {@link MySQLContainer(DockerImageName)} instead + */ @Deprecated public MySQLContainer(String dockerImageName) { this(new DockerImageName(dockerImageName)); diff --git a/modules/neo4j/src/main/java/org/testcontainers/containers/Neo4jContainer.java b/modules/neo4j/src/main/java/org/testcontainers/containers/Neo4jContainer.java index e7f87430e0d..bccc4cf39fa 100644 --- a/modules/neo4j/src/main/java/org/testcontainers/containers/Neo4jContainer.java +++ b/modules/neo4j/src/main/java/org/testcontainers/containers/Neo4jContainer.java @@ -63,6 +63,7 @@ public class Neo4jContainer> extends GenericContaine /** * Creates a Testcontainer using the official Neo4j docker image. + * @deprecated use {@link Neo4jContainer(DockerImageName)} instead */ @Deprecated public Neo4jContainer() { @@ -73,6 +74,7 @@ public Neo4jContainer() { * Creates a Testcontainer using a specific docker image. * * @param dockerImageName The docker image to use. + * @deprecated use {@link Neo4jContainer(DockerImageName)} instead */ @Deprecated public Neo4jContainer(String dockerImageName) { diff --git a/modules/nginx/src/main/java/org/testcontainers/containers/NginxContainer.java b/modules/nginx/src/main/java/org/testcontainers/containers/NginxContainer.java index 4dd970d0e17..dcf93a18a95 100644 --- a/modules/nginx/src/main/java/org/testcontainers/containers/NginxContainer.java +++ b/modules/nginx/src/main/java/org/testcontainers/containers/NginxContainer.java @@ -16,11 +16,17 @@ public class NginxContainer> extends GenericCo private static final int NGINX_DEFAULT_PORT = 80; + /** + * @deprecated use {@link NginxContainer(DockerImageName)} instead + */ @Deprecated public NginxContainer() { this("nginx:1.9.4"); } + /** + * @deprecated use {@link NginxContainer(DockerImageName)} instead + */ @Deprecated public NginxContainer(String dockerImageName) { this(new DockerImageName(dockerImageName)); diff --git a/modules/oracle-xe/src/main/java/org/testcontainers/containers/OracleContainer.java b/modules/oracle-xe/src/main/java/org/testcontainers/containers/OracleContainer.java index 8de0a2b5141..c274afa57bf 100644 --- a/modules/oracle-xe/src/main/java/org/testcontainers/containers/OracleContainer.java +++ b/modules/oracle-xe/src/main/java/org/testcontainers/containers/OracleContainer.java @@ -33,11 +33,17 @@ private static String resolveImageName() { return image; } + /** + * @deprecated use {@link OracleContainer(DockerImageName)} instead + */ @Deprecated public OracleContainer() { this(resolveImageName()); } + /** + * @deprecated use {@link OracleContainer(DockerImageName)} instead + */ @Deprecated public OracleContainer(String dockerImageName) { this(new DockerImageName(dockerImageName)); diff --git a/modules/orientdb/src/main/java/org/testcontainers/containers/OrientDBContainer.java b/modules/orientdb/src/main/java/org/testcontainers/containers/OrientDBContainer.java index 6d87e66dea7..f7df8409456 100644 --- a/modules/orientdb/src/main/java/org/testcontainers/containers/OrientDBContainer.java +++ b/modules/orientdb/src/main/java/org/testcontainers/containers/OrientDBContainer.java @@ -49,11 +49,17 @@ public class OrientDBContainer extends GenericContainer { private OrientDB orientDB; private ODatabaseSession session; + /** + * @deprecated use {@link OrientDBContainer(DockerImageName)} instead + */ @Deprecated public OrientDBContainer() { this(DOCKER_IMAGE_NAME); } + /** + * @deprecated use {@link OrientDBContainer(DockerImageName)} instead + */ @Deprecated public OrientDBContainer(@NonNull String dockerImageName) { this(new DockerImageName(dockerImageName)); diff --git a/modules/postgresql/src/main/java/org/testcontainers/containers/PostgreSQLContainer.java b/modules/postgresql/src/main/java/org/testcontainers/containers/PostgreSQLContainer.java index d718aa5505a..adb1997a192 100644 --- a/modules/postgresql/src/main/java/org/testcontainers/containers/PostgreSQLContainer.java +++ b/modules/postgresql/src/main/java/org/testcontainers/containers/PostgreSQLContainer.java @@ -32,11 +32,17 @@ public class PostgreSQLContainer> extends private static final String QUERY_PARAM_SEPARATOR = "&"; + /** + * @deprecated use {@link PostgreSQLContainer(DockerImageName)} instead + */ @Deprecated public PostgreSQLContainer() { this(IMAGE + ":" + DEFAULT_TAG); } + /** + * @deprecated use {@link PostgreSQLContainer(DockerImageName)} instead + */ @Deprecated public PostgreSQLContainer(final String dockerImageName) { this(new DockerImageName(dockerImageName)); diff --git a/modules/presto/src/main/java/org/testcontainers/containers/PrestoContainer.java b/modules/presto/src/main/java/org/testcontainers/containers/PrestoContainer.java index 5e1bf3e2fc4..14342fc9bc9 100644 --- a/modules/presto/src/main/java/org/testcontainers/containers/PrestoContainer.java +++ b/modules/presto/src/main/java/org/testcontainers/containers/PrestoContainer.java @@ -24,11 +24,17 @@ public class PrestoContainer> extends JdbcDat private String username = "test"; private String catalog = null; + /** + * @deprecated use {@link PrestoContainer(DockerImageName)} instead + */ @Deprecated public PrestoContainer() { this(IMAGE + ":" + DEFAULT_TAG); } + /** + * @deprecated use {@link PrestoContainer(DockerImageName)} instead + */ @Deprecated public PrestoContainer(final String dockerImageName) { this(new DockerImageName(dockerImageName)); diff --git a/modules/pulsar/src/main/java/org/testcontainers/containers/PulsarContainer.java b/modules/pulsar/src/main/java/org/testcontainers/containers/PulsarContainer.java index d9db7609bef..4d30d947113 100644 --- a/modules/pulsar/src/main/java/org/testcontainers/containers/PulsarContainer.java +++ b/modules/pulsar/src/main/java/org/testcontainers/containers/PulsarContainer.java @@ -19,11 +19,17 @@ public class PulsarContainer extends GenericContainer { private boolean functionsWorkerEnabled = false; + /** + * @deprecated use {@link PulsarContainer(DockerImageName)} instead + */ @Deprecated public PulsarContainer() { this(DEFAULT_PULSAR_VERSION); } + /** + * @deprecated use {@link PulsarContainer(DockerImageName)} instead + */ @Deprecated public PulsarContainer(String pulsarVersion) { this(TestcontainersConfiguration.getInstance().getPulsarDockerImageName().withTag(pulsarVersion)); diff --git a/modules/rabbitmq/src/main/java/org/testcontainers/containers/RabbitMQContainer.java b/modules/rabbitmq/src/main/java/org/testcontainers/containers/RabbitMQContainer.java index 0cf20eeb119..79ae063edaf 100644 --- a/modules/rabbitmq/src/main/java/org/testcontainers/containers/RabbitMQContainer.java +++ b/modules/rabbitmq/src/main/java/org/testcontainers/containers/RabbitMQContainer.java @@ -42,6 +42,7 @@ public class RabbitMQContainer extends GenericContainer { /** * Creates a Testcontainer using the official RabbitMQ docker image. + * @deprecated use {@link RabbitMQContainer(DockerImageName)} instead */ @Deprecated public RabbitMQContainer() { @@ -52,6 +53,7 @@ public RabbitMQContainer() { * Creates a Testcontainer using a specific docker image. * * @param dockerImageName The docker image to use. + * @deprecated use {@link RabbitMQContainer(DockerImageName)} instead */ @Deprecated public RabbitMQContainer(String dockerImageName) { diff --git a/modules/selenium/src/main/java/org/testcontainers/containers/BrowserWebDriverContainer.java b/modules/selenium/src/main/java/org/testcontainers/containers/BrowserWebDriverContainer.java index 19c35b00dd6..aced294182f 100644 --- a/modules/selenium/src/main/java/org/testcontainers/containers/BrowserWebDriverContainer.java +++ b/modules/selenium/src/main/java/org/testcontainers/containers/BrowserWebDriverContainer.java @@ -69,6 +69,7 @@ public class BrowserWebDriverContainer { private SolrContainerConfiguration configuration; + /** + * @deprecated use {@link SolrContainer(DockerImageName)} instead + */ @Deprecated public SolrContainer() { this(IMAGE + ":" + DEFAULT_TAG); } + /** + * @deprecated use {@link SolrContainer(DockerImageName)} instead + */ @Deprecated public SolrContainer(final String dockerImageName) { this(new DockerImageName(dockerImageName)); diff --git a/modules/toxiproxy/src/main/java/org/testcontainers/containers/ToxiproxyContainer.java b/modules/toxiproxy/src/main/java/org/testcontainers/containers/ToxiproxyContainer.java index 37410e5ac5c..1b6e05faec6 100644 --- a/modules/toxiproxy/src/main/java/org/testcontainers/containers/ToxiproxyContainer.java +++ b/modules/toxiproxy/src/main/java/org/testcontainers/containers/ToxiproxyContainer.java @@ -30,11 +30,17 @@ public class ToxiproxyContainer extends GenericContainer { private final Map proxies = new HashMap<>(); private final AtomicInteger nextPort = new AtomicInteger(FIRST_PROXIED_PORT); + /** + * @deprecated use {@link ToxiproxyContainer(DockerImageName)} instead + */ @Deprecated public ToxiproxyContainer() { this(IMAGE_NAME); } + /** + * @deprecated use {@link ToxiproxyContainer(DockerImageName)} instead + */ @Deprecated public ToxiproxyContainer(String dockerImageName) { this(new DockerImageName(dockerImageName)); diff --git a/modules/vault/src/main/java/org/testcontainers/vault/VaultContainer.java b/modules/vault/src/main/java/org/testcontainers/vault/VaultContainer.java index 32e9648178c..d5cd73838ca 100644 --- a/modules/vault/src/main/java/org/testcontainers/vault/VaultContainer.java +++ b/modules/vault/src/main/java/org/testcontainers/vault/VaultContainer.java @@ -29,11 +29,17 @@ public class VaultContainer> extends GenericCo private int port = VAULT_PORT; + /** + * @deprecated use {@link VaultContainer(DockerImageName)} instead + */ @Deprecated public VaultContainer() { this("vault:1.1.3"); } + /** + * @deprecated use {@link VaultContainer(DockerImageName)} instead + */ @Deprecated public VaultContainer(String dockerImageName) { this(new DockerImageName(dockerImageName)); From 77aa41801afb757e7abc8a019afb4d10c332956f Mon Sep 17 00:00:00 2001 From: Richard North Date: Fri, 3 Jul 2020 09:33:41 +0100 Subject: [PATCH 08/17] Add `asCanonicalNameString()` method on `DockerImageName` --- .../testcontainers/DockerClientFactory.java | 2 +- .../images/AbstractImagePullPolicy.java | 2 +- .../images/LocalImagesCache.java | 2 +- .../images/RemoteDockerImage.java | 6 +-- .../utility/DockerImageName.java | 22 +++++----- .../utility/ResourceReaper.java | 2 +- .../DockerClientFactoryTest.java | 2 +- .../containers/ReusabilityUnitTests.java | 2 +- .../utility/AuthenticatedImagePullTest.java | 2 +- .../utility/DockerImageNameTest.java | 40 ++++++++++++++----- 10 files changed, 52 insertions(+), 30 deletions(-) diff --git a/core/src/main/java/org/testcontainers/DockerClientFactory.java b/core/src/main/java/org/testcontainers/DockerClientFactory.java index 19a4e1896f1..3c42b632881 100644 --- a/core/src/main/java/org/testcontainers/DockerClientFactory.java +++ b/core/src/main/java/org/testcontainers/DockerClientFactory.java @@ -55,7 +55,7 @@ public class DockerClientFactory { TESTCONTAINERS_SESSION_ID_LABEL, SESSION_ID ); - private static final String TINY_IMAGE = TestcontainersConfiguration.getInstance().getTinyDockerImageName().toString(); + private static final String TINY_IMAGE = TestcontainersConfiguration.getInstance().getTinyDockerImageName().asCanonicalNameString(); private static DockerClientFactory instance; // Cached client configuration diff --git a/core/src/main/java/org/testcontainers/images/AbstractImagePullPolicy.java b/core/src/main/java/org/testcontainers/images/AbstractImagePullPolicy.java index 11c621eb08b..f5d75ad9617 100644 --- a/core/src/main/java/org/testcontainers/images/AbstractImagePullPolicy.java +++ b/core/src/main/java/org/testcontainers/images/AbstractImagePullPolicy.java @@ -12,7 +12,7 @@ public abstract class AbstractImagePullPolicy implements ImagePullPolicy { @Override public boolean shouldPull(DockerImageName imageName) { - Logger logger = DockerLoggerFactory.getLogger(imageName.toString()); + Logger logger = DockerLoggerFactory.getLogger(imageName.asCanonicalNameString()); // Does our cache already know the image? ImageData cachedImageData = LOCAL_IMAGES_CACHE.get(imageName); diff --git a/core/src/main/java/org/testcontainers/images/LocalImagesCache.java b/core/src/main/java/org/testcontainers/images/LocalImagesCache.java index e6b330d4c90..ec371ef830e 100644 --- a/core/src/main/java/org/testcontainers/images/LocalImagesCache.java +++ b/core/src/main/java/org/testcontainers/images/LocalImagesCache.java @@ -39,7 +39,7 @@ public Optional refreshCache(DockerImageName imageName) { InspectImageResponse response = null; try { - response = dockerClient.inspectImageCmd(imageName.toString()).exec(); + response = dockerClient.inspectImageCmd(imageName.asCanonicalNameString()).exec(); } catch (NotFoundException e) { log.trace("Image {} not found", imageName, e); } diff --git a/core/src/main/java/org/testcontainers/images/RemoteDockerImage.java b/core/src/main/java/org/testcontainers/images/RemoteDockerImage.java index 7e1faa8752f..09fef7da95a 100644 --- a/core/src/main/java/org/testcontainers/images/RemoteDockerImage.java +++ b/core/src/main/java/org/testcontainers/images/RemoteDockerImage.java @@ -63,7 +63,7 @@ protected final String resolve() { Logger logger = DockerLoggerFactory.getLogger(imageName.toString()); try { if (!imagePullPolicy.shouldPull(imageName)) { - return imageName.toString(); + return imageName.asCanonicalNameString(); } // The image is not available locally - pull it @@ -82,7 +82,7 @@ protected final String resolve() { LocalImagesCache.INSTANCE.refreshCache(imageName); - return imageName.toString(); + return imageName.asCanonicalNameString(); } catch (InterruptedException | InternalServerErrorException e) { // these classes of exception often relate to timeout/connection errors so should be retried lastFailure = e; @@ -110,7 +110,7 @@ private String imageNameToString() { } try { - return getImageName().toString(); + return getImageName().asCanonicalNameString(); } catch (InterruptedException | ExecutionException e) { return e.getMessage(); } diff --git a/core/src/main/java/org/testcontainers/utility/DockerImageName.java b/core/src/main/java/org/testcontainers/utility/DockerImageName.java index 970237b66db..cb342056116 100644 --- a/core/src/main/java/org/testcontainers/utility/DockerImageName.java +++ b/core/src/main/java/org/testcontainers/utility/DockerImageName.java @@ -6,6 +6,7 @@ import lombok.AllArgsConstructor; import lombok.Data; import lombok.EqualsAndHashCode; +import org.jetbrains.annotations.NotNull; import java.util.regex.Pattern; @@ -22,7 +23,7 @@ public final class DockerImageName { private final String rawName; private final String registry; private final String repo; - private final Versioning versioning; + @NotNull private final Versioning versioning; /** * Parses a docker image name from a provided string. @@ -69,7 +70,7 @@ public DockerImageName(String fullImageName) { * tag, * sha256:abcdef.... */ - public DockerImageName(String nameWithoutTag, String version) { + public DockerImageName(String nameWithoutTag, @NotNull String version) { this.rawName = nameWithoutTag; final int slashIndex = nameWithoutTag.indexOf('/'); @@ -112,13 +113,16 @@ public String getVersionPart() { return versioning.toString(); } + /** + * @return canonical name for the image + */ + public String asCanonicalNameString() { + return getUnversionedPart() + versioning.getSeparator() + versioning.toString(); + } + @Override public String toString() { - if (versioning == null) { - return getUnversionedPart(); - } else { - return getUnversionedPart() + versioning.getSeparator() + versioning.toString(); - } + return asCanonicalNameString(); } /** @@ -131,10 +135,6 @@ public void assertValid() { if (!REPO_NAME.matcher(repo).matches()) { throw new IllegalArgumentException(repo + " is not a valid Docker image name (in " + rawName + ")"); } - if (versioning == null) { - throw new IllegalArgumentException("No image tag was specified in docker image name " + - "(" + rawName + "). Please provide a tag; this may be 'latest' or a specific version"); - } if (!versioning.isValid()) { throw new IllegalArgumentException(versioning + " is not a valid image versioning identifier (in " + rawName + ")"); } diff --git a/core/src/main/java/org/testcontainers/utility/ResourceReaper.java b/core/src/main/java/org/testcontainers/utility/ResourceReaper.java index 27d70bf6926..5da80739252 100644 --- a/core/src/main/java/org/testcontainers/utility/ResourceReaper.java +++ b/core/src/main/java/org/testcontainers/utility/ResourceReaper.java @@ -72,7 +72,7 @@ private ResourceReaper() { @SneakyThrows(InterruptedException.class) public static String start(String hostIpAddress, DockerClient client) { - String ryukImage = TestcontainersConfiguration.getInstance().getRyukDockerImageName().toString(); + String ryukImage = TestcontainersConfiguration.getInstance().getRyukDockerImageName().asCanonicalNameString(); DockerClientFactory.instance().checkAndPullImage(client, ryukImage); List binds = new ArrayList<>(); diff --git a/core/src/test/java/org/testcontainers/DockerClientFactoryTest.java b/core/src/test/java/org/testcontainers/DockerClientFactoryTest.java index 4ef5f2b25b1..030e4164f00 100644 --- a/core/src/test/java/org/testcontainers/DockerClientFactoryTest.java +++ b/core/src/test/java/org/testcontainers/DockerClientFactoryTest.java @@ -30,7 +30,7 @@ public void runCommandInsideDockerShouldNotFailIfImageDoesNotExistsLocally() { try { //remove tiny image, so it will be pulled during next command run dockFactory.client() - .removeImageCmd(TestcontainersConfiguration.getInstance().getTinyDockerImageName().toString()) + .removeImageCmd(TestcontainersConfiguration.getInstance().getTinyDockerImageName().asCanonicalNameString()) .withForce(true).exec(); } catch (NotFoundException ignored) { // Do not fail if it's not pulled yet diff --git a/core/src/test/java/org/testcontainers/containers/ReusabilityUnitTests.java b/core/src/test/java/org/testcontainers/containers/ReusabilityUnitTests.java index 6a8fe491c19..0318653d174 100644 --- a/core/src/test/java/org/testcontainers/containers/ReusabilityUnitTests.java +++ b/core/src/test/java/org/testcontainers/containers/ReusabilityUnitTests.java @@ -56,7 +56,7 @@ public class ReusabilityUnitTests { static final CompletableFuture IMAGE_FUTURE = CompletableFuture.completedFuture( - TestcontainersConfiguration.getInstance().getTinyDockerImageName().toString() + TestcontainersConfiguration.getInstance().getTinyDockerImageName().asCanonicalNameString() ); @RunWith(Parameterized.class) diff --git a/core/src/test/java/org/testcontainers/utility/AuthenticatedImagePullTest.java b/core/src/test/java/org/testcontainers/utility/AuthenticatedImagePullTest.java index b33499c0e06..095385eb353 100644 --- a/core/src/test/java/org/testcontainers/utility/AuthenticatedImagePullTest.java +++ b/core/src/test/java/org/testcontainers/utility/AuthenticatedImagePullTest.java @@ -165,7 +165,7 @@ private Path getLocalTempFile(String s) throws IOException { private static void putImageInRegistry() throws InterruptedException { // It doesn't matter which image we use for this test, but use one that's likely to have been pulled already - final String dummySourceImage = TestcontainersConfiguration.getInstance().getRyukDockerImageName().toString(); + final String dummySourceImage = TestcontainersConfiguration.getInstance().getRyukDockerImageName().asCanonicalNameString(); client.pullImageCmd(dummySourceImage) .exec(new PullImageResultCallback()) diff --git a/core/src/test/java/org/testcontainers/utility/DockerImageNameTest.java b/core/src/test/java/org/testcontainers/utility/DockerImageNameTest.java index 54488773652..48d6e1af34c 100644 --- a/core/src/test/java/org/testcontainers/utility/DockerImageNameTest.java +++ b/core/src/test/java/org/testcontainers/utility/DockerImageNameTest.java @@ -66,12 +66,18 @@ public static class Parsing { @Parameterized.Parameters(name = "{0}{1}{2}{3}{4}") public static String[][] getNames() { return new String[][]{ + {"", "", "myname", ":", null}, {"", "", "myname", ":", "latest"}, + {"", "", "repo/myname", ":", null}, {"", "", "repo/myname", ":", "latest"}, + {"registry.foo.com:1234", "/", "my-name", ":", null}, {"registry.foo.com:1234", "/", "my-name", ":", "1.0"}, {"registry.foo.com", "/", "my-name", ":", "1.0"}, + {"registry.foo.com:1234", "/", "repo_here/my-name", ":", null}, {"registry.foo.com:1234", "/", "repo_here/my-name", ":", "1.0"}, + {"1.2.3.4:1234", "/", "repo_here/my-name", ":", null}, {"1.2.3.4:1234", "/", "repo_here/my-name", ":", "1.0"}, + {"1.2.3.4:1234", "/", "my-name", ":", null}, {"1.2.3.4:1234", "/", "my-name", ":", "1.0"}, {"", "", "myname", "@", "sha256:1234abcd1234abcd1234abcd1234abcd"}, {"", "", "repo/myname", "@", "sha256:1234abcd1234abcd1234abcd1234abcd"}, @@ -98,7 +104,16 @@ public static String[][] getNames() { @Test public void testParsing() { final String unversionedPart = registry + registrySeparator + repo; - final String combined = unversionedPart + versionSeparator + version; + + String combined; + String canonicalName; + if (version != null) { + combined = unversionedPart + versionSeparator + version; + canonicalName = unversionedPart + versionSeparator + version; + } else { + combined = unversionedPart; + canonicalName = unversionedPart + ":latest"; + } VisibleAssertions.context("For " + combined); VisibleAssertions.context("Using single-arg constructor:", 2); @@ -106,14 +121,21 @@ public void testParsing() { final DockerImageName imageName = new DockerImageName(combined); assertEquals(combined + " has registry address: " + registry, registry, imageName.getRegistry()); assertEquals(combined + " has unversioned part: " + unversionedPart, unversionedPart, imageName.getUnversionedPart()); - assertEquals(combined + " has version part: " + version, version, imageName.getVersionPart()); - - VisibleAssertions.context("Using two-arg constructor:", 2); - - final DockerImageName imageNameFromSecondaryConstructor = new DockerImageName(unversionedPart, version); - assertEquals(combined + " has registry address: " + registry, registry, imageNameFromSecondaryConstructor.getRegistry()); - assertEquals(combined + " has unversioned part: " + unversionedPart, unversionedPart, imageNameFromSecondaryConstructor.getUnversionedPart()); - assertEquals(combined + " has version part: " + version, version, imageNameFromSecondaryConstructor.getVersionPart()); + if (version != null) { + assertEquals(combined + " has version part: " + version, version, imageName.getVersionPart()); + } else { + assertEquals(combined + " has implicit version: latest", "latest", imageName.getVersionPart()); + } + assertEquals(combined + " has canonical name: " + canonicalName, canonicalName, imageName.asCanonicalNameString()); + + if (version != null) { + VisibleAssertions.context("Using two-arg constructor:", 2); + + final DockerImageName imageNameFromSecondaryConstructor = new DockerImageName(unversionedPart, version); + assertEquals(combined + " has registry address: " + registry, registry, imageNameFromSecondaryConstructor.getRegistry()); + assertEquals(combined + " has unversioned part: " + unversionedPart, unversionedPart, imageNameFromSecondaryConstructor.getUnversionedPart()); + assertEquals(combined + " has version part: " + version, version, imageNameFromSecondaryConstructor.getVersionPart()); + } } } } From 592f08aad393adb3616e4ce94c155ad0389b4b68 Mon Sep 17 00:00:00 2001 From: Richard North Date: Fri, 3 Jul 2020 22:21:54 +0100 Subject: [PATCH 09/17] Use static factory method instead of constructor --- .../containers/SocatContainer.java | 2 +- .../AuthDelegatingDockerClientConfig.java | 2 +- .../images/RemoteDockerImage.java | 4 +-- .../dockerfile/traits/FromStatementTrait.java | 2 +- .../utility/DockerImageName.java | 15 +++++++++++ .../utility/TestcontainersConfiguration.java | 18 ++++++------- .../java/org/testcontainers/TestImages.java | 8 +++--- .../dockerclient/ImagePullTest.java | 2 +- .../images/AgeBasedPullPolicyTest.java | 2 +- .../images/ImagePullPolicyTest.java | 18 ++++++------- .../images/RemoteDockerImageTest.java | 2 +- .../images/builder/DockerignoreTest.java | 2 +- .../junit/NonExistentImagePullTest.java | 2 +- .../utility/AuthenticatedImagePullTest.java | 4 +-- .../utility/DockerImageNameTest.java | 6 ++--- .../utility/RegistryAuthLocatorTest.java | 20 +++++++-------- .../test/java/generic/CmdModifierTest.java | 4 +-- .../src/test/java/generic/CommandsTest.java | 2 +- .../java/generic/ContainerCreationTest.java | 4 +-- .../test/java/generic/ContainerLabelTest.java | 4 +-- .../src/test/java/generic/ExecTest.java | 2 +- .../generic/MultiplePortsExposedTest.java | 2 +- .../test/java/generic/WaitStrategiesTest.java | 6 ++--- .../StartupCheckStrategyTest.java | 6 ++--- .../quickstart/RedisBackedCacheIntTest.java | 2 +- .../quickstart/RedisBackedCacheIntTest.java | 2 +- docs/features/creating_container.md | 2 +- .../test/java/DisqueBackedMailSenderTest.java | 2 +- .../test/java/SingleDisqueInstanceTest.java | 2 +- .../LinkedContainerTestImages.java | 4 +-- .../containers/MongoDbContainer.java | 2 +- .../containers/MongoDbContainerTest.java | 2 +- .../src/test/java/RedisBackedCacheTest.java | 2 +- .../src/test/java/RedisBackedCacheTest.java | 2 +- .../com/example/AbstractIntegrationTest.java | 2 +- .../test/java/com/example/SolrQueryTest.java | 2 +- .../com/example/AbstractIntegrationTest.java | 2 +- .../containers/CassandraContainer.java | 2 +- .../containers/CassandraContainerTest.java | 4 +-- .../containers/ClickHouseContainer.java | 2 +- .../containers/ClickHouseProvider.java | 2 +- .../testcontainers/ClickhouseTestImages.java | 2 +- .../containers/CockroachContainer.java | 2 +- .../CockroachContainerProvider.java | 2 +- .../testcontainers/CockroachDBTestImages.java | 2 +- .../couchbase/CouchbaseContainer.java | 2 +- .../couchbase/CouchbaseContainerTest.java | 2 +- .../containers/Db2Container.java | 2 +- .../containers/Db2ContainerProvider.java | 2 +- .../org/testcontainers/Db2TestImages.java | 2 +- .../dynamodb/DynaliteContainer.java | 2 +- .../dynamodb/DynaliteContainerTest.java | 2 +- .../elasticsearch/ElasticsearchContainer.java | 2 +- .../ElasticsearchContainerTest.java | 25 +++++++++++++------ .../containers/InfluxDBContainer.java | 2 +- .../containers/InfluxDBTestImages.java | 2 +- .../containers/JdbcDatabaseContainer.java | 2 +- .../jdbc/MissingJdbcDriverTest.java | 2 +- .../junit/jupiter/JUnitJupiterTestImages.java | 4 +-- .../jupiter/inheritance/RedisContainer.java | 2 +- .../containers/KafkaContainer.java | 2 +- .../containers/KafkaContainerTest.java | 4 +-- .../localstack/LocalStackContainer.java | 2 +- .../localstack/LocalstackContainerTest.java | 4 +-- .../containers/MariaDBContainer.java | 2 +- .../containers/MariaDBContainerProvider.java | 2 +- .../org/testcontainers/MariaDBTestImages.java | 2 +- .../MariaDBR2DBCDatabaseContainerTest.java | 2 +- .../containers/MockServerContainer.java | 2 +- .../containers/MockServerContainerTest.java | 2 +- .../containers/MongoDBContainer.java | 4 +-- .../containers/MongoDBContainerTest.java | 2 +- .../containers/MSSQLServerContainer.java | 2 +- .../MSSQLServerContainerProvider.java | 2 +- .../testcontainers/MSSQLServerTestImages.java | 2 +- .../CustomizableMSSQLServerTest.java | 2 +- .../containers/MySQLContainer.java | 2 +- .../containers/MySQLContainerProvider.java | 2 +- .../org/testcontainers/MySQLTestImages.java | 6 ++--- .../junit/mysql/SimpleMySQLTest.java | 4 +-- .../containers/Neo4jContainer.java | 2 +- .../containers/Neo4jTestImages.java | 2 +- .../containers/NginxContainer.java | 2 +- .../testcontainers/junit/SimpleNginxTest.java | 2 +- .../containers/OracleContainer.java | 2 +- .../containers/OrientDBContainer.java | 2 +- .../containers/OrientDBContainerTest.java | 2 +- .../containers/PostgisContainerProvider.java | 2 +- .../containers/PostgreSQLContainer.java | 2 +- .../PostgreSQLContainerProvider.java | 2 +- .../testcontainers/PostgreSQLTestImages.java | 2 +- .../containers/PrestoContainer.java | 2 +- .../containers/PrestoContainerProvider.java | 2 +- .../org/testcontainers/PrestoTestImages.java | 4 +-- .../containers/PulsarContainerTest.java | 2 +- .../containers/RabbitMQContainer.java | 2 +- .../containers/RabbitMQTestImages.java | 2 +- .../containers/BrowserWebDriverContainer.java | 2 +- .../testcontainers/SeleniumTestImages.java | 2 +- .../testcontainers/junit/Selenium3xTest.java | 2 +- ...ecificImageNameWebDriverContainerTest.java | 2 +- .../containers/SolrContainer.java | 2 +- .../containers/SolrContainerTest.java | 2 +- .../spock/SpockTestImages.groovy | 6 ++--- .../containers/ToxiproxyContainer.java | 2 +- .../containers/ToxiproxyTest.java | 4 +-- .../testcontainers/vault/VaultContainer.java | 2 +- .../testcontainers/vault/VaultTestImages.java | 2 +- 108 files changed, 191 insertions(+), 165 deletions(-) diff --git a/core/src/main/java/org/testcontainers/containers/SocatContainer.java b/core/src/main/java/org/testcontainers/containers/SocatContainer.java index 7263ac6562a..dbf3f37e5fb 100644 --- a/core/src/main/java/org/testcontainers/containers/SocatContainer.java +++ b/core/src/main/java/org/testcontainers/containers/SocatContainer.java @@ -21,7 +21,7 @@ public class SocatContainer extends GenericContainer { */ @Deprecated public SocatContainer() { - this(new DockerImageName(TestcontainersConfiguration.getInstance().getSocatContainerImage())); + this(DockerImageName.parse(TestcontainersConfiguration.getInstance().getSocatContainerImage())); } public SocatContainer(final DockerImageName dockerImageName) { diff --git a/core/src/main/java/org/testcontainers/dockerclient/AuthDelegatingDockerClientConfig.java b/core/src/main/java/org/testcontainers/dockerclient/AuthDelegatingDockerClientConfig.java index c78a13c99ac..5acb7ab8835 100644 --- a/core/src/main/java/org/testcontainers/dockerclient/AuthDelegatingDockerClientConfig.java +++ b/core/src/main/java/org/testcontainers/dockerclient/AuthDelegatingDockerClientConfig.java @@ -40,7 +40,7 @@ public AuthConfig effectiveAuthConfig(String imageName) { } // try and obtain more accurate auth config using our resolution - final DockerImageName parsed = new DockerImageName(imageName); + final DockerImageName parsed = DockerImageName.parse(imageName); final AuthConfig effectiveAuthConfig = RegistryAuthLocator.instance() .lookupAuthConfig(parsed, fallbackAuthConfig); diff --git a/core/src/main/java/org/testcontainers/images/RemoteDockerImage.java b/core/src/main/java/org/testcontainers/images/RemoteDockerImage.java index 09fef7da95a..8d3a77c5680 100644 --- a/core/src/main/java/org/testcontainers/images/RemoteDockerImage.java +++ b/core/src/main/java/org/testcontainers/images/RemoteDockerImage.java @@ -44,12 +44,12 @@ public RemoteDockerImage(DockerImageName dockerImageName) { @Deprecated public RemoteDockerImage(String dockerImageName) { - this.imageNameFuture = CompletableFuture.completedFuture(new DockerImageName(dockerImageName)); + this.imageNameFuture = CompletableFuture.completedFuture(DockerImageName.parse(dockerImageName)); } @Deprecated public RemoteDockerImage(@NonNull String repository, @NonNull String tag) { - this.imageNameFuture = CompletableFuture.completedFuture(new DockerImageName(repository, tag)); + this.imageNameFuture = CompletableFuture.completedFuture(DockerImageName.parse(repository).withTag(tag)); } public RemoteDockerImage(@NonNull Future imageFuture) { diff --git a/core/src/main/java/org/testcontainers/images/builder/dockerfile/traits/FromStatementTrait.java b/core/src/main/java/org/testcontainers/images/builder/dockerfile/traits/FromStatementTrait.java index 2a87cb08223..07077259df8 100644 --- a/core/src/main/java/org/testcontainers/images/builder/dockerfile/traits/FromStatementTrait.java +++ b/core/src/main/java/org/testcontainers/images/builder/dockerfile/traits/FromStatementTrait.java @@ -6,7 +6,7 @@ public interface FromStatementTrait & DockerfileBuilderTrait> { default SELF from(String dockerImageName) { - new DockerImageName(dockerImageName).assertValid(); + DockerImageName.parse(dockerImageName).assertValid(); return ((SELF) this).withStatement(new SingleArgumentStatement("FROM", dockerImageName)); } diff --git a/core/src/main/java/org/testcontainers/utility/DockerImageName.java b/core/src/main/java/org/testcontainers/utility/DockerImageName.java index cb342056116..b4a40be2f16 100644 --- a/core/src/main/java/org/testcontainers/utility/DockerImageName.java +++ b/core/src/main/java/org/testcontainers/utility/DockerImageName.java @@ -32,6 +32,19 @@ public final class DockerImageName { * some.registry/path/name:tag, * some.registry/path/name@sha256:abcdef..., etc. */ + public static DockerImageName parse(String fullImageName) { + return new DockerImageName(fullImageName); + } + + /** + * Parses a docker image name from a provided string. + * + * @param fullImageName in standard Docker format, e.g. name:tag, + * some.registry/path/name:tag, + * some.registry/path/name@sha256:abcdef..., etc. + * @deprecated use {@link DockerImageName#parse(String)} instead + */ + @Deprecated public DockerImageName(String fullImageName) { this.rawName = fullImageName; final int slashIndex = fullImageName.indexOf('/'); @@ -69,7 +82,9 @@ public DockerImageName(String fullImageName) { * @param version a docker image version identifier, either as a tag or sha256 checksum, e.g. * tag, * sha256:abcdef.... + * @deprecated use {@link DockerImageName#parse(String)}.{@link DockerImageName#withTag(String)} instead */ + @Deprecated public DockerImageName(String nameWithoutTag, @NotNull String version) { this.rawName = nameWithoutTag; final int slashIndex = nameWithoutTag.indexOf('/'); diff --git a/core/src/main/java/org/testcontainers/utility/TestcontainersConfiguration.java b/core/src/main/java/org/testcontainers/utility/TestcontainersConfiguration.java index 0409199c649..1939e8e21b3 100644 --- a/core/src/main/java/org/testcontainers/utility/TestcontainersConfiguration.java +++ b/core/src/main/java/org/testcontainers/utility/TestcontainersConfiguration.java @@ -69,7 +69,7 @@ public String getSocatContainerImage() { } public DockerImageName getSocatDockerImageName() { - return new DockerImageName(getSocatContainerImage()); + return DockerImageName.parse(getSocatContainerImage()); } @Deprecated @@ -78,7 +78,7 @@ public String getVncRecordedContainerImage() { } public DockerImageName getVncDockerImageName() { - return new DockerImageName(getVncRecordedContainerImage()); + return DockerImageName.parse(getVncRecordedContainerImage()); } @Deprecated @@ -87,7 +87,7 @@ public String getDockerComposeContainerImage() { } public DockerImageName getDockerComposeDockerImageName() { - return new DockerImageName(getDockerComposeContainerImage()); + return DockerImageName.parse(getDockerComposeContainerImage()); } @Deprecated @@ -96,7 +96,7 @@ public String getTinyImage() { } public DockerImageName getTinyDockerImageName() { - return new DockerImageName(getTinyImage()); + return DockerImageName.parse(getTinyImage()); } public boolean isRyukPrivileged() { @@ -109,7 +109,7 @@ public String getRyukImage() { } public DockerImageName getRyukDockerImageName() { - return new DockerImageName(getRyukImage()); + return DockerImageName.parse(getRyukImage()); } @Deprecated @@ -118,7 +118,7 @@ public String getSSHdImage() { } public DockerImageName getSSHdDockerImageName() { - return new DockerImageName(getSSHdImage()); + return DockerImageName.parse(getSSHdImage()); } public Integer getRyukTimeout() { @@ -131,7 +131,7 @@ public String getKafkaImage() { } public DockerImageName getKafkaDockerImageName() { - return new DockerImageName(getKafkaImage()); + return DockerImageName.parse(getKafkaImage()); } @Deprecated @@ -140,7 +140,7 @@ public String getPulsarImage() { } public DockerImageName getPulsarDockerImageName() { - return new DockerImageName(getPulsarImage()); + return DockerImageName.parse(getPulsarImage()); } @Deprecated @@ -149,7 +149,7 @@ public String getLocalStackImage() { } public DockerImageName getLocalstackDockerImageName() { - return new DockerImageName(getLocalStackImage()); + return DockerImageName.parse(getLocalStackImage()); } public boolean isDisableChecks() { diff --git a/core/src/test/java/org/testcontainers/TestImages.java b/core/src/test/java/org/testcontainers/TestImages.java index dfacceb2a80..048777a7d55 100644 --- a/core/src/test/java/org/testcontainers/TestImages.java +++ b/core/src/test/java/org/testcontainers/TestImages.java @@ -4,9 +4,9 @@ import org.testcontainers.utility.TestcontainersConfiguration; public interface TestImages { - DockerImageName REDIS_IMAGE = new DockerImageName("redis:3.0.2"); - DockerImageName RABBITMQ_IMAGE = new DockerImageName("rabbitmq:3.5.3"); - DockerImageName MONGODB_IMAGE = new DockerImageName("mongo:3.1.5"); - DockerImageName ALPINE_IMAGE = new DockerImageName("alpine:3.2"); + DockerImageName REDIS_IMAGE = DockerImageName.parse("redis:3.0.2"); + DockerImageName RABBITMQ_IMAGE = DockerImageName.parse("rabbitmq:3.5.3"); + DockerImageName MONGODB_IMAGE = DockerImageName.parse("mongo:3.1.5"); + DockerImageName ALPINE_IMAGE = DockerImageName.parse("alpine:3.2"); DockerImageName TINY_IMAGE = TestcontainersConfiguration.getInstance().getTinyDockerImageName(); } diff --git a/core/src/test/java/org/testcontainers/dockerclient/ImagePullTest.java b/core/src/test/java/org/testcontainers/dockerclient/ImagePullTest.java index b8b7c116b34..fd936d26c19 100644 --- a/core/src/test/java/org/testcontainers/dockerclient/ImagePullTest.java +++ b/core/src/test/java/org/testcontainers/dockerclient/ImagePullTest.java @@ -35,7 +35,7 @@ public ImagePullTest(String image) { @Test public void test() { - try (final GenericContainer container = new GenericContainer<>(new DockerImageName(image)) + try (final GenericContainer container = new GenericContainer<>(DockerImageName.parse(image)) .withCommand("/bin/sh", "-c", "sleep 0") .withStartupCheckStrategy(new OneShotStartupCheckStrategy())) { container.start(); diff --git a/core/src/test/java/org/testcontainers/images/AgeBasedPullPolicyTest.java b/core/src/test/java/org/testcontainers/images/AgeBasedPullPolicyTest.java index 20b52798d40..e073fa0522a 100644 --- a/core/src/test/java/org/testcontainers/images/AgeBasedPullPolicyTest.java +++ b/core/src/test/java/org/testcontainers/images/AgeBasedPullPolicyTest.java @@ -13,7 +13,7 @@ public class AgeBasedPullPolicyTest { - final DockerImageName imageName = new DockerImageName(UUID.randomUUID().toString()); + final DockerImageName imageName = DockerImageName.parse(UUID.randomUUID().toString()); @Test public void shouldPull() { diff --git a/core/src/test/java/org/testcontainers/images/ImagePullPolicyTest.java b/core/src/test/java/org/testcontainers/images/ImagePullPolicyTest.java index 031c832562f..2a8d298be2b 100644 --- a/core/src/test/java/org/testcontainers/images/ImagePullPolicyTest.java +++ b/core/src/test/java/org/testcontainers/images/ImagePullPolicyTest.java @@ -26,7 +26,7 @@ public class ImagePullPolicyTest { @ClassRule - public static GenericContainer registry = new GenericContainer<>(new DockerImageName("registry:2.7.0")) + public static GenericContainer registry = new GenericContainer<>(DockerImageName.parse("registry:2.7.0")) .withExposedPorts(5000); private static String imageName; @@ -68,13 +68,13 @@ public void setUp() { } catch (NotFoundException ignored) { } - LocalImagesCache.INSTANCE.cache.remove(new DockerImageName(imageName)); + LocalImagesCache.INSTANCE.cache.remove(DockerImageName.parse(imageName)); } @Test public void pullsByDefault() { try ( - GenericContainer container = new GenericContainer(new DockerImageName(imageName)) + GenericContainer container = new GenericContainer(DockerImageName.parse(imageName)) .withStartupCheckStrategy(new OneShotStartupCheckStrategy()) ) { container.start(); @@ -84,7 +84,7 @@ public void pullsByDefault() { @Test public void shouldAlwaysPull() { try ( - GenericContainer container = new GenericContainer(new DockerImageName(imageName)) + GenericContainer container = new GenericContainer(DockerImageName.parse(imageName)) .withStartupCheckStrategy(new OneShotStartupCheckStrategy()) ) { container.start(); @@ -93,7 +93,7 @@ public void shouldAlwaysPull() { DockerClientFactory.instance().client().removeImageCmd(imageName).withForce(true).exec(); try ( - GenericContainer container = new GenericContainer(new DockerImageName(imageName)) + GenericContainer container = new GenericContainer(DockerImageName.parse(imageName)) .withStartupCheckStrategy(new OneShotStartupCheckStrategy()) ) { expectToFailWithNotFoundException(container); @@ -101,7 +101,7 @@ public void shouldAlwaysPull() { try ( // built_in_image_pull_policy { - GenericContainer container = new GenericContainer(new DockerImageName(imageName)) + GenericContainer container = new GenericContainer(DockerImageName.parse(imageName)) .withImagePullPolicy(PullPolicy.alwaysPull()) // } ) { @@ -114,7 +114,7 @@ public void shouldAlwaysPull() { public void shouldSupportCustomPolicies() { try ( // custom_image_pull_policy { - GenericContainer container = new GenericContainer(new DockerImageName(imageName)) + GenericContainer container = new GenericContainer(DockerImageName.parse(imageName)) .withImagePullPolicy(new AbstractImagePullPolicy() { @Override protected boolean shouldPullCached(DockerImageName imageName, ImageData localImageData) { @@ -137,7 +137,7 @@ protected boolean shouldPullCached(DockerImageName imageName, ImageData localIma } }); try ( - GenericContainer container = new GenericContainer(new DockerImageName(imageName)) + GenericContainer container = new GenericContainer(DockerImageName.parse(imageName)) .withImagePullPolicy(policy) .withStartupCheckStrategy(new OneShotStartupCheckStrategy()) ) { @@ -150,7 +150,7 @@ protected boolean shouldPullCached(DockerImageName imageName, ImageData localIma @Test public void shouldNotForcePulling() { try ( - GenericContainer container = new GenericContainer(new DockerImageName(imageName)) + GenericContainer container = new GenericContainer(DockerImageName.parse(imageName)) .withImagePullPolicy(__ -> false) .withStartupCheckStrategy(new OneShotStartupCheckStrategy()) ) { diff --git a/core/src/test/java/org/testcontainers/images/RemoteDockerImageTest.java b/core/src/test/java/org/testcontainers/images/RemoteDockerImageTest.java index bf2bc6ca532..d2ea3e7188a 100644 --- a/core/src/test/java/org/testcontainers/images/RemoteDockerImageTest.java +++ b/core/src/test/java/org/testcontainers/images/RemoteDockerImageTest.java @@ -18,7 +18,7 @@ public class RemoteDockerImageTest { @Test public void toStringContainsOnlyImageName() { String imageName = Base58.randomString(8).toLowerCase(); - RemoteDockerImage remoteDockerImage = new RemoteDockerImage(new DockerImageName(imageName)); + RemoteDockerImage remoteDockerImage = new RemoteDockerImage(DockerImageName.parse(imageName)); assertThat(remoteDockerImage.toString(), containsString("imageName=" + imageName)); } diff --git a/core/src/test/java/org/testcontainers/images/builder/DockerignoreTest.java b/core/src/test/java/org/testcontainers/images/builder/DockerignoreTest.java index 810100fea51..b99a70a7650 100644 --- a/core/src/test/java/org/testcontainers/images/builder/DockerignoreTest.java +++ b/core/src/test/java/org/testcontainers/images/builder/DockerignoreTest.java @@ -38,7 +38,7 @@ public void testValidDockerignore() throws Exception { .withFileFromPath(".", DockerfileBuildTest.RESOURCE_PATH) .withDockerfile(DockerfileBuildTest.RESOURCE_PATH.resolve("Dockerfile-currentdir")); try( - final GenericContainer container = new GenericContainer(new DockerImageName(img.get())) + final GenericContainer container = new GenericContainer(DockerImageName.parse(img.get())) .withStartupCheckStrategy(new OneShotStartupCheckStrategy()) .withCommand("ls", "/") ) { diff --git a/core/src/test/java/org/testcontainers/junit/NonExistentImagePullTest.java b/core/src/test/java/org/testcontainers/junit/NonExistentImagePullTest.java index 7c89e0f23a4..95047779551 100644 --- a/core/src/test/java/org/testcontainers/junit/NonExistentImagePullTest.java +++ b/core/src/test/java/org/testcontainers/junit/NonExistentImagePullTest.java @@ -17,7 +17,7 @@ public void pullingNonExistentImageFailsGracefully() { assertThrows("Pulling a nonexistent container will cause an exception to be thrown", ContainerFetchException.class, () -> { - new GenericContainer<>(new DockerImageName("testcontainers/nonexistent:latest")).getDockerImageName(); + new GenericContainer<>(DockerImageName.parse("testcontainers/nonexistent:latest")).getDockerImageName(); }); } } diff --git a/core/src/test/java/org/testcontainers/utility/AuthenticatedImagePullTest.java b/core/src/test/java/org/testcontainers/utility/AuthenticatedImagePullTest.java index 095385eb353..408c57427a1 100644 --- a/core/src/test/java/org/testcontainers/utility/AuthenticatedImagePullTest.java +++ b/core/src/test/java/org/testcontainers/utility/AuthenticatedImagePullTest.java @@ -69,7 +69,7 @@ public static void setUp() throws InterruptedException { testImageName = testRegistryAddress + "/alpine"; testImageNameWithTag = testImageName + ":latest"; - final DockerImageName expectedName = new DockerImageName(testImageNameWithTag); + final DockerImageName expectedName = DockerImageName.parse(testImageNameWithTag); final AuthConfig authConfig = new AuthConfig() .withUsername("testuser") .withPassword("notasecret") @@ -99,7 +99,7 @@ public static void tearDown() { @Test public void testThatAuthLocatorIsUsedForContainerCreation() { // actually start a container, which will require an authenticated pull - try (final GenericContainer container = new GenericContainer<>(new DockerImageName(testImageNameWithTag)) + try (final GenericContainer container = new GenericContainer<>(DockerImageName.parse(testImageNameWithTag)) .withCommand("/bin/sh", "-c", "sleep 10")) { container.start(); diff --git a/core/src/test/java/org/testcontainers/utility/DockerImageNameTest.java b/core/src/test/java/org/testcontainers/utility/DockerImageNameTest.java index 48d6e1af34c..b0ed9428a5d 100644 --- a/core/src/test/java/org/testcontainers/utility/DockerImageNameTest.java +++ b/core/src/test/java/org/testcontainers/utility/DockerImageNameTest.java @@ -35,7 +35,7 @@ public static String[] getNames() { @Test public void testValidNameAccepted() { - new DockerImageName(imageName).assertValid(); + DockerImageName.parse(imageName).assertValid(); } } @@ -56,7 +56,7 @@ public static String[] getNames() { @Test(expected = IllegalArgumentException.class) public void testInvalidNameRejected() { - new DockerImageName(imageName).assertValid(); + DockerImageName.parse(imageName).assertValid(); } } @@ -118,7 +118,7 @@ public void testParsing() { VisibleAssertions.context("For " + combined); VisibleAssertions.context("Using single-arg constructor:", 2); - final DockerImageName imageName = new DockerImageName(combined); + final DockerImageName imageName = DockerImageName.parse(combined); assertEquals(combined + " has registry address: " + registry, registry, imageName.getRegistry()); assertEquals(combined + " has unversioned part: " + unversionedPart, unversionedPart, imageName.getUnversionedPart()); if (version != null) { diff --git a/core/src/test/java/org/testcontainers/utility/RegistryAuthLocatorTest.java b/core/src/test/java/org/testcontainers/utility/RegistryAuthLocatorTest.java index e1cb595e903..a5e5ab4260d 100644 --- a/core/src/test/java/org/testcontainers/utility/RegistryAuthLocatorTest.java +++ b/core/src/test/java/org/testcontainers/utility/RegistryAuthLocatorTest.java @@ -18,7 +18,7 @@ public class RegistryAuthLocatorTest { public void lookupAuthConfigWithoutCredentials() throws URISyntaxException { final RegistryAuthLocator authLocator = createTestAuthLocator("config-empty.json"); - final AuthConfig authConfig = authLocator.lookupAuthConfig(new DockerImageName("unauthenticated.registry.org/org/repo"), new AuthConfig()); + final AuthConfig authConfig = authLocator.lookupAuthConfig(DockerImageName.parse("unauthenticated.registry.org/org/repo"), new AuthConfig()); assertEquals("Default docker registry URL is set on auth config", "https://index.docker.io/v1/", authConfig.getRegistryAddress()); assertNull("No username is set", authConfig.getUsername()); @@ -29,7 +29,7 @@ public void lookupAuthConfigWithoutCredentials() throws URISyntaxException { public void lookupAuthConfigWithBasicAuthCredentials() throws URISyntaxException { final RegistryAuthLocator authLocator = createTestAuthLocator("config-basic-auth.json"); - final AuthConfig authConfig = authLocator.lookupAuthConfig(new DockerImageName("registry.example.com/org/repo"), new AuthConfig()); + final AuthConfig authConfig = authLocator.lookupAuthConfig(DockerImageName.parse("registry.example.com/org/repo"), new AuthConfig()); assertEquals("Default docker registry URL is set on auth config", "https://registry.example.com", authConfig.getRegistryAddress()); assertEquals("Username is set", "user", authConfig.getUsername()); @@ -40,7 +40,7 @@ public void lookupAuthConfigWithBasicAuthCredentials() throws URISyntaxException public void lookupAuthConfigWithJsonKeyCredentials() throws URISyntaxException { final RegistryAuthLocator authLocator = createTestAuthLocator("config-with-json-key.json"); - final AuthConfig authConfig = authLocator.lookupAuthConfig(new DockerImageName("registry.example.com/org/repo"), new AuthConfig()); + final AuthConfig authConfig = authLocator.lookupAuthConfig(DockerImageName.parse("registry.example.com/org/repo"), new AuthConfig()); assertEquals("Default docker registry URL is set on auth config", "https://registry.example.com", authConfig.getRegistryAddress()); assertEquals("Username is set", "_json_key", authConfig.getUsername()); @@ -51,7 +51,7 @@ public void lookupAuthConfigWithJsonKeyCredentials() throws URISyntaxException { public void lookupAuthConfigUsingStore() throws URISyntaxException { final RegistryAuthLocator authLocator = createTestAuthLocator("config-with-store.json"); - final AuthConfig authConfig = authLocator.lookupAuthConfig(new DockerImageName("registry.example.com/org/repo"), new AuthConfig()); + final AuthConfig authConfig = authLocator.lookupAuthConfig(DockerImageName.parse("registry.example.com/org/repo"), new AuthConfig()); assertEquals("Correct server URL is obtained from a credential store", "url", authConfig.getRegistryAddress()); assertEquals("Correct username is obtained from a credential store", "username", authConfig.getUsername()); @@ -62,7 +62,7 @@ public void lookupAuthConfigUsingStore() throws URISyntaxException { public void lookupAuthConfigUsingHelper() throws URISyntaxException { final RegistryAuthLocator authLocator = createTestAuthLocator("config-with-helper.json"); - final AuthConfig authConfig = authLocator.lookupAuthConfig(new DockerImageName("registry.example.com/org/repo"), new AuthConfig()); + final AuthConfig authConfig = authLocator.lookupAuthConfig(DockerImageName.parse("registry.example.com/org/repo"), new AuthConfig()); assertEquals("Correct server URL is obtained from a credential store", "url", authConfig.getRegistryAddress()); assertEquals("Correct username is obtained from a credential store", "username", authConfig.getUsername()); @@ -73,7 +73,7 @@ public void lookupAuthConfigUsingHelper() throws URISyntaxException { public void lookupAuthConfigUsingHelperWithToken() throws URISyntaxException { final RegistryAuthLocator authLocator = createTestAuthLocator("config-with-helper-using-token.json"); - final AuthConfig authConfig = authLocator.lookupAuthConfig(new DockerImageName("registrytoken.example.com/org/repo"), new AuthConfig()); + final AuthConfig authConfig = authLocator.lookupAuthConfig(DockerImageName.parse("registrytoken.example.com/org/repo"), new AuthConfig()); assertEquals("Correct identitytoken is obtained from a credential store", "secret", authConfig.getIdentitytoken()); } @@ -82,7 +82,7 @@ public void lookupAuthConfigUsingHelperWithToken() throws URISyntaxException { public void lookupUsingHelperEmptyAuth() throws URISyntaxException { final RegistryAuthLocator authLocator = createTestAuthLocator("config-empty-auth-with-helper.json"); - final AuthConfig authConfig = authLocator.lookupAuthConfig(new DockerImageName("registry.example.com/org/repo"), new AuthConfig()); + final AuthConfig authConfig = authLocator.lookupAuthConfig(DockerImageName.parse("registry.example.com/org/repo"), new AuthConfig()); assertEquals("Correct server URL is obtained from a credential store", "url", authConfig.getRegistryAddress()); assertEquals("Correct username is obtained from a credential store", "username", authConfig.getUsername()); @@ -93,7 +93,7 @@ public void lookupUsingHelperEmptyAuth() throws URISyntaxException { public void lookupNonEmptyAuthWithHelper() throws URISyntaxException { final RegistryAuthLocator authLocator = createTestAuthLocator("config-existing-auth-with-helper.json"); - final AuthConfig authConfig = authLocator.lookupAuthConfig(new DockerImageName("registry.example.com/org/repo"), new AuthConfig()); + final AuthConfig authConfig = authLocator.lookupAuthConfig(DockerImageName.parse("registry.example.com/org/repo"), new AuthConfig()); assertEquals("Correct server URL is obtained from a credential helper", "url", authConfig.getRegistryAddress()); assertEquals("Correct username is obtained from a credential helper", "username", authConfig.getUsername()); @@ -105,7 +105,7 @@ public void lookupAuthConfigWithCredentialsNotFound() throws URISyntaxException Map notFoundMessagesReference = new HashMap<>(); final RegistryAuthLocator authLocator = createTestAuthLocator("config-with-store.json", notFoundMessagesReference); - DockerImageName dockerImageName = new DockerImageName("registry2.example.com/org/repo"); + DockerImageName dockerImageName = DockerImageName.parse("registry2.example.com/org/repo"); final AuthConfig authConfig = authLocator.lookupAuthConfig(dockerImageName, new AuthConfig()); assertNull("No username should have been obtained from a credential store", authConfig.getUsername()); @@ -124,7 +124,7 @@ public void lookupAuthConfigWithCredentialsNotFound() throws URISyntaxException public void lookupAuthConfigWithCredStoreEmpty() throws URISyntaxException { final RegistryAuthLocator authLocator = createTestAuthLocator("config-with-store-empty.json"); - DockerImageName dockerImageName = new DockerImageName("registry2.example.com/org/repo"); + DockerImageName dockerImageName = DockerImageName.parse("registry2.example.com/org/repo"); final AuthConfig authConfig = authLocator.lookupAuthConfig(dockerImageName, new AuthConfig()); assertNull("CredStore field will be ignored, because value is blank", authConfig.getAuth()); diff --git a/docs/examples/junit4/generic/src/test/java/generic/CmdModifierTest.java b/docs/examples/junit4/generic/src/test/java/generic/CmdModifierTest.java index 9140f560de3..56264d2768d 100644 --- a/docs/examples/junit4/generic/src/test/java/generic/CmdModifierTest.java +++ b/docs/examples/junit4/generic/src/test/java/generic/CmdModifierTest.java @@ -14,13 +14,13 @@ public class CmdModifierTest { // hostname { @Rule - public GenericContainer theCache = new GenericContainer<>(new DockerImageName("redis:3.0.2")) + public GenericContainer theCache = new GenericContainer<>(DockerImageName.parse("redis:3.0.2")) .withCreateContainerCmdModifier(cmd -> cmd.withHostName("the-cache")); // } // memory { @Rule - public GenericContainer memoryLimitedRedis = new GenericContainer<>(new DockerImageName("redis:3.0.2")) + public GenericContainer memoryLimitedRedis = new GenericContainer<>(DockerImageName.parse("redis:3.0.2")) .withCreateContainerCmdModifier(cmd -> cmd.withMemory((long) 8 * 1024 * 1024)) .withCreateContainerCmdModifier(cmd -> cmd.withMemorySwap((long) 12 * 1024 * 1024)); // } diff --git a/docs/examples/junit4/generic/src/test/java/generic/CommandsTest.java b/docs/examples/junit4/generic/src/test/java/generic/CommandsTest.java index 5b56c81f06f..23b265c26fa 100644 --- a/docs/examples/junit4/generic/src/test/java/generic/CommandsTest.java +++ b/docs/examples/junit4/generic/src/test/java/generic/CommandsTest.java @@ -10,7 +10,7 @@ public class CommandsTest { @Rule // startupCommand { - public GenericContainer redisWithCustomPort = new GenericContainer(new DockerImageName("redis:5.0")) + public GenericContainer redisWithCustomPort = new GenericContainer(DockerImageName.parse("redis:5.0")) .withCommand("redis-server --port 7777") // } .withExposedPorts(7777); diff --git a/docs/examples/junit4/generic/src/test/java/generic/ContainerCreationTest.java b/docs/examples/junit4/generic/src/test/java/generic/ContainerCreationTest.java index 934a7728734..b0e8c98a0e4 100644 --- a/docs/examples/junit4/generic/src/test/java/generic/ContainerCreationTest.java +++ b/docs/examples/junit4/generic/src/test/java/generic/ContainerCreationTest.java @@ -10,7 +10,7 @@ public class ContainerCreationTest { // simple { - public static final DockerImageName REDIS_IMAGE = new DockerImageName("redis:3.0.2"); + public static final DockerImageName REDIS_IMAGE = DockerImageName.parse("redis:3.0.2"); // } // simple { @@ -20,7 +20,7 @@ public class ContainerCreationTest { .withExposedPorts(6379); // } - public static final DockerImageName ALPINE_IMAGE = new DockerImageName("alpine:3.2"); + public static final DockerImageName ALPINE_IMAGE = DockerImageName.parse("alpine:3.2"); // withOptions { // Set up a plain OS container and customize environment, diff --git a/docs/examples/junit4/generic/src/test/java/generic/ContainerLabelTest.java b/docs/examples/junit4/generic/src/test/java/generic/ContainerLabelTest.java index 0bb178767d2..ca0878e89d4 100644 --- a/docs/examples/junit4/generic/src/test/java/generic/ContainerLabelTest.java +++ b/docs/examples/junit4/generic/src/test/java/generic/ContainerLabelTest.java @@ -8,7 +8,7 @@ public class ContainerLabelTest { // single_label { - public GenericContainer containerWithLabel = new GenericContainer(new DockerImageName("alpine:3.6")) + public GenericContainer containerWithLabel = new GenericContainer(DockerImageName.parse("alpine:3.6")) .withLabel("key", "value"); // } @@ -17,7 +17,7 @@ public class ContainerLabelTest { private Map mapOfLabels = new HashMap<>(); // populate map, e.g. mapOfLabels.put("key1", "value1"); - public GenericContainer containerWithMultipleLabels = new GenericContainer(new DockerImageName("alpine:3.6")) + public GenericContainer containerWithMultipleLabels = new GenericContainer(DockerImageName.parse("alpine:3.6")) .withLabels(mapOfLabels); // } } diff --git a/docs/examples/junit4/generic/src/test/java/generic/ExecTest.java b/docs/examples/junit4/generic/src/test/java/generic/ExecTest.java index a40e96f31e1..e35ae18af70 100644 --- a/docs/examples/junit4/generic/src/test/java/generic/ExecTest.java +++ b/docs/examples/junit4/generic/src/test/java/generic/ExecTest.java @@ -13,7 +13,7 @@ public class ExecTest { @Rule - public GenericContainer container = new GenericContainer<>(new DockerImageName("alpine:3.6")) + public GenericContainer container = new GenericContainer<>(DockerImageName.parse("alpine:3.6")) .withCommand("top"); @Test diff --git a/docs/examples/junit4/generic/src/test/java/generic/MultiplePortsExposedTest.java b/docs/examples/junit4/generic/src/test/java/generic/MultiplePortsExposedTest.java index ac717685456..329fd8d8e19 100644 --- a/docs/examples/junit4/generic/src/test/java/generic/MultiplePortsExposedTest.java +++ b/docs/examples/junit4/generic/src/test/java/generic/MultiplePortsExposedTest.java @@ -15,7 +15,7 @@ public class MultiplePortsExposedTest { @Rule // rule { - public GenericContainer container = new GenericContainer(new DockerImageName("orientdb:3.0.13")) + public GenericContainer container = new GenericContainer(DockerImageName.parse("orientdb:3.0.13")) .withExposedPorts(2424, 2480) .withLogConsumer(new Slf4jLogConsumer(log)); // } diff --git a/docs/examples/junit4/generic/src/test/java/generic/WaitStrategiesTest.java b/docs/examples/junit4/generic/src/test/java/generic/WaitStrategiesTest.java index b102826d6be..d45b1e28c47 100644 --- a/docs/examples/junit4/generic/src/test/java/generic/WaitStrategiesTest.java +++ b/docs/examples/junit4/generic/src/test/java/generic/WaitStrategiesTest.java @@ -14,20 +14,20 @@ public class WaitStrategiesTest { @Rule // waitForNetworkListening { - public GenericContainer nginx = new GenericContainer(new DockerImageName("nginx:1.9.4")) + public GenericContainer nginx = new GenericContainer(DockerImageName.parse("nginx:1.9.4")) .withExposedPorts(80); // } @Rule // waitForSimpleHttp { - public GenericContainer nginxWithHttpWait = new GenericContainer(new DockerImageName("nginx:1.9.4")) + public GenericContainer nginxWithHttpWait = new GenericContainer(DockerImageName.parse("nginx:1.9.4")) .withExposedPorts(80) .waitingFor(Wait.forHttp("/")); // } @Rule // logMessageWait { - public GenericContainer containerWithLogWait = new GenericContainer(new DockerImageName("redis:5.0.3")) + public GenericContainer containerWithLogWait = new GenericContainer(DockerImageName.parse("redis:5.0.3")) .withExposedPorts(6379) .waitingFor( Wait.forLogMessage(".*Ready to accept connections.*\\n", 1) diff --git a/docs/examples/junit4/generic/src/test/java/org/testcontainers/containers/startupcheck/StartupCheckStrategyTest.java b/docs/examples/junit4/generic/src/test/java/org/testcontainers/containers/startupcheck/StartupCheckStrategyTest.java index c57b013362f..0e72efb5723 100644 --- a/docs/examples/junit4/generic/src/test/java/org/testcontainers/containers/startupcheck/StartupCheckStrategyTest.java +++ b/docs/examples/junit4/generic/src/test/java/org/testcontainers/containers/startupcheck/StartupCheckStrategyTest.java @@ -36,7 +36,7 @@ private static void waitForHello(GenericContainer container) throws TimeoutExcep public static class OneShotStrategyTest { @Rule // withOneShotStrategy { - public GenericContainer bboxWithOneShot = new GenericContainer<>(new DockerImageName("busybox:1.31.1")) + public GenericContainer bboxWithOneShot = new GenericContainer<>(DockerImageName.parse("busybox:1.31.1")) .withCommand(String.format("echo %s", HELLO_TESTCONTAINERS)) .withStartupCheckStrategy( new OneShotStartupCheckStrategy().withTimeout(Duration.ofSeconds(3)) @@ -55,7 +55,7 @@ public void testCommandIsExecuted() { public static class IndefiniteOneShotStrategyTest { @Rule // withIndefiniteOneShotStrategy { - public GenericContainer bboxWithIndefiniteOneShot = new GenericContainer<>(new DockerImageName("busybox:1.31.1")) + public GenericContainer bboxWithIndefiniteOneShot = new GenericContainer<>(DockerImageName.parse("busybox:1.31.1")) .withCommand("sh", "-c", String.format("sleep 5 && echo \"%s\"", HELLO_TESTCONTAINERS)) .withStartupCheckStrategy( new IndefiniteWaitOneShotStartupCheckStrategy() @@ -74,7 +74,7 @@ public void testCommandIsExecuted() { public static class MinimumDurationStrategyTest { @Rule // withMinimumDurationStrategy { - public GenericContainer bboxWithMinimumDuration = new GenericContainer<>(new DockerImageName("busybox:1.31.1")) + public GenericContainer bboxWithMinimumDuration = new GenericContainer<>(DockerImageName.parse("busybox:1.31.1")) .withCommand("sh", "-c", String.format("sleep 5 && echo \"%s\"", HELLO_TESTCONTAINERS)) .withStartupCheckStrategy( new MinimumDurationRunningStartupCheckStrategy(Duration.ofSeconds(1)) diff --git a/docs/examples/junit4/redis/src/test/java/quickstart/RedisBackedCacheIntTest.java b/docs/examples/junit4/redis/src/test/java/quickstart/RedisBackedCacheIntTest.java index fe364ab4a81..cbb49b5fdb3 100644 --- a/docs/examples/junit4/redis/src/test/java/quickstart/RedisBackedCacheIntTest.java +++ b/docs/examples/junit4/redis/src/test/java/quickstart/RedisBackedCacheIntTest.java @@ -15,7 +15,7 @@ public class RedisBackedCacheIntTest { // rule { @Rule - public GenericContainer redis = new GenericContainer(new DockerImageName("redis:5.0.3-alpine")) + public GenericContainer redis = new GenericContainer(DockerImageName.parse("redis:5.0.3-alpine")) .withExposedPorts(6379); // } diff --git a/docs/examples/junit5/redis/src/test/java/quickstart/RedisBackedCacheIntTest.java b/docs/examples/junit5/redis/src/test/java/quickstart/RedisBackedCacheIntTest.java index da0a55cb536..9a3855ba23c 100644 --- a/docs/examples/junit5/redis/src/test/java/quickstart/RedisBackedCacheIntTest.java +++ b/docs/examples/junit5/redis/src/test/java/quickstart/RedisBackedCacheIntTest.java @@ -18,7 +18,7 @@ public class RedisBackedCacheIntTest { // container { @Container - public GenericContainer redis = new GenericContainer(new DockerImageName("redis:5.0.3-alpine")) + public GenericContainer redis = new GenericContainer(DockerImageName.parse("redis:5.0.3-alpine")) .withExposedPorts(6379); // } diff --git a/docs/features/creating_container.md b/docs/features/creating_container.md index 85d799f0fef..40b50e67f17 100644 --- a/docs/features/creating_container.md +++ b/docs/features/creating_container.md @@ -12,7 +12,7 @@ images as temporary test dependencies. For example, if you might use it to test With a generic container, you set the container image using a parameter to the rule constructor, e.g.: ```java -new GenericContainer(new DockerImageName("jboss/wildfly:9.0.1.Final")) +new GenericContainer(DockerImageName.of("jboss/wildfly:9.0.1.Final")) ``` ### Specifying an image diff --git a/examples/disque-job-queue/src/test/java/DisqueBackedMailSenderTest.java b/examples/disque-job-queue/src/test/java/DisqueBackedMailSenderTest.java index f6eed324304..8eccdb90b4c 100644 --- a/examples/disque-job-queue/src/test/java/DisqueBackedMailSenderTest.java +++ b/examples/disque-job-queue/src/test/java/DisqueBackedMailSenderTest.java @@ -22,7 +22,7 @@ public class DisqueBackedMailSenderTest { @Rule - public GenericContainer container = new GenericContainer<>(new DockerImageName("richnorth/disque:1.0-rc1")) + public GenericContainer container = new GenericContainer<>(DockerImageName.of("richnorth/disque:1.0-rc1")) .withExposedPorts(7711); private DisqueClient disqueClient; diff --git a/examples/disque-job-queue/src/test/java/SingleDisqueInstanceTest.java b/examples/disque-job-queue/src/test/java/SingleDisqueInstanceTest.java index 30e3aa84066..f1e13b0efd0 100644 --- a/examples/disque-job-queue/src/test/java/SingleDisqueInstanceTest.java +++ b/examples/disque-job-queue/src/test/java/SingleDisqueInstanceTest.java @@ -22,7 +22,7 @@ public class SingleDisqueInstanceTest { @Rule - public GenericContainer container = new GenericContainer<>(new DockerImageName("richnorth/disque:1.0-rc1")) + public GenericContainer container = new GenericContainer<>(DockerImageName.of("richnorth/disque:1.0-rc1")) .withExposedPorts(7711); private DisqueCommands connection; private AddJobArgs retryAfter1Second; diff --git a/examples/linked-container/src/test/java/com/example/linkedcontainer/LinkedContainerTestImages.java b/examples/linked-container/src/test/java/com/example/linkedcontainer/LinkedContainerTestImages.java index de1c4fc8de0..0936401d870 100644 --- a/examples/linked-container/src/test/java/com/example/linkedcontainer/LinkedContainerTestImages.java +++ b/examples/linked-container/src/test/java/com/example/linkedcontainer/LinkedContainerTestImages.java @@ -3,6 +3,6 @@ import org.testcontainers.utility.DockerImageName; public interface LinkedContainerTestImages { - DockerImageName POSTGRES_TEST_IMAGE = new DockerImageName("postgres:9.6.12"); - DockerImageName REDMINE_TEST_IMAGE = new DockerImageName("redmine:3.3.2"); + DockerImageName POSTGRES_TEST_IMAGE = DockerImageName.of("postgres:9.6.12"); + DockerImageName REDMINE_TEST_IMAGE = DockerImageName.of("redmine:3.3.2"); } diff --git a/examples/mongodb-container/src/test/java/org/testcontainers/containers/MongoDbContainer.java b/examples/mongodb-container/src/test/java/org/testcontainers/containers/MongoDbContainer.java index 7341c9771d8..567eea7bcb2 100644 --- a/examples/mongodb-container/src/test/java/org/testcontainers/containers/MongoDbContainer.java +++ b/examples/mongodb-container/src/test/java/org/testcontainers/containers/MongoDbContainer.java @@ -40,7 +40,7 @@ public MongoDbContainer() { */ @Deprecated public MongoDbContainer(@NotNull String image) { - this(new DockerImageName(image)); + this(DockerImageName.of(image)); } /** diff --git a/examples/mongodb-container/src/test/java/org/testcontainers/containers/MongoDbContainerTest.java b/examples/mongodb-container/src/test/java/org/testcontainers/containers/MongoDbContainerTest.java index ec4f6cb5bcc..d2e3d6fd2a4 100644 --- a/examples/mongodb-container/src/test/java/org/testcontainers/containers/MongoDbContainerTest.java +++ b/examples/mongodb-container/src/test/java/org/testcontainers/containers/MongoDbContainerTest.java @@ -11,7 +11,7 @@ public class MongoDbContainerTest { @Test public void containerStartsAndPublicPortIsAvailable() { - try (MongoDbContainer container = new MongoDbContainer(new DockerImageName("mongo:4.0"))) { + try (MongoDbContainer container = new MongoDbContainer(DockerImageName.of("mongo:4.0"))) { container.start(); assertThatPortIsAvailable(container); } diff --git a/examples/redis-backed-cache-testng/src/test/java/RedisBackedCacheTest.java b/examples/redis-backed-cache-testng/src/test/java/RedisBackedCacheTest.java index 92ea85e8c9a..728d06da00f 100644 --- a/examples/redis-backed-cache-testng/src/test/java/RedisBackedCacheTest.java +++ b/examples/redis-backed-cache-testng/src/test/java/RedisBackedCacheTest.java @@ -19,7 +19,7 @@ */ public class RedisBackedCacheTest { - private static GenericContainer redis = new GenericContainer<>(new DockerImageName("redis:3.0.6")).withExposedPorts(6379); + private static GenericContainer redis = new GenericContainer<>(DockerImageName.of("redis:3.0.6")).withExposedPorts(6379); private Cache cache; diff --git a/examples/redis-backed-cache/src/test/java/RedisBackedCacheTest.java b/examples/redis-backed-cache/src/test/java/RedisBackedCacheTest.java index 823742cd862..52cfbaaad82 100644 --- a/examples/redis-backed-cache/src/test/java/RedisBackedCacheTest.java +++ b/examples/redis-backed-cache/src/test/java/RedisBackedCacheTest.java @@ -19,7 +19,7 @@ public class RedisBackedCacheTest { @Rule - public GenericContainer redis = new GenericContainer<>(new DockerImageName("redis:3.0.6")) + public GenericContainer redis = new GenericContainer<>(DockerImageName.of("redis:3.0.6")) .withExposedPorts(6379); private Cache cache; diff --git a/examples/singleton-container/src/test/java/com/example/AbstractIntegrationTest.java b/examples/singleton-container/src/test/java/com/example/AbstractIntegrationTest.java index e6482e6c03e..8c1ad3034c4 100644 --- a/examples/singleton-container/src/test/java/com/example/AbstractIntegrationTest.java +++ b/examples/singleton-container/src/test/java/com/example/AbstractIntegrationTest.java @@ -5,7 +5,7 @@ public abstract class AbstractIntegrationTest { - public static final GenericContainer redis = new GenericContainer<>(new DockerImageName("redis:3.0.6")) + public static final GenericContainer redis = new GenericContainer<>(DockerImageName.of("redis:3.0.6")) .withExposedPorts(6379); static { diff --git a/examples/solr-container/src/test/java/com/example/SolrQueryTest.java b/examples/solr-container/src/test/java/com/example/SolrQueryTest.java index afdfa2be0f4..269d91a8a64 100644 --- a/examples/solr-container/src/test/java/com/example/SolrQueryTest.java +++ b/examples/solr-container/src/test/java/com/example/SolrQueryTest.java @@ -20,7 +20,7 @@ public class SolrQueryTest { - private static final DockerImageName SOLR_IMAGE = new DockerImageName("solr:8.3.0"); + private static final DockerImageName SOLR_IMAGE = DockerImageName.of("solr:8.3.0"); public static final SolrContainer solrContainer = new SolrContainer(SOLR_IMAGE) .withCollection(COLLECTION_NAME); diff --git a/examples/spring-boot/src/test/java/com/example/AbstractIntegrationTest.java b/examples/spring-boot/src/test/java/com/example/AbstractIntegrationTest.java index 9539a054328..5c98588e062 100644 --- a/examples/spring-boot/src/test/java/com/example/AbstractIntegrationTest.java +++ b/examples/spring-boot/src/test/java/com/example/AbstractIntegrationTest.java @@ -17,7 +17,7 @@ @ActiveProfiles("test") public abstract class AbstractIntegrationTest { - static GenericContainer redis = new GenericContainer<>(new DockerImageName("redis:3-alpine")) + static GenericContainer redis = new GenericContainer<>(DockerImageName.of("redis:3-alpine")) .withExposedPorts(6379); @DynamicPropertySource diff --git a/modules/cassandra/src/main/java/org/testcontainers/containers/CassandraContainer.java b/modules/cassandra/src/main/java/org/testcontainers/containers/CassandraContainer.java index 9f3614f568f..681c58f4efb 100644 --- a/modules/cassandra/src/main/java/org/testcontainers/containers/CassandraContainer.java +++ b/modules/cassandra/src/main/java/org/testcontainers/containers/CassandraContainer.java @@ -50,7 +50,7 @@ public CassandraContainer() { */ @Deprecated public CassandraContainer(String dockerImageName) { - this(new DockerImageName(dockerImageName)); + this(DockerImageName.parse(dockerImageName)); } public CassandraContainer(DockerImageName dockerImageName) { diff --git a/modules/cassandra/src/test/java/org/testcontainers/containers/CassandraContainerTest.java b/modules/cassandra/src/test/java/org/testcontainers/containers/CassandraContainerTest.java index b08db1f052d..76c8c8438d7 100644 --- a/modules/cassandra/src/test/java/org/testcontainers/containers/CassandraContainerTest.java +++ b/modules/cassandra/src/test/java/org/testcontainers/containers/CassandraContainerTest.java @@ -19,7 +19,7 @@ @Slf4j public class CassandraContainerTest { - private static final DockerImageName CASSANDRA_IMAGE = new DockerImageName("cassandra:3.11.2"); + private static final DockerImageName CASSANDRA_IMAGE = DockerImageName.parse("cassandra:3.11.2"); private static final String TEST_CLUSTER_NAME_IN_CONF = "Test Cluster Integration Test"; @@ -81,7 +81,7 @@ public void testInitScript() { @Test public void testInitScriptWithLegacyCassandra() { try ( - CassandraContainer cassandraContainer = new CassandraContainer<>(new DockerImageName("cassandra:2.2.11")) + CassandraContainer cassandraContainer = new CassandraContainer<>(DockerImageName.parse("cassandra:2.2.11")) .withInitScript("initial.cql") ) { cassandraContainer.start(); diff --git a/modules/clickhouse/src/main/java/org/testcontainers/containers/ClickHouseContainer.java b/modules/clickhouse/src/main/java/org/testcontainers/containers/ClickHouseContainer.java index 4851b441624..6bdcff7b3f2 100644 --- a/modules/clickhouse/src/main/java/org/testcontainers/containers/ClickHouseContainer.java +++ b/modules/clickhouse/src/main/java/org/testcontainers/containers/ClickHouseContainer.java @@ -35,7 +35,7 @@ public ClickHouseContainer() { */ @Deprecated public ClickHouseContainer(String dockerImageName) { - this(new DockerImageName(dockerImageName)); + this(DockerImageName.parse(dockerImageName)); } public ClickHouseContainer(final DockerImageName dockerImageName) { diff --git a/modules/clickhouse/src/main/java/org/testcontainers/containers/ClickHouseProvider.java b/modules/clickhouse/src/main/java/org/testcontainers/containers/ClickHouseProvider.java index 297cf888c90..cd2453b8349 100644 --- a/modules/clickhouse/src/main/java/org/testcontainers/containers/ClickHouseProvider.java +++ b/modules/clickhouse/src/main/java/org/testcontainers/containers/ClickHouseProvider.java @@ -10,6 +10,6 @@ public boolean supports(String databaseType) { @Override public JdbcDatabaseContainer newInstance(String tag) { - return new ClickHouseContainer(new DockerImageName(ClickHouseContainer.IMAGE, tag)); + return new ClickHouseContainer(DockerImageName.parse(ClickHouseContainer.IMAGE).withTag(tag)); } } diff --git a/modules/clickhouse/src/test/java/org/testcontainers/ClickhouseTestImages.java b/modules/clickhouse/src/test/java/org/testcontainers/ClickhouseTestImages.java index b1662f41edd..961df045bd1 100644 --- a/modules/clickhouse/src/test/java/org/testcontainers/ClickhouseTestImages.java +++ b/modules/clickhouse/src/test/java/org/testcontainers/ClickhouseTestImages.java @@ -3,5 +3,5 @@ import org.testcontainers.utility.DockerImageName; public interface ClickhouseTestImages { - DockerImageName CLICKHOUSE_IMAGE = new DockerImageName("yandex/clickhouse-server:18.10.3"); + DockerImageName CLICKHOUSE_IMAGE = DockerImageName.parse("yandex/clickhouse-server:18.10.3"); } diff --git a/modules/cockroachdb/src/main/java/org/testcontainers/containers/CockroachContainer.java b/modules/cockroachdb/src/main/java/org/testcontainers/containers/CockroachContainer.java index 330155bad71..54420155f05 100644 --- a/modules/cockroachdb/src/main/java/org/testcontainers/containers/CockroachContainer.java +++ b/modules/cockroachdb/src/main/java/org/testcontainers/containers/CockroachContainer.java @@ -32,7 +32,7 @@ public CockroachContainer() { */ @Deprecated public CockroachContainer(final String dockerImageName) { - this(new DockerImageName(dockerImageName)); + this(DockerImageName.parse(dockerImageName)); } public CockroachContainer(final DockerImageName dockerImageName) { diff --git a/modules/cockroachdb/src/main/java/org/testcontainers/containers/CockroachContainerProvider.java b/modules/cockroachdb/src/main/java/org/testcontainers/containers/CockroachContainerProvider.java index 9883e3b1932..deebbd66392 100644 --- a/modules/cockroachdb/src/main/java/org/testcontainers/containers/CockroachContainerProvider.java +++ b/modules/cockroachdb/src/main/java/org/testcontainers/containers/CockroachContainerProvider.java @@ -15,6 +15,6 @@ public JdbcDatabaseContainer newInstance() { @Override public JdbcDatabaseContainer newInstance(String tag) { - return new CockroachContainer(new DockerImageName(CockroachContainer.IMAGE, tag)); + return new CockroachContainer(DockerImageName.parse(CockroachContainer.IMAGE).withTag(tag)); } } diff --git a/modules/cockroachdb/src/test/java/org/testcontainers/CockroachDBTestImages.java b/modules/cockroachdb/src/test/java/org/testcontainers/CockroachDBTestImages.java index 0d6084e1a69..a309f84e098 100644 --- a/modules/cockroachdb/src/test/java/org/testcontainers/CockroachDBTestImages.java +++ b/modules/cockroachdb/src/test/java/org/testcontainers/CockroachDBTestImages.java @@ -3,5 +3,5 @@ import org.testcontainers.utility.DockerImageName; public interface CockroachDBTestImages { - DockerImageName COCKROACHDB_IMAGE = new DockerImageName("cockroachdb/cockroach:v19.1.1"); + DockerImageName COCKROACHDB_IMAGE = DockerImageName.parse("cockroachdb/cockroach:v19.1.1"); } diff --git a/modules/couchbase/src/main/java/org/testcontainers/couchbase/CouchbaseContainer.java b/modules/couchbase/src/main/java/org/testcontainers/couchbase/CouchbaseContainer.java index 104f4d13536..21749065f54 100644 --- a/modules/couchbase/src/main/java/org/testcontainers/couchbase/CouchbaseContainer.java +++ b/modules/couchbase/src/main/java/org/testcontainers/couchbase/CouchbaseContainer.java @@ -103,7 +103,7 @@ public CouchbaseContainer() { */ @Deprecated public CouchbaseContainer(final String dockerImageName) { - this(new DockerImageName(dockerImageName)); + this(DockerImageName.parse(dockerImageName)); } /** diff --git a/modules/couchbase/src/test/java/org/testcontainers/couchbase/CouchbaseContainerTest.java b/modules/couchbase/src/test/java/org/testcontainers/couchbase/CouchbaseContainerTest.java index 8d251d8b0a4..3a4438c1fc6 100644 --- a/modules/couchbase/src/test/java/org/testcontainers/couchbase/CouchbaseContainerTest.java +++ b/modules/couchbase/src/test/java/org/testcontainers/couchbase/CouchbaseContainerTest.java @@ -31,7 +31,7 @@ public class CouchbaseContainerTest { - private static final DockerImageName COUCHBASE_IMAGE = new DockerImageName("couchbase/server:6.5.1"); + private static final DockerImageName COUCHBASE_IMAGE = DockerImageName.parse("couchbase/server:6.5.1"); @Test public void testBasicContainerUsage() { diff --git a/modules/db2/src/main/java/org/testcontainers/containers/Db2Container.java b/modules/db2/src/main/java/org/testcontainers/containers/Db2Container.java index 67288ce6a37..aa6d136aaec 100644 --- a/modules/db2/src/main/java/org/testcontainers/containers/Db2Container.java +++ b/modules/db2/src/main/java/org/testcontainers/containers/Db2Container.java @@ -33,7 +33,7 @@ public Db2Container() { */ @Deprecated public Db2Container(String dockerImageName) { - this(new DockerImageName(dockerImageName)); + this(DockerImageName.parse(dockerImageName)); } public Db2Container(final DockerImageName dockerImageName) { diff --git a/modules/db2/src/main/java/org/testcontainers/containers/Db2ContainerProvider.java b/modules/db2/src/main/java/org/testcontainers/containers/Db2ContainerProvider.java index d1a204f76c0..618b97c3ca6 100644 --- a/modules/db2/src/main/java/org/testcontainers/containers/Db2ContainerProvider.java +++ b/modules/db2/src/main/java/org/testcontainers/containers/Db2ContainerProvider.java @@ -15,6 +15,6 @@ public JdbcDatabaseContainer newInstance() { @Override public JdbcDatabaseContainer newInstance(String tag) { - return new Db2Container(new DockerImageName(Db2Container.DEFAULT_DB2_IMAGE_NAME, tag)); + return new Db2Container(DockerImageName.parse(Db2Container.DEFAULT_DB2_IMAGE_NAME).withTag(tag)); } } diff --git a/modules/db2/src/test/java/org/testcontainers/Db2TestImages.java b/modules/db2/src/test/java/org/testcontainers/Db2TestImages.java index 4aedcc2a7c8..b0bfc869272 100644 --- a/modules/db2/src/test/java/org/testcontainers/Db2TestImages.java +++ b/modules/db2/src/test/java/org/testcontainers/Db2TestImages.java @@ -3,5 +3,5 @@ import org.testcontainers.utility.DockerImageName; public interface Db2TestImages { - DockerImageName DB2_IMAGE = new DockerImageName("ibmcom/db2:11.5.0.0a"); + DockerImageName DB2_IMAGE = DockerImageName.parse("ibmcom/db2:11.5.0.0a"); } diff --git a/modules/dynalite/src/main/java/org/testcontainers/dynamodb/DynaliteContainer.java b/modules/dynalite/src/main/java/org/testcontainers/dynamodb/DynaliteContainer.java index a3013516c34..6063c1a5dbe 100644 --- a/modules/dynalite/src/main/java/org/testcontainers/dynamodb/DynaliteContainer.java +++ b/modules/dynalite/src/main/java/org/testcontainers/dynamodb/DynaliteContainer.java @@ -31,7 +31,7 @@ public DynaliteContainer() { */ @Deprecated public DynaliteContainer(String dockerImageName) { - this(new DockerImageName(dockerImageName)); + this(DockerImageName.parse(dockerImageName)); } public DynaliteContainer(final DockerImageName dockerImageName) { diff --git a/modules/dynalite/src/test/java/org/testcontainers/dynamodb/DynaliteContainerTest.java b/modules/dynalite/src/test/java/org/testcontainers/dynamodb/DynaliteContainerTest.java index 229433770ae..0b440939139 100644 --- a/modules/dynalite/src/test/java/org/testcontainers/dynamodb/DynaliteContainerTest.java +++ b/modules/dynalite/src/test/java/org/testcontainers/dynamodb/DynaliteContainerTest.java @@ -18,7 +18,7 @@ public class DynaliteContainerTest { - private static final DockerImageName DYNALITE_IMAGE = new DockerImageName("quay.io/testcontainers/dynalite:v1.2.1-1"); + private static final DockerImageName DYNALITE_IMAGE = DockerImageName.parse("quay.io/testcontainers/dynalite:v1.2.1-1"); @Rule public DynaliteContainer dynamoDB = new DynaliteContainer(DYNALITE_IMAGE); diff --git a/modules/elasticsearch/src/main/java/org/testcontainers/elasticsearch/ElasticsearchContainer.java b/modules/elasticsearch/src/main/java/org/testcontainers/elasticsearch/ElasticsearchContainer.java index c65d9ec0e90..6ad0172269d 100644 --- a/modules/elasticsearch/src/main/java/org/testcontainers/elasticsearch/ElasticsearchContainer.java +++ b/modules/elasticsearch/src/main/java/org/testcontainers/elasticsearch/ElasticsearchContainer.java @@ -52,7 +52,7 @@ public ElasticsearchContainer() { */ @Deprecated public ElasticsearchContainer(String dockerImageName) { - this(new DockerImageName(dockerImageName)); + this(DockerImageName.parse(dockerImageName)); } public ElasticsearchContainer(final DockerImageName dockerImageName) { diff --git a/modules/elasticsearch/src/test/java/org/testcontainers/elasticsearch/ElasticsearchContainerTest.java b/modules/elasticsearch/src/test/java/org/testcontainers/elasticsearch/ElasticsearchContainerTest.java index 707ed95d07e..2e617691646 100644 --- a/modules/elasticsearch/src/test/java/org/testcontainers/elasticsearch/ElasticsearchContainerTest.java +++ b/modules/elasticsearch/src/test/java/org/testcontainers/elasticsearch/ElasticsearchContainerTest.java @@ -34,7 +34,10 @@ public class ElasticsearchContainerTest { * Elasticsearch version which should be used for the Tests */ private static final String ELASTICSEARCH_VERSION = Version.CURRENT.toString(); - private static final DockerImageName ELASTICSEARCH_IMAGE = new DockerImageName("docker.elastic.co/elasticsearch/elasticsearch", ELASTICSEARCH_VERSION); + private static final DockerImageName ELASTICSEARCH_IMAGE = + DockerImageName + .parse("docker.elastic.co/elasticsearch/elasticsearch") + .withTag(ELASTICSEARCH_VERSION); /** * Elasticsearch default username, when secured with a license > basic @@ -93,9 +96,13 @@ public void elasticsearchVersion() throws IOException { @Test public void elasticsearchOssImage() throws IOException { try (ElasticsearchContainer container = - // oosContainer { - new ElasticsearchContainer(new DockerImageName("docker.elastic.co/elasticsearch/elasticsearch-oss", ELASTICSEARCH_VERSION)) - // } + // oosContainer { + new ElasticsearchContainer( + DockerImageName + .parse("docker.elastic.co/elasticsearch/elasticsearch-oss") + .withTag(ELASTICSEARCH_VERSION) + ) + // } ) { container.start(); Response response = getClient(container).performRequest(new Request("GET", "/")); @@ -126,10 +133,10 @@ public void restClientClusterHealth() throws IOException { .build(); Response response = client.performRequest(new Request("GET", "/_cluster/health")); - // }} + // }} assertThat(response.getStatusLine().getStatusCode(), is(200)); assertThat(EntityUtils.toString(response.getEntity()), containsString("cluster_name")); - // httpClientContainer {{ + // httpClientContainer {{ } // } } @@ -138,7 +145,11 @@ public void restClientClusterHealth() throws IOException { public void transportClientClusterHealth() { // transportClientContainer { // Create the elasticsearch container. - try (ElasticsearchContainer container = new ElasticsearchContainer(new DockerImageName("docker.elastic.co/elasticsearch/elasticsearch", "6.4.1"))) { + try (ElasticsearchContainer container = new ElasticsearchContainer( + DockerImageName + .parse("docker.elastic.co/elasticsearch/elasticsearch") + .withTag("6.4.1") + )){ // Start the container. This step might take some time... container.start(); diff --git a/modules/influxdb/src/main/java/org/testcontainers/containers/InfluxDBContainer.java b/modules/influxdb/src/main/java/org/testcontainers/containers/InfluxDBContainer.java index 0dfdaf39a8d..5d883fea9a7 100644 --- a/modules/influxdb/src/main/java/org/testcontainers/containers/InfluxDBContainer.java +++ b/modules/influxdb/src/main/java/org/testcontainers/containers/InfluxDBContainer.java @@ -40,7 +40,7 @@ public InfluxDBContainer() { */ @Deprecated public InfluxDBContainer(final String version) { - this(new DockerImageName(IMAGE_NAME + ":" + version)); + this(DockerImageName.parse(IMAGE_NAME + ":" + version)); } public InfluxDBContainer(final DockerImageName dockerImageName) { diff --git a/modules/influxdb/src/test/java/org/testcontainers/containers/InfluxDBTestImages.java b/modules/influxdb/src/test/java/org/testcontainers/containers/InfluxDBTestImages.java index 8b0252cb60c..a0e2d31bbdf 100644 --- a/modules/influxdb/src/test/java/org/testcontainers/containers/InfluxDBTestImages.java +++ b/modules/influxdb/src/test/java/org/testcontainers/containers/InfluxDBTestImages.java @@ -3,5 +3,5 @@ import org.testcontainers.utility.DockerImageName; public interface InfluxDBTestImages { - DockerImageName INFLUXDB_TEST_IMAGE = new DockerImageName("influxdb:1.4.3"); + DockerImageName INFLUXDB_TEST_IMAGE = DockerImageName.parse("influxdb:1.4.3"); } diff --git a/modules/jdbc/src/main/java/org/testcontainers/containers/JdbcDatabaseContainer.java b/modules/jdbc/src/main/java/org/testcontainers/containers/JdbcDatabaseContainer.java index 52b76070510..4d1c4ece67b 100644 --- a/modules/jdbc/src/main/java/org/testcontainers/containers/JdbcDatabaseContainer.java +++ b/modules/jdbc/src/main/java/org/testcontainers/containers/JdbcDatabaseContainer.java @@ -44,7 +44,7 @@ public abstract class JdbcDatabaseContainer image) { diff --git a/modules/jdbc/src/test/java/org/testcontainers/jdbc/MissingJdbcDriverTest.java b/modules/jdbc/src/test/java/org/testcontainers/jdbc/MissingJdbcDriverTest.java index 1e024bb721b..88398cebf85 100644 --- a/modules/jdbc/src/test/java/org/testcontainers/jdbc/MissingJdbcDriverTest.java +++ b/modules/jdbc/src/test/java/org/testcontainers/jdbc/MissingJdbcDriverTest.java @@ -40,7 +40,7 @@ static class MissingDriverContainer extends JdbcDatabaseContainer { private final AtomicInteger connectionAttempts = new AtomicInteger(); MissingDriverContainer() { - super(new DockerImageName("mysql:5.7.22")); + super(DockerImageName.parse("mysql:5.7.22")); withEnv("MYSQL_ROOT_PASSWORD", "test"); withExposedPorts(3306); } diff --git a/modules/junit-jupiter/src/test/java/org/testcontainers/junit/jupiter/JUnitJupiterTestImages.java b/modules/junit-jupiter/src/test/java/org/testcontainers/junit/jupiter/JUnitJupiterTestImages.java index f3be0fa0ed9..e99d1ec720c 100644 --- a/modules/junit-jupiter/src/test/java/org/testcontainers/junit/jupiter/JUnitJupiterTestImages.java +++ b/modules/junit-jupiter/src/test/java/org/testcontainers/junit/jupiter/JUnitJupiterTestImages.java @@ -3,6 +3,6 @@ import org.testcontainers.utility.DockerImageName; public interface JUnitJupiterTestImages { - DockerImageName POSTGRES_IMAGE = new DockerImageName("postgres:9.6.12"); - DockerImageName HTTPD_IMAGE = new DockerImageName("httpd:2.4-alpine"); + DockerImageName POSTGRES_IMAGE = DockerImageName.parse("postgres:9.6.12"); + DockerImageName HTTPD_IMAGE = DockerImageName.parse("httpd:2.4-alpine"); } diff --git a/modules/junit-jupiter/src/test/java/org/testcontainers/junit/jupiter/inheritance/RedisContainer.java b/modules/junit-jupiter/src/test/java/org/testcontainers/junit/jupiter/inheritance/RedisContainer.java index 170b5eda2b6..0a9ec62fca2 100644 --- a/modules/junit-jupiter/src/test/java/org/testcontainers/junit/jupiter/inheritance/RedisContainer.java +++ b/modules/junit-jupiter/src/test/java/org/testcontainers/junit/jupiter/inheritance/RedisContainer.java @@ -7,7 +7,7 @@ public class RedisContainer extends GenericContainer { public RedisContainer() { - super(new DockerImageName("redis:3.2.11")); + super(DockerImageName.parse("redis:3.2.11")); withExposedPorts(6379); } diff --git a/modules/kafka/src/main/java/org/testcontainers/containers/KafkaContainer.java b/modules/kafka/src/main/java/org/testcontainers/containers/KafkaContainer.java index 83138ba0507..2451278b1c2 100644 --- a/modules/kafka/src/main/java/org/testcontainers/containers/KafkaContainer.java +++ b/modules/kafka/src/main/java/org/testcontainers/containers/KafkaContainer.java @@ -43,7 +43,7 @@ public KafkaContainer() { */ @Deprecated public KafkaContainer(String confluentPlatformVersion) { - this(new DockerImageName(TestcontainersConfiguration.getInstance().getKafkaImage() + ":" + confluentPlatformVersion)); + this(DockerImageName.parse(TestcontainersConfiguration.getInstance().getKafkaImage() + ":" + confluentPlatformVersion)); } public KafkaContainer(final DockerImageName dockerImageName) { diff --git a/modules/kafka/src/test/java/org/testcontainers/containers/KafkaContainerTest.java b/modules/kafka/src/test/java/org/testcontainers/containers/KafkaContainerTest.java index 9f952d9e43c..b8cd5c9be9c 100644 --- a/modules/kafka/src/test/java/org/testcontainers/containers/KafkaContainerTest.java +++ b/modules/kafka/src/test/java/org/testcontainers/containers/KafkaContainerTest.java @@ -25,8 +25,8 @@ public class KafkaContainerTest { - private static final DockerImageName KAFKA_TEST_IMAGE = new DockerImageName("confluentinc/cp-kafka:5.2.1"); - private static final DockerImageName ZOOKEEPER_TEST_IMAGE = new DockerImageName("confluentinc/cp-zookeeper:4.0.0"); + private static final DockerImageName KAFKA_TEST_IMAGE = DockerImageName.parse("confluentinc/cp-kafka:5.2.1"); + private static final DockerImageName ZOOKEEPER_TEST_IMAGE = DockerImageName.parse("confluentinc/cp-zookeeper:4.0.0"); // junitRule { @Rule diff --git a/modules/localstack/src/main/java/org/testcontainers/containers/localstack/LocalStackContainer.java b/modules/localstack/src/main/java/org/testcontainers/containers/localstack/LocalStackContainer.java index c285e1b7ac1..0136d94e3b2 100644 --- a/modules/localstack/src/main/java/org/testcontainers/containers/localstack/LocalStackContainer.java +++ b/modules/localstack/src/main/java/org/testcontainers/containers/localstack/LocalStackContainer.java @@ -50,7 +50,7 @@ public LocalStackContainer() { */ @Deprecated public LocalStackContainer(String version) { - this(new DockerImageName(TestcontainersConfiguration.getInstance().getLocalStackImage() + ":" + version)); + this(DockerImageName.parse(TestcontainersConfiguration.getInstance().getLocalStackImage() + ":" + version)); } public LocalStackContainer(final DockerImageName dockerImageName) { diff --git a/modules/localstack/src/test/java/org/testcontainers/containers/localstack/LocalstackContainerTest.java b/modules/localstack/src/test/java/org/testcontainers/containers/localstack/LocalstackContainerTest.java index 8edfe510e48..63be9d66df7 100644 --- a/modules/localstack/src/test/java/org/testcontainers/containers/localstack/LocalstackContainerTest.java +++ b/modules/localstack/src/test/java/org/testcontainers/containers/localstack/LocalstackContainerTest.java @@ -60,8 +60,8 @@ @RunWith(Enclosed.class) public class LocalstackContainerTest { - private static final DockerImageName LOCALSTACK_IMAGE = new DockerImageName("localstack/localstack:0.10.8"); - private static final DockerImageName AWS_CLI_IMAGE = new DockerImageName("atlassian/pipelines-awscli:1.16.302"); + private static final DockerImageName LOCALSTACK_IMAGE = DockerImageName.parse("localstack/localstack:0.10.8"); + private static final DockerImageName AWS_CLI_IMAGE = DockerImageName.parse("atlassian/pipelines-awscli:1.16.302"); public static class WithoutNetwork { diff --git a/modules/mariadb/src/main/java/org/testcontainers/containers/MariaDBContainer.java b/modules/mariadb/src/main/java/org/testcontainers/containers/MariaDBContainer.java index 02cfce06d66..e137c186209 100644 --- a/modules/mariadb/src/main/java/org/testcontainers/containers/MariaDBContainer.java +++ b/modules/mariadb/src/main/java/org/testcontainers/containers/MariaDBContainer.java @@ -37,7 +37,7 @@ public MariaDBContainer() { */ @Deprecated public MariaDBContainer(String dockerImageName) { - this(new DockerImageName(dockerImageName)); + this(DockerImageName.parse(dockerImageName)); } public MariaDBContainer(final DockerImageName dockerImageName) { diff --git a/modules/mariadb/src/main/java/org/testcontainers/containers/MariaDBContainerProvider.java b/modules/mariadb/src/main/java/org/testcontainers/containers/MariaDBContainerProvider.java index ae2c745b583..4330465a9c3 100644 --- a/modules/mariadb/src/main/java/org/testcontainers/containers/MariaDBContainerProvider.java +++ b/modules/mariadb/src/main/java/org/testcontainers/containers/MariaDBContainerProvider.java @@ -24,7 +24,7 @@ public JdbcDatabaseContainer newInstance() { @Override public JdbcDatabaseContainer newInstance(String tag) { - return new MariaDBContainer(new DockerImageName(MariaDBContainer.IMAGE, tag)); + return new MariaDBContainer(DockerImageName.parse(MariaDBContainer.IMAGE).withTag(tag)); } @Override diff --git a/modules/mariadb/src/test/java/org/testcontainers/MariaDBTestImages.java b/modules/mariadb/src/test/java/org/testcontainers/MariaDBTestImages.java index 4a6c8a6f43c..7d18f2f8365 100644 --- a/modules/mariadb/src/test/java/org/testcontainers/MariaDBTestImages.java +++ b/modules/mariadb/src/test/java/org/testcontainers/MariaDBTestImages.java @@ -3,5 +3,5 @@ import org.testcontainers.utility.DockerImageName; public interface MariaDBTestImages { - DockerImageName MARIADB_IMAGE = new DockerImageName("mariadb:10.3.6"); + DockerImageName MARIADB_IMAGE = DockerImageName.parse("mariadb:10.3.6"); } diff --git a/modules/mariadb/src/test/java/org/testcontainers/containers/MariaDBR2DBCDatabaseContainerTest.java b/modules/mariadb/src/test/java/org/testcontainers/containers/MariaDBR2DBCDatabaseContainerTest.java index ccbb43afaa8..b6fb4dd659e 100644 --- a/modules/mariadb/src/test/java/org/testcontainers/containers/MariaDBR2DBCDatabaseContainerTest.java +++ b/modules/mariadb/src/test/java/org/testcontainers/containers/MariaDBR2DBCDatabaseContainerTest.java @@ -18,7 +18,7 @@ protected String createR2DBCUrl() { @Override protected MariaDBContainer createContainer() { - return new MariaDBContainer<>(new DockerImageName("mariadb:10.3.6")); + return new MariaDBContainer<>(DockerImageName.parse("mariadb:10.3.6")); } } diff --git a/modules/mockserver/src/main/java/org/testcontainers/containers/MockServerContainer.java b/modules/mockserver/src/main/java/org/testcontainers/containers/MockServerContainer.java index a6bb000bc59..2aa33931d07 100644 --- a/modules/mockserver/src/main/java/org/testcontainers/containers/MockServerContainer.java +++ b/modules/mockserver/src/main/java/org/testcontainers/containers/MockServerContainer.java @@ -23,7 +23,7 @@ public MockServerContainer() { */ @Deprecated public MockServerContainer(String version) { - this(new DockerImageName("jamesdbloom/mockserver:mockserver-" + version)); + this(DockerImageName.parse("jamesdbloom/mockserver:mockserver-" + version)); } public MockServerContainer(DockerImageName dockerImageName) { diff --git a/modules/mockserver/src/test/java/org/testcontainers/containers/MockServerContainerTest.java b/modules/mockserver/src/test/java/org/testcontainers/containers/MockServerContainerTest.java index 55ca2ea9494..e4d11ed3f39 100644 --- a/modules/mockserver/src/test/java/org/testcontainers/containers/MockServerContainerTest.java +++ b/modules/mockserver/src/test/java/org/testcontainers/containers/MockServerContainerTest.java @@ -20,7 +20,7 @@ public class MockServerContainerTest { - public static final DockerImageName MOCKSERVER_IMAGE = new DockerImageName("jamesdbloom/mockserver:mockserver-5.5.4"); + public static final DockerImageName MOCKSERVER_IMAGE = DockerImageName.parse("jamesdbloom/mockserver:mockserver-5.5.4"); // creatingProxy { @Rule diff --git a/modules/mongodb/src/main/java/org/testcontainers/containers/MongoDBContainer.java b/modules/mongodb/src/main/java/org/testcontainers/containers/MongoDBContainer.java index f163afea4c9..1527b3924db 100644 --- a/modules/mongodb/src/main/java/org/testcontainers/containers/MongoDBContainer.java +++ b/modules/mongodb/src/main/java/org/testcontainers/containers/MongoDBContainer.java @@ -29,13 +29,13 @@ public class MongoDBContainer extends GenericContainer { public MongoDBContainer() { this("mongo:" + MONGODB_VERSION_DEFAULT); } - + /** * @deprecated use {@link MongoDBContainer(DockerImageName)} instead */ @Deprecated public MongoDBContainer(@NonNull final String dockerImageName) { - this(new DockerImageName(dockerImageName)); + this(DockerImageName.parse(dockerImageName)); } public MongoDBContainer(final DockerImageName dockerImageName) { diff --git a/modules/mongodb/src/test/java/org/testcontainers/containers/MongoDBContainerTest.java b/modules/mongodb/src/test/java/org/testcontainers/containers/MongoDBContainerTest.java index 5c65d2fef19..c0977835506 100644 --- a/modules/mongodb/src/test/java/org/testcontainers/containers/MongoDBContainerTest.java +++ b/modules/mongodb/src/test/java/org/testcontainers/containers/MongoDBContainerTest.java @@ -19,7 +19,7 @@ public class MongoDBContainerTest { - private static final DockerImageName MONGO_IMAGE = new DockerImageName("mongo:4.0.10"); + private static final DockerImageName MONGO_IMAGE = DockerImageName.parse("mongo:4.0.10"); /** * Taken from https://docs.mongodb.com diff --git a/modules/mssqlserver/src/main/java/org/testcontainers/containers/MSSQLServerContainer.java b/modules/mssqlserver/src/main/java/org/testcontainers/containers/MSSQLServerContainer.java index 439ffa8b99c..0a6d8149e34 100644 --- a/modules/mssqlserver/src/main/java/org/testcontainers/containers/MSSQLServerContainer.java +++ b/modules/mssqlserver/src/main/java/org/testcontainers/containers/MSSQLServerContainer.java @@ -46,7 +46,7 @@ public MSSQLServerContainer() { */ @Deprecated public MSSQLServerContainer(final String dockerImageName) { - this(new DockerImageName(dockerImageName)); + this(DockerImageName.parse(dockerImageName)); } public MSSQLServerContainer(final DockerImageName dockerImageName) { diff --git a/modules/mssqlserver/src/main/java/org/testcontainers/containers/MSSQLServerContainerProvider.java b/modules/mssqlserver/src/main/java/org/testcontainers/containers/MSSQLServerContainerProvider.java index 2dafedd895d..c3495c8a3a6 100644 --- a/modules/mssqlserver/src/main/java/org/testcontainers/containers/MSSQLServerContainerProvider.java +++ b/modules/mssqlserver/src/main/java/org/testcontainers/containers/MSSQLServerContainerProvider.java @@ -18,6 +18,6 @@ public JdbcDatabaseContainer newInstance() { @Override public JdbcDatabaseContainer newInstance(String tag) { - return new MSSQLServerContainer(new DockerImageName(MSSQLServerContainer.IMAGE, tag)); + return new MSSQLServerContainer(DockerImageName.parse(MSSQLServerContainer.IMAGE).withTag(tag)); } } diff --git a/modules/mssqlserver/src/test/java/org/testcontainers/MSSQLServerTestImages.java b/modules/mssqlserver/src/test/java/org/testcontainers/MSSQLServerTestImages.java index 3fd1993519d..0cec042e19f 100644 --- a/modules/mssqlserver/src/test/java/org/testcontainers/MSSQLServerTestImages.java +++ b/modules/mssqlserver/src/test/java/org/testcontainers/MSSQLServerTestImages.java @@ -3,5 +3,5 @@ import org.testcontainers.utility.DockerImageName; public interface MSSQLServerTestImages { - DockerImageName MSSQL_SERVER_IMAGE = new DockerImageName("mcr.microsoft.com/mssql/server:2017-CU12"); + DockerImageName MSSQL_SERVER_IMAGE = DockerImageName.parse("mcr.microsoft.com/mssql/server:2017-CU12"); } diff --git a/modules/mssqlserver/src/test/java/org/testcontainers/junit/mssqlserver/CustomizableMSSQLServerTest.java b/modules/mssqlserver/src/test/java/org/testcontainers/junit/mssqlserver/CustomizableMSSQLServerTest.java index 127dbe2ae03..d3c387e7b4a 100644 --- a/modules/mssqlserver/src/test/java/org/testcontainers/junit/mssqlserver/CustomizableMSSQLServerTest.java +++ b/modules/mssqlserver/src/test/java/org/testcontainers/junit/mssqlserver/CustomizableMSSQLServerTest.java @@ -16,7 +16,7 @@ public class CustomizableMSSQLServerTest extends AbstractContainerDatabaseTest { @Test public void testSqlServerConnection() throws SQLException { - try (MSSQLServerContainer mssqlServerContainer = new MSSQLServerContainer<>(new DockerImageName("mcr.microsoft.com/mssql/server:2017-CU12")) + try (MSSQLServerContainer mssqlServerContainer = new MSSQLServerContainer<>(DockerImageName.parse("mcr.microsoft.com/mssql/server:2017-CU12")) .withPassword(STRONG_PASSWORD)) { mssqlServerContainer.start(); diff --git a/modules/mysql/src/main/java/org/testcontainers/containers/MySQLContainer.java b/modules/mysql/src/main/java/org/testcontainers/containers/MySQLContainer.java index ddc3a2c8481..35321db5d72 100644 --- a/modules/mysql/src/main/java/org/testcontainers/containers/MySQLContainer.java +++ b/modules/mysql/src/main/java/org/testcontainers/containers/MySQLContainer.java @@ -39,7 +39,7 @@ public MySQLContainer() { */ @Deprecated public MySQLContainer(String dockerImageName) { - this(new DockerImageName(dockerImageName)); + this(DockerImageName.parse(dockerImageName)); } public MySQLContainer(final DockerImageName dockerImageName) { diff --git a/modules/mysql/src/main/java/org/testcontainers/containers/MySQLContainerProvider.java b/modules/mysql/src/main/java/org/testcontainers/containers/MySQLContainerProvider.java index e74c1f49a4e..18d126635b1 100644 --- a/modules/mysql/src/main/java/org/testcontainers/containers/MySQLContainerProvider.java +++ b/modules/mysql/src/main/java/org/testcontainers/containers/MySQLContainerProvider.java @@ -25,7 +25,7 @@ public JdbcDatabaseContainer newInstance() { @Override public JdbcDatabaseContainer newInstance(String tag) { if (tag != null) { - return new MySQLContainer(new DockerImageName(MySQLContainer.IMAGE, tag)); + return new MySQLContainer(DockerImageName.parse(MySQLContainer.IMAGE).withTag(tag)); } else { return newInstance(); } diff --git a/modules/mysql/src/test/java/org/testcontainers/MySQLTestImages.java b/modules/mysql/src/test/java/org/testcontainers/MySQLTestImages.java index 5c8889fffbd..6c8c6690d1f 100644 --- a/modules/mysql/src/test/java/org/testcontainers/MySQLTestImages.java +++ b/modules/mysql/src/test/java/org/testcontainers/MySQLTestImages.java @@ -3,7 +3,7 @@ import org.testcontainers.utility.DockerImageName; public class MySQLTestImages { - public static final DockerImageName MYSQL_IMAGE = new DockerImageName("mysql:5.7.22"); - public static final DockerImageName MYSQL_55_IMAGE = new DockerImageName("mysql:5.5"); - public static final DockerImageName MYSQL_56_IMAGE = new DockerImageName("mysql:5.6"); + public static final DockerImageName MYSQL_IMAGE = DockerImageName.parse("mysql:5.7.22"); + public static final DockerImageName MYSQL_55_IMAGE = DockerImageName.parse("mysql:5.5"); + public static final DockerImageName MYSQL_56_IMAGE = DockerImageName.parse("mysql:5.6"); } diff --git a/modules/mysql/src/test/java/org/testcontainers/junit/mysql/SimpleMySQLTest.java b/modules/mysql/src/test/java/org/testcontainers/junit/mysql/SimpleMySQLTest.java index 0f1fa1ad06d..7ff8f041f26 100644 --- a/modules/mysql/src/test/java/org/testcontainers/junit/mysql/SimpleMySQLTest.java +++ b/modules/mysql/src/test/java/org/testcontainers/junit/mysql/SimpleMySQLTest.java @@ -43,10 +43,10 @@ public class SimpleMySQLTest extends AbstractContainerDatabaseTest { public static MySQLContainer mysql = new MySQLContainer<>(MYSQL_IMAGE); @ClassRule - public static MySQLContainer mysqlOldVersion = new MySQLContainer<>(new DockerImageName("mysql:5.5");) + public static MySQLContainer mysqlOldVersion = new MySQLContainer<>(DockerImageName.of("mysql:5.5");) @ClassRule - public static MySQLContainer mysqlCustomConfig = new MySQLContainer<>(new DockerImageName("mysql:5.6")) + public static MySQLContainer mysqlCustomConfig = new MySQLContainer<>(DockerImageName.of("mysql:5.6")) .withConfigurationOverride("somepath/mysql_conf_override"); */ diff --git a/modules/neo4j/src/main/java/org/testcontainers/containers/Neo4jContainer.java b/modules/neo4j/src/main/java/org/testcontainers/containers/Neo4jContainer.java index bccc4cf39fa..5d4212ccacd 100644 --- a/modules/neo4j/src/main/java/org/testcontainers/containers/Neo4jContainer.java +++ b/modules/neo4j/src/main/java/org/testcontainers/containers/Neo4jContainer.java @@ -78,7 +78,7 @@ public Neo4jContainer() { */ @Deprecated public Neo4jContainer(String dockerImageName) { - this(new DockerImageName(dockerImageName)); + this(DockerImageName.parse(dockerImageName)); } public Neo4jContainer(final DockerImageName dockerImageName) { diff --git a/modules/neo4j/src/test/java/org/testcontainers/containers/Neo4jTestImages.java b/modules/neo4j/src/test/java/org/testcontainers/containers/Neo4jTestImages.java index 4f54d04acb8..2cab24baf2b 100644 --- a/modules/neo4j/src/test/java/org/testcontainers/containers/Neo4jTestImages.java +++ b/modules/neo4j/src/test/java/org/testcontainers/containers/Neo4jTestImages.java @@ -3,5 +3,5 @@ import org.testcontainers.utility.DockerImageName; public interface Neo4jTestImages { - DockerImageName NEO4J_TEST_IMAGE = new DockerImageName("neo4j:3.5.0"); + DockerImageName NEO4J_TEST_IMAGE = DockerImageName.parse("neo4j:3.5.0"); } diff --git a/modules/nginx/src/main/java/org/testcontainers/containers/NginxContainer.java b/modules/nginx/src/main/java/org/testcontainers/containers/NginxContainer.java index dcf93a18a95..75a4571b68e 100644 --- a/modules/nginx/src/main/java/org/testcontainers/containers/NginxContainer.java +++ b/modules/nginx/src/main/java/org/testcontainers/containers/NginxContainer.java @@ -29,7 +29,7 @@ public NginxContainer() { */ @Deprecated public NginxContainer(String dockerImageName) { - this(new DockerImageName(dockerImageName)); + this(DockerImageName.parse(dockerImageName)); addExposedPort(NGINX_DEFAULT_PORT); setCommand("nginx", "-g", "daemon off;"); diff --git a/modules/nginx/src/test/java/org/testcontainers/junit/SimpleNginxTest.java b/modules/nginx/src/test/java/org/testcontainers/junit/SimpleNginxTest.java index 36a81a75015..e322804bf75 100644 --- a/modules/nginx/src/test/java/org/testcontainers/junit/SimpleNginxTest.java +++ b/modules/nginx/src/test/java/org/testcontainers/junit/SimpleNginxTest.java @@ -20,7 +20,7 @@ */ public class SimpleNginxTest { - private static final DockerImageName NGINX_IMAGE = new DockerImageName("nginx:1.9.4"); + private static final DockerImageName NGINX_IMAGE = DockerImageName.parse("nginx:1.9.4"); private static String tmpDirectory = System.getProperty("user.home") + "/.tmp-test-container"; diff --git a/modules/oracle-xe/src/main/java/org/testcontainers/containers/OracleContainer.java b/modules/oracle-xe/src/main/java/org/testcontainers/containers/OracleContainer.java index c274afa57bf..8406d8275fb 100644 --- a/modules/oracle-xe/src/main/java/org/testcontainers/containers/OracleContainer.java +++ b/modules/oracle-xe/src/main/java/org/testcontainers/containers/OracleContainer.java @@ -46,7 +46,7 @@ public OracleContainer() { */ @Deprecated public OracleContainer(String dockerImageName) { - this(new DockerImageName(dockerImageName)); + this(DockerImageName.parse(dockerImageName)); } public OracleContainer(final DockerImageName dockerImageName) { diff --git a/modules/orientdb/src/main/java/org/testcontainers/containers/OrientDBContainer.java b/modules/orientdb/src/main/java/org/testcontainers/containers/OrientDBContainer.java index f7df8409456..797f73f7159 100644 --- a/modules/orientdb/src/main/java/org/testcontainers/containers/OrientDBContainer.java +++ b/modules/orientdb/src/main/java/org/testcontainers/containers/OrientDBContainer.java @@ -62,7 +62,7 @@ public OrientDBContainer() { */ @Deprecated public OrientDBContainer(@NonNull String dockerImageName) { - this(new DockerImageName(dockerImageName)); + this(DockerImageName.parse(dockerImageName)); } public OrientDBContainer(final DockerImageName dockerImageName) { diff --git a/modules/orientdb/src/test/java/org/testcontainers/containers/OrientDBContainerTest.java b/modules/orientdb/src/test/java/org/testcontainers/containers/OrientDBContainerTest.java index e029f491a68..60d7b172436 100644 --- a/modules/orientdb/src/test/java/org/testcontainers/containers/OrientDBContainerTest.java +++ b/modules/orientdb/src/test/java/org/testcontainers/containers/OrientDBContainerTest.java @@ -11,7 +11,7 @@ */ public class OrientDBContainerTest { - private static final DockerImageName ORIENTDB_IMAGE = new DockerImageName("orientdb:3.0.24-tp3"); + private static final DockerImageName ORIENTDB_IMAGE = DockerImageName.parse("orientdb:3.0.24-tp3"); @Test public void shouldReturnTheSameSession() { diff --git a/modules/postgresql/src/main/java/org/testcontainers/containers/PostgisContainerProvider.java b/modules/postgresql/src/main/java/org/testcontainers/containers/PostgisContainerProvider.java index b3038f32e9c..9e59787837b 100644 --- a/modules/postgresql/src/main/java/org/testcontainers/containers/PostgisContainerProvider.java +++ b/modules/postgresql/src/main/java/org/testcontainers/containers/PostgisContainerProvider.java @@ -27,7 +27,7 @@ public JdbcDatabaseContainer newInstance() { @Override public JdbcDatabaseContainer newInstance(String tag) { - return new PostgreSQLContainer(new DockerImageName(DEFAULT_IMAGE, DEFAULT_TAG)); + return new PostgreSQLContainer(DockerImageName.parse(DEFAULT_IMAGE).withTag(DEFAULT_TAG)); } @Override diff --git a/modules/postgresql/src/main/java/org/testcontainers/containers/PostgreSQLContainer.java b/modules/postgresql/src/main/java/org/testcontainers/containers/PostgreSQLContainer.java index adb1997a192..b1ddb2a26ee 100644 --- a/modules/postgresql/src/main/java/org/testcontainers/containers/PostgreSQLContainer.java +++ b/modules/postgresql/src/main/java/org/testcontainers/containers/PostgreSQLContainer.java @@ -45,7 +45,7 @@ public PostgreSQLContainer() { */ @Deprecated public PostgreSQLContainer(final String dockerImageName) { - this(new DockerImageName(dockerImageName)); + this(DockerImageName.parse(dockerImageName)); } public PostgreSQLContainer(final DockerImageName dockerImageName) { diff --git a/modules/postgresql/src/main/java/org/testcontainers/containers/PostgreSQLContainerProvider.java b/modules/postgresql/src/main/java/org/testcontainers/containers/PostgreSQLContainerProvider.java index 77d6501064d..5e7580c75eb 100644 --- a/modules/postgresql/src/main/java/org/testcontainers/containers/PostgreSQLContainerProvider.java +++ b/modules/postgresql/src/main/java/org/testcontainers/containers/PostgreSQLContainerProvider.java @@ -23,7 +23,7 @@ public JdbcDatabaseContainer newInstance() { @Override public JdbcDatabaseContainer newInstance(String tag) { - return new PostgreSQLContainer(new DockerImageName(PostgreSQLContainer.IMAGE, tag)); + return new PostgreSQLContainer(DockerImageName.parse(PostgreSQLContainer.IMAGE).withTag(tag)); } @Override diff --git a/modules/postgresql/src/test/java/org/testcontainers/PostgreSQLTestImages.java b/modules/postgresql/src/test/java/org/testcontainers/PostgreSQLTestImages.java index 929df0dfb01..8be01053570 100644 --- a/modules/postgresql/src/test/java/org/testcontainers/PostgreSQLTestImages.java +++ b/modules/postgresql/src/test/java/org/testcontainers/PostgreSQLTestImages.java @@ -3,5 +3,5 @@ import org.testcontainers.utility.DockerImageName; public interface PostgreSQLTestImages { - DockerImageName POSTGRES_TEST_IMAGE = new DockerImageName("postgres:9.6.12"); + DockerImageName POSTGRES_TEST_IMAGE = DockerImageName.parse("postgres:9.6.12"); } diff --git a/modules/presto/src/main/java/org/testcontainers/containers/PrestoContainer.java b/modules/presto/src/main/java/org/testcontainers/containers/PrestoContainer.java index 14342fc9bc9..ea73bb55c46 100644 --- a/modules/presto/src/main/java/org/testcontainers/containers/PrestoContainer.java +++ b/modules/presto/src/main/java/org/testcontainers/containers/PrestoContainer.java @@ -37,7 +37,7 @@ public PrestoContainer() { */ @Deprecated public PrestoContainer(final String dockerImageName) { - this(new DockerImageName(dockerImageName)); + this(DockerImageName.parse(dockerImageName)); } public PrestoContainer(final DockerImageName dockerImageName) { diff --git a/modules/presto/src/main/java/org/testcontainers/containers/PrestoContainerProvider.java b/modules/presto/src/main/java/org/testcontainers/containers/PrestoContainerProvider.java index fd87418cd17..8408aab4517 100644 --- a/modules/presto/src/main/java/org/testcontainers/containers/PrestoContainerProvider.java +++ b/modules/presto/src/main/java/org/testcontainers/containers/PrestoContainerProvider.java @@ -23,7 +23,7 @@ public JdbcDatabaseContainer newInstance() { @Override public JdbcDatabaseContainer newInstance(String tag) { - return new PrestoContainer(new DockerImageName(PrestoContainer.IMAGE, tag)); + return new PrestoContainer(DockerImageName.parse(PrestoContainer.IMAGE).withTag(tag)); } @Override diff --git a/modules/presto/src/test/java/org/testcontainers/PrestoTestImages.java b/modules/presto/src/test/java/org/testcontainers/PrestoTestImages.java index 74c1bee6a46..1b4e449c99f 100644 --- a/modules/presto/src/test/java/org/testcontainers/PrestoTestImages.java +++ b/modules/presto/src/test/java/org/testcontainers/PrestoTestImages.java @@ -3,6 +3,6 @@ import org.testcontainers.utility.DockerImageName; public interface PrestoTestImages { - DockerImageName PRESTO_TEST_IMAGE = new DockerImageName("prestosql/presto:329"); - DockerImageName PRESTO_PREVIOUS_VERSION_TEST_IMAGE = new DockerImageName("prestosql/presto:328"); + DockerImageName PRESTO_TEST_IMAGE = DockerImageName.parse("prestosql/presto:329"); + DockerImageName PRESTO_PREVIOUS_VERSION_TEST_IMAGE = DockerImageName.parse("prestosql/presto:328"); } diff --git a/modules/pulsar/src/test/java/org/testcontainers/containers/PulsarContainerTest.java b/modules/pulsar/src/test/java/org/testcontainers/containers/PulsarContainerTest.java index 268e4232149..f2354d98ef7 100644 --- a/modules/pulsar/src/test/java/org/testcontainers/containers/PulsarContainerTest.java +++ b/modules/pulsar/src/test/java/org/testcontainers/containers/PulsarContainerTest.java @@ -18,7 +18,7 @@ public class PulsarContainerTest { public static final String TEST_TOPIC = "test_topic"; - private static final DockerImageName PULSAR_IMAGE = new DockerImageName("apachepulsar/pulsar:2.2.0"); + private static final DockerImageName PULSAR_IMAGE = DockerImageName.parse("apachepulsar/pulsar:2.2.0"); @Test public void testUsage() throws Exception { diff --git a/modules/rabbitmq/src/main/java/org/testcontainers/containers/RabbitMQContainer.java b/modules/rabbitmq/src/main/java/org/testcontainers/containers/RabbitMQContainer.java index 79ae063edaf..a3b6134b29c 100644 --- a/modules/rabbitmq/src/main/java/org/testcontainers/containers/RabbitMQContainer.java +++ b/modules/rabbitmq/src/main/java/org/testcontainers/containers/RabbitMQContainer.java @@ -57,7 +57,7 @@ public RabbitMQContainer() { */ @Deprecated public RabbitMQContainer(String dockerImageName) { - this(new DockerImageName(dockerImageName)); + this(DockerImageName.parse(dockerImageName)); } public RabbitMQContainer(final DockerImageName dockerImageName) { diff --git a/modules/rabbitmq/src/test/java/org/testcontainers/containers/RabbitMQTestImages.java b/modules/rabbitmq/src/test/java/org/testcontainers/containers/RabbitMQTestImages.java index e8280b63429..0898cbdb350 100644 --- a/modules/rabbitmq/src/test/java/org/testcontainers/containers/RabbitMQTestImages.java +++ b/modules/rabbitmq/src/test/java/org/testcontainers/containers/RabbitMQTestImages.java @@ -3,5 +3,5 @@ import org.testcontainers.utility.DockerImageName; public interface RabbitMQTestImages { - DockerImageName RABBITMQ_IMAGE = new DockerImageName("rabbitmq:3.7.25-management-alpine"); + DockerImageName RABBITMQ_IMAGE = DockerImageName.parse("rabbitmq:3.7.25-management-alpine"); } diff --git a/modules/selenium/src/main/java/org/testcontainers/containers/BrowserWebDriverContainer.java b/modules/selenium/src/main/java/org/testcontainers/containers/BrowserWebDriverContainer.java index aced294182f..d38110bead6 100644 --- a/modules/selenium/src/main/java/org/testcontainers/containers/BrowserWebDriverContainer.java +++ b/modules/selenium/src/main/java/org/testcontainers/containers/BrowserWebDriverContainer.java @@ -92,7 +92,7 @@ public BrowserWebDriverContainer() { */ @Deprecated public BrowserWebDriverContainer(String dockerImageName) { - this(new DockerImageName(dockerImageName)); + this(DockerImageName.parse(dockerImageName)); this.customImageNameIsSet = true; // We have to force SKIP mode for the recording by default because we don't know if the image has VNC or not recordingMode = VncRecordingMode.SKIP; diff --git a/modules/selenium/src/test/java/org/testcontainers/SeleniumTestImages.java b/modules/selenium/src/test/java/org/testcontainers/SeleniumTestImages.java index 1a1e9f31635..82d19adf3b5 100644 --- a/modules/selenium/src/test/java/org/testcontainers/SeleniumTestImages.java +++ b/modules/selenium/src/test/java/org/testcontainers/SeleniumTestImages.java @@ -3,5 +3,5 @@ import org.testcontainers.utility.DockerImageName; public interface SeleniumTestImages { - DockerImageName NGINX_TEST_IMAGE = new DockerImageName("nginx:1.9.4"); + DockerImageName NGINX_TEST_IMAGE = DockerImageName.parse("nginx:1.9.4"); } diff --git a/modules/selenium/src/test/java/org/testcontainers/junit/Selenium3xTest.java b/modules/selenium/src/test/java/org/testcontainers/junit/Selenium3xTest.java index ba95528eebd..bbcd8c15166 100644 --- a/modules/selenium/src/test/java/org/testcontainers/junit/Selenium3xTest.java +++ b/modules/selenium/src/test/java/org/testcontainers/junit/Selenium3xTest.java @@ -23,7 +23,7 @@ public static String[] data() { @Test public void testAdditionalStartupString() { - final DockerImageName imageName = new DockerImageName("selenium/standalone-chrome-debug", tag); + final DockerImageName imageName = DockerImageName.parse("selenium/standalone-chrome-debug").withTag(tag); try (BrowserWebDriverContainer chrome = new BrowserWebDriverContainer<>(imageName) .withCapabilities(new ChromeOptions())) { chrome.start(); diff --git a/modules/selenium/src/test/java/org/testcontainers/junit/SpecificImageNameWebDriverContainerTest.java b/modules/selenium/src/test/java/org/testcontainers/junit/SpecificImageNameWebDriverContainerTest.java index 7be2610a198..6ecf0899ede 100644 --- a/modules/selenium/src/test/java/org/testcontainers/junit/SpecificImageNameWebDriverContainerTest.java +++ b/modules/selenium/src/test/java/org/testcontainers/junit/SpecificImageNameWebDriverContainerTest.java @@ -8,7 +8,7 @@ public class SpecificImageNameWebDriverContainerTest extends BaseWebDriverContainerTest { - private static final DockerImageName FIREFOX_IMAGE = new DockerImageName("selenium/standalone-firefox:2.53.1-beryllium"); + private static final DockerImageName FIREFOX_IMAGE = DockerImageName.parse("selenium/standalone-firefox:2.53.1-beryllium"); @Rule public BrowserWebDriverContainer firefox = new BrowserWebDriverContainer<>(FIREFOX_IMAGE) diff --git a/modules/solr/src/main/java/org/testcontainers/containers/SolrContainer.java b/modules/solr/src/main/java/org/testcontainers/containers/SolrContainer.java index 0c993e9d992..aeadb664089 100644 --- a/modules/solr/src/main/java/org/testcontainers/containers/SolrContainer.java +++ b/modules/solr/src/main/java/org/testcontainers/containers/SolrContainer.java @@ -39,7 +39,7 @@ public SolrContainer() { */ @Deprecated public SolrContainer(final String dockerImageName) { - this(new DockerImageName(dockerImageName)); + this(DockerImageName.parse(dockerImageName)); } public SolrContainer(final DockerImageName dockerImageName) { diff --git a/modules/solr/src/test/java/org/testcontainers/containers/SolrContainerTest.java b/modules/solr/src/test/java/org/testcontainers/containers/SolrContainerTest.java index 66a25115105..c2d19a3e61c 100644 --- a/modules/solr/src/test/java/org/testcontainers/containers/SolrContainerTest.java +++ b/modules/solr/src/test/java/org/testcontainers/containers/SolrContainerTest.java @@ -19,7 +19,7 @@ */ public class SolrContainerTest { - private static final DockerImageName SOLR_IMAGE = new DockerImageName("solr:8.3.0"); + private static final DockerImageName SOLR_IMAGE = DockerImageName.parse("solr:8.3.0"); private SolrClient client = null; @After diff --git a/modules/spock/src/test/groovy/org/testcontainers/spock/SpockTestImages.groovy b/modules/spock/src/test/groovy/org/testcontainers/spock/SpockTestImages.groovy index a307a3beb86..526c1fe5c42 100644 --- a/modules/spock/src/test/groovy/org/testcontainers/spock/SpockTestImages.groovy +++ b/modules/spock/src/test/groovy/org/testcontainers/spock/SpockTestImages.groovy @@ -4,8 +4,8 @@ import org.testcontainers.utility.DockerImageName import org.testcontainers.utility.TestcontainersConfiguration; interface SpockTestImages { - DockerImageName MYSQL_IMAGE = new DockerImageName("mysql:5.7.22") - DockerImageName POSTGRES_TEST_IMAGE = new DockerImageName("postgres:9.6.12") - DockerImageName HTTPD_IMAGE = new DockerImageName("httpd:2.4-alpine") + DockerImageName MYSQL_IMAGE = DockerImageName.parse("mysql:5.7.22") + DockerImageName POSTGRES_TEST_IMAGE = DockerImageName.parse("postgres:9.6.12") + DockerImageName HTTPD_IMAGE = DockerImageName.parse("httpd:2.4-alpine") DockerImageName TINY_IMAGE = TestcontainersConfiguration.getInstance().getTinyDockerImageName() } diff --git a/modules/toxiproxy/src/main/java/org/testcontainers/containers/ToxiproxyContainer.java b/modules/toxiproxy/src/main/java/org/testcontainers/containers/ToxiproxyContainer.java index 1b6e05faec6..b01d031cc5b 100644 --- a/modules/toxiproxy/src/main/java/org/testcontainers/containers/ToxiproxyContainer.java +++ b/modules/toxiproxy/src/main/java/org/testcontainers/containers/ToxiproxyContainer.java @@ -43,7 +43,7 @@ public ToxiproxyContainer() { */ @Deprecated public ToxiproxyContainer(String dockerImageName) { - this(new DockerImageName(dockerImageName)); + this(DockerImageName.parse(dockerImageName)); } public ToxiproxyContainer(final DockerImageName dockerImageName) { diff --git a/modules/toxiproxy/src/test/java/org/testcontainers/containers/ToxiproxyTest.java b/modules/toxiproxy/src/test/java/org/testcontainers/containers/ToxiproxyTest.java index 6a037a2f77e..87f9758ebf1 100644 --- a/modules/toxiproxy/src/test/java/org/testcontainers/containers/ToxiproxyTest.java +++ b/modules/toxiproxy/src/test/java/org/testcontainers/containers/ToxiproxyTest.java @@ -28,14 +28,14 @@ public class ToxiproxyTest { @Rule public Network network = Network.newNetwork(); - private static final DockerImageName REDIS_IMAGE = new DockerImageName("redis:5.0.4"); + private static final DockerImageName REDIS_IMAGE = DockerImageName.parse("redis:5.0.4"); // The target container - this could be anything @Rule public GenericContainer redis = new GenericContainer<>(REDIS_IMAGE) .withExposedPorts(6379) .withNetwork(network); - private static final DockerImageName TOXIPROXY_IMAGE = new DockerImageName("shopify/toxiproxy:2.1.0"); + private static final DockerImageName TOXIPROXY_IMAGE = DockerImageName.parse("shopify/toxiproxy:2.1.0"); // Toxiproxy container, which will be used as a TCP proxy @Rule public ToxiproxyContainer toxiproxy = new ToxiproxyContainer(TOXIPROXY_IMAGE) diff --git a/modules/vault/src/main/java/org/testcontainers/vault/VaultContainer.java b/modules/vault/src/main/java/org/testcontainers/vault/VaultContainer.java index d5cd73838ca..1532f463f37 100644 --- a/modules/vault/src/main/java/org/testcontainers/vault/VaultContainer.java +++ b/modules/vault/src/main/java/org/testcontainers/vault/VaultContainer.java @@ -42,7 +42,7 @@ public VaultContainer() { */ @Deprecated public VaultContainer(String dockerImageName) { - this(new DockerImageName(dockerImageName)); + this(DockerImageName.parse(dockerImageName)); } public VaultContainer(final DockerImageName dockerImageName) { diff --git a/modules/vault/src/test/java/org/testcontainers/vault/VaultTestImages.java b/modules/vault/src/test/java/org/testcontainers/vault/VaultTestImages.java index 81b4eeab5c1..9afecdcffb9 100644 --- a/modules/vault/src/test/java/org/testcontainers/vault/VaultTestImages.java +++ b/modules/vault/src/test/java/org/testcontainers/vault/VaultTestImages.java @@ -3,5 +3,5 @@ import org.testcontainers.utility.DockerImageName; public interface VaultTestImages { - DockerImageName VAULT_IMAGE = new DockerImageName("vault:1.1.3"); + DockerImageName VAULT_IMAGE = DockerImageName.parse("vault:1.1.3"); } From 1edc3077bf76e15df2724adea6ff8d64e7521e9e Mon Sep 17 00:00:00 2001 From: Richard North Date: Sat, 4 Jul 2020 09:01:01 +0100 Subject: [PATCH 10/17] Use constant for docker registry image name --- core/src/test/java/org/testcontainers/TestImages.java | 1 + .../java/org/testcontainers/images/ImagePullPolicyTest.java | 3 ++- .../org/testcontainers/utility/AuthenticatedImagePullTest.java | 3 ++- 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/core/src/test/java/org/testcontainers/TestImages.java b/core/src/test/java/org/testcontainers/TestImages.java index 048777a7d55..3f16e88d882 100644 --- a/core/src/test/java/org/testcontainers/TestImages.java +++ b/core/src/test/java/org/testcontainers/TestImages.java @@ -8,5 +8,6 @@ public interface TestImages { DockerImageName RABBITMQ_IMAGE = DockerImageName.parse("rabbitmq:3.5.3"); DockerImageName MONGODB_IMAGE = DockerImageName.parse("mongo:3.1.5"); DockerImageName ALPINE_IMAGE = DockerImageName.parse("alpine:3.2"); + DockerImageName DOCKER_REGISTRY_IMAGE = DockerImageName.parse("registry:2.7.0"); DockerImageName TINY_IMAGE = TestcontainersConfiguration.getInstance().getTinyDockerImageName(); } diff --git a/core/src/test/java/org/testcontainers/images/ImagePullPolicyTest.java b/core/src/test/java/org/testcontainers/images/ImagePullPolicyTest.java index 2a8d298be2b..556c50a8d47 100644 --- a/core/src/test/java/org/testcontainers/images/ImagePullPolicyTest.java +++ b/core/src/test/java/org/testcontainers/images/ImagePullPolicyTest.java @@ -22,11 +22,12 @@ import static org.junit.Assert.fail; import static org.mockito.ArgumentMatchers.any; +import static org.testcontainers.TestImages.DOCKER_REGISTRY_IMAGE; public class ImagePullPolicyTest { @ClassRule - public static GenericContainer registry = new GenericContainer<>(DockerImageName.parse("registry:2.7.0")) + public static GenericContainer registry = new GenericContainer<>(DOCKER_REGISTRY_IMAGE) .withExposedPorts(5000); private static String imageName; diff --git a/core/src/test/java/org/testcontainers/utility/AuthenticatedImagePullTest.java b/core/src/test/java/org/testcontainers/utility/AuthenticatedImagePullTest.java index 408c57427a1..0afb4d956a1 100644 --- a/core/src/test/java/org/testcontainers/utility/AuthenticatedImagePullTest.java +++ b/core/src/test/java/org/testcontainers/utility/AuthenticatedImagePullTest.java @@ -28,6 +28,7 @@ import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.when; import static org.rnorth.visibleassertions.VisibleAssertions.assertTrue; +import static org.testcontainers.TestImages.DOCKER_REGISTRY_IMAGE; /** * This test checks the integration between Testcontainers and an authenticated registry, but uses @@ -45,7 +46,7 @@ public class AuthenticatedImagePullTest { @ClassRule public static GenericContainer authenticatedRegistry = new GenericContainer<>(new ImageFromDockerfile() .withDockerfileFromBuilder(builder -> { - builder.from("registry:2.7.0") + builder.from(DOCKER_REGISTRY_IMAGE.asCanonicalNameString()) .run("htpasswd -Bbn testuser notasecret > /htpasswd") .env("REGISTRY_AUTH", "htpasswd") .env("REGISTRY_AUTH_HTPASSWD_PATH", "/htpasswd") From 113f3b37ad068e636fe2a55017aa2b1e311ea878 Mon Sep 17 00:00:00 2001 From: Richard North Date: Sat, 4 Jul 2020 09:03:02 +0100 Subject: [PATCH 11/17] Simplify image usage in ReusabilityUnitTests --- .../containers/ReusabilityUnitTests.java | 21 +++++++------------ 1 file changed, 8 insertions(+), 13 deletions(-) diff --git a/core/src/test/java/org/testcontainers/containers/ReusabilityUnitTests.java b/core/src/test/java/org/testcontainers/containers/ReusabilityUnitTests.java index 0318653d174..c212d04c33a 100644 --- a/core/src/test/java/org/testcontainers/containers/ReusabilityUnitTests.java +++ b/core/src/test/java/org/testcontainers/containers/ReusabilityUnitTests.java @@ -28,7 +28,6 @@ import org.testcontainers.DockerClientFactory; import org.testcontainers.containers.startupcheck.StartupCheckStrategy; import org.testcontainers.containers.wait.strategy.AbstractWaitStrategy; -import org.testcontainers.images.RemoteDockerImage; import org.testcontainers.utility.MockTestcontainersConfigurationRule; import org.testcontainers.utility.MountableFile; import org.testcontainers.utility.TestcontainersConfiguration; @@ -41,7 +40,6 @@ import java.util.List; import java.util.Map; import java.util.UUID; -import java.util.concurrent.CompletableFuture; import java.util.concurrent.atomic.AtomicReference; import java.util.function.Consumer; import java.util.stream.Collectors; @@ -51,14 +49,11 @@ import static org.assertj.core.api.Assumptions.assumeThat; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.when; +import static org.testcontainers.TestImages.TINY_IMAGE; @RunWith(Enclosed.class) public class ReusabilityUnitTests { - static final CompletableFuture IMAGE_FUTURE = CompletableFuture.completedFuture( - TestcontainersConfiguration.getInstance().getTinyDockerImageName().asCanonicalNameString() - ); - @RunWith(Parameterized.class) @RequiredArgsConstructor @FieldDefaults(makeFinal = true) @@ -67,8 +62,8 @@ public static class CanBeReusedTest { @Parameterized.Parameters(name = "{0}") public static Object[][] data() { return new Object[][] { - { "generic", new GenericContainer<>(new RemoteDockerImage(IMAGE_FUTURE)), true }, - { "anonymous generic", new GenericContainer(new RemoteDockerImage(IMAGE_FUTURE)) {}, true }, + { "generic", new GenericContainer<>(TINY_IMAGE), true }, + { "anonymous generic", new GenericContainer(TINY_IMAGE) {}, true }, { "custom", new CustomContainer(), true }, { "anonymous custom", new CustomContainer() {}, true }, { "custom with containerIsCreated", new CustomContainerWithContainerIsCreated(), false }, @@ -92,14 +87,14 @@ public void shouldBeReusable() { static class CustomContainer extends GenericContainer { CustomContainer() { - super(IMAGE_FUTURE); + super(TINY_IMAGE); } } static class CustomContainerWithContainerIsCreated extends GenericContainer { CustomContainerWithContainerIsCreated() { - super(IMAGE_FUTURE); + super(TINY_IMAGE); } @Override @@ -115,7 +110,7 @@ public static class HooksTest extends AbstractReusabilityTest { List script = new ArrayList<>(); - GenericContainer container = makeReusable(new GenericContainer(new RemoteDockerImage(IMAGE_FUTURE)) { + GenericContainer container = makeReusable(new GenericContainer(TINY_IMAGE) { @Override protected boolean canBeReused() { @@ -194,7 +189,7 @@ public void shouldNotCallHookIfNotReused() { @FieldDefaults(makeFinal = true) public static class HashTest extends AbstractReusabilityTest { - protected GenericContainer container = makeReusable(new GenericContainer(IMAGE_FUTURE) { + protected GenericContainer container = makeReusable(new GenericContainer(TINY_IMAGE) { @Override public void copyFileToContainer(MountableFile mountableFile, String containerPath) { // NOOP @@ -302,7 +297,7 @@ public void shouldHashCopiedFiles() { @RunWith(BlockJUnit4ClassRunner.class) @FieldDefaults(makeFinal = true) public static class CopyFilesHashTest { - GenericContainer container = new GenericContainer<>(new RemoteDockerImage(IMAGE_FUTURE)); + GenericContainer container = new GenericContainer<>(TINY_IMAGE); @Test public void empty() { From fc7f62570b4ef32fe36238f30c21f02e1614917e Mon Sep 17 00:00:00 2001 From: Richard North Date: Sat, 4 Jul 2020 09:08:24 +0100 Subject: [PATCH 12/17] Use `DockerImageName` instead of `String` for image name --- .../images/ImagePullPolicyTest.java | 52 +++++++++++-------- 1 file changed, 29 insertions(+), 23 deletions(-) diff --git a/core/src/test/java/org/testcontainers/images/ImagePullPolicyTest.java b/core/src/test/java/org/testcontainers/images/ImagePullPolicyTest.java index 556c50a8d47..5290a191e8e 100644 --- a/core/src/test/java/org/testcontainers/images/ImagePullPolicyTest.java +++ b/core/src/test/java/org/testcontainers/images/ImagePullPolicyTest.java @@ -1,9 +1,9 @@ package org.testcontainers.images; import com.github.dockerjava.api.DockerClient; +import com.github.dockerjava.api.async.ResultCallback; +import com.github.dockerjava.api.command.PullImageResultCallback; import com.github.dockerjava.api.exception.NotFoundException; -import com.github.dockerjava.core.command.PullImageResultCallback; -import com.github.dockerjava.core.command.PushImageResultCallback; import org.junit.AfterClass; import org.junit.Before; import org.junit.BeforeClass; @@ -30,14 +30,14 @@ public class ImagePullPolicyTest { public static GenericContainer registry = new GenericContainer<>(DOCKER_REGISTRY_IMAGE) .withExposedPorts(5000); - private static String imageName; + private static DockerImageName imageName; @BeforeClass public static void beforeClass() throws Exception { String testRegistryAddress = registry.getHost() + ":" + registry.getFirstMappedPort(); String testImageName = testRegistryAddress + "/image-pull-policy-test"; String tag = UUID.randomUUID().toString(); - imageName = testImageName + ":" + tag; + imageName = DockerImageName.parse(testImageName).withTag(tag); DockerClient client = DockerClientFactory.instance().client(); String dummySourceImage = "hello-world:latest"; @@ -48,34 +48,28 @@ public static void beforeClass() throws Exception { // push the image to the registry client.tagImageCmd(dummyImageId, testImageName, tag).exec(); - client.pushImageCmd(imageName) - .exec(new PushImageResultCallback()) + client.pushImageCmd(imageName.asCanonicalNameString()) + .exec(new ResultCallback.Adapter<>()) .awaitCompletion(1, TimeUnit.MINUTES); } @AfterClass public static void afterClass() { - try { - DockerClientFactory.instance().client().removeImageCmd(imageName).withForce(true).exec(); - } catch (NotFoundException ignored) { - } + removeImage(); } @Before public void setUp() { // Clean up local cache - try { - DockerClientFactory.instance().client().removeImageCmd(imageName).withForce(true).exec(); - } catch (NotFoundException ignored) { - } + removeImage(); - LocalImagesCache.INSTANCE.cache.remove(DockerImageName.parse(imageName)); + LocalImagesCache.INSTANCE.cache.remove(imageName); } @Test public void pullsByDefault() { try ( - GenericContainer container = new GenericContainer(DockerImageName.parse(imageName)) + GenericContainer container = new GenericContainer<>(imageName) .withStartupCheckStrategy(new OneShotStartupCheckStrategy()) ) { container.start(); @@ -85,16 +79,19 @@ public void pullsByDefault() { @Test public void shouldAlwaysPull() { try ( - GenericContainer container = new GenericContainer(DockerImageName.parse(imageName)) + GenericContainer container = new GenericContainer<>(imageName) .withStartupCheckStrategy(new OneShotStartupCheckStrategy()) ) { container.start(); } - DockerClientFactory.instance().client().removeImageCmd(imageName).withForce(true).exec(); + DockerClientFactory.instance().client() + .removeImageCmd(imageName.asCanonicalNameString()) + .withForce(true) + .exec(); try ( - GenericContainer container = new GenericContainer(DockerImageName.parse(imageName)) + GenericContainer container = new GenericContainer<>(imageName) .withStartupCheckStrategy(new OneShotStartupCheckStrategy()) ) { expectToFailWithNotFoundException(container); @@ -102,7 +99,7 @@ public void shouldAlwaysPull() { try ( // built_in_image_pull_policy { - GenericContainer container = new GenericContainer(DockerImageName.parse(imageName)) + GenericContainer container = new GenericContainer<>(imageName) .withImagePullPolicy(PullPolicy.alwaysPull()) // } ) { @@ -115,7 +112,7 @@ public void shouldAlwaysPull() { public void shouldSupportCustomPolicies() { try ( // custom_image_pull_policy { - GenericContainer container = new GenericContainer(DockerImageName.parse(imageName)) + GenericContainer container = new GenericContainer<>(imageName) .withImagePullPolicy(new AbstractImagePullPolicy() { @Override protected boolean shouldPullCached(DockerImageName imageName, ImageData localImageData) { @@ -138,7 +135,7 @@ protected boolean shouldPullCached(DockerImageName imageName, ImageData localIma } }); try ( - GenericContainer container = new GenericContainer(DockerImageName.parse(imageName)) + GenericContainer container = new GenericContainer<>(imageName) .withImagePullPolicy(policy) .withStartupCheckStrategy(new OneShotStartupCheckStrategy()) ) { @@ -151,7 +148,7 @@ protected boolean shouldPullCached(DockerImageName imageName, ImageData localIma @Test public void shouldNotForcePulling() { try ( - GenericContainer container = new GenericContainer(DockerImageName.parse(imageName)) + GenericContainer container = new GenericContainer<>(imageName) .withImagePullPolicy(__ -> false) .withStartupCheckStrategy(new OneShotStartupCheckStrategy()) ) { @@ -176,4 +173,13 @@ private void expectToFailWithNotFoundException(GenericContainer container) { } } + private static void removeImage() { + try { + DockerClientFactory.instance().client() + .removeImageCmd(imageName.asCanonicalNameString()) + .withForce(true) + .exec(); + } catch (NotFoundException ignored) { + } + } } From cd7e13b9bc1f8a1ec9d03a06ad1c1e3c21074c78 Mon Sep 17 00:00:00 2001 From: Richard North Date: Sat, 4 Jul 2020 09:09:03 +0100 Subject: [PATCH 13/17] Inline Mongo image name parsing --- .../org/testcontainers/containers/MongoDBContainerTest.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/modules/mongodb/src/test/java/org/testcontainers/containers/MongoDBContainerTest.java b/modules/mongodb/src/test/java/org/testcontainers/containers/MongoDBContainerTest.java index c0977835506..d637cb07f2d 100644 --- a/modules/mongodb/src/test/java/org/testcontainers/containers/MongoDBContainerTest.java +++ b/modules/mongodb/src/test/java/org/testcontainers/containers/MongoDBContainerTest.java @@ -19,8 +19,6 @@ public class MongoDBContainerTest { - private static final DockerImageName MONGO_IMAGE = DockerImageName.parse("mongo:4.0.10"); - /** * Taken from https://docs.mongodb.com */ @@ -28,7 +26,7 @@ public class MongoDBContainerTest { public void shouldExecuteTransactions() { try ( // creatingMongoDBContainer { - final MongoDBContainer mongoDBContainer = new MongoDBContainer(MONGO_IMAGE) + final MongoDBContainer mongoDBContainer = new MongoDBContainer(DockerImageName.parse("mongo:4.0.10")) // } ) { From a35b3c4f34d83981282ea6dc2de5f53ee4824442 Mon Sep 17 00:00:00 2001 From: Richard North Date: Sat, 4 Jul 2020 09:11:17 +0100 Subject: [PATCH 14/17] Fix constructor delegation --- .../containers/BrowserWebDriverContainer.java | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/modules/selenium/src/main/java/org/testcontainers/containers/BrowserWebDriverContainer.java b/modules/selenium/src/main/java/org/testcontainers/containers/BrowserWebDriverContainer.java index d38110bead6..f1cedab76ad 100644 --- a/modules/selenium/src/main/java/org/testcontainers/containers/BrowserWebDriverContainer.java +++ b/modules/selenium/src/main/java/org/testcontainers/containers/BrowserWebDriverContainer.java @@ -87,17 +87,18 @@ public BrowserWebDriverContainer() { /** * Constructor taking a specific webdriver container name and tag - * @param dockerImageName Name of the docker image to pull + * @param dockerImageName Name of the selenium docker image * @deprecated use {@link BrowserWebDriverContainer(DockerImageName)} instead */ @Deprecated public BrowserWebDriverContainer(String dockerImageName) { this(DockerImageName.parse(dockerImageName)); - this.customImageNameIsSet = true; - // We have to force SKIP mode for the recording by default because we don't know if the image has VNC or not - recordingMode = VncRecordingMode.SKIP; } + /** + * Constructor taking a specific webdriver container name and tag + * @param dockerImageName Name of the selenium docker image + */ public BrowserWebDriverContainer(DockerImageName dockerImageName) { super(dockerImageName); final WaitStrategy logWaitStrategy = new LogMessageWaitStrategy() @@ -110,6 +111,10 @@ public BrowserWebDriverContainer(DockerImageName dockerImageName) { .withStartupTimeout(Duration.of(15, SECONDS)); this.withRecordingFileFactory(new DefaultRecordingFileFactory()); + + this.customImageNameIsSet = true; + // We have to force SKIP mode for the recording by default because we don't know if the image has VNC or not + recordingMode = VncRecordingMode.SKIP; } public SELF withCapabilities(Capabilities capabilities) { From 868f962393063893870d9055bc9dadc37f48b5b3 Mon Sep 17 00:00:00 2001 From: Richard North Date: Sat, 4 Jul 2020 09:15:09 +0100 Subject: [PATCH 15/17] Undo deprecation of SocatContainer no-args constructor --- .../testcontainers/containers/DockerComposeContainer.java | 2 +- .../java/org/testcontainers/containers/SocatContainer.java | 6 +----- .../testcontainers/containers/VncRecordingContainer.java | 2 +- 3 files changed, 3 insertions(+), 7 deletions(-) diff --git a/core/src/main/java/org/testcontainers/containers/DockerComposeContainer.java b/core/src/main/java/org/testcontainers/containers/DockerComposeContainer.java index 6a83e5f6a1d..04f2bf3050d 100644 --- a/core/src/main/java/org/testcontainers/containers/DockerComposeContainer.java +++ b/core/src/main/java/org/testcontainers/containers/DockerComposeContainer.java @@ -87,7 +87,7 @@ public class DockerComposeContainer> e private final Map> ambassadorPortMappings = new ConcurrentHashMap<>(); private final Map serviceInstanceMap = new ConcurrentHashMap<>(); private final Map waitStrategyMap = new ConcurrentHashMap<>(); - private final SocatContainer ambassadorContainer = new SocatContainer(TestcontainersConfiguration.getInstance().getSocatDockerImageName()); + private final SocatContainer ambassadorContainer = new SocatContainer(); private final Map>> logConsumers = new ConcurrentHashMap<>(); private static final Object MUTEX = new Object(); diff --git a/core/src/main/java/org/testcontainers/containers/SocatContainer.java b/core/src/main/java/org/testcontainers/containers/SocatContainer.java index dbf3f37e5fb..fbca73eb29d 100644 --- a/core/src/main/java/org/testcontainers/containers/SocatContainer.java +++ b/core/src/main/java/org/testcontainers/containers/SocatContainer.java @@ -16,12 +16,8 @@ public class SocatContainer extends GenericContainer { private final Map targets = new HashMap<>(); - /** - * @deprecated use {@link SocatContainer(DockerImageName)} instead - */ - @Deprecated public SocatContainer() { - this(DockerImageName.parse(TestcontainersConfiguration.getInstance().getSocatContainerImage())); + this(TestcontainersConfiguration.getInstance().getSocatDockerImageName()); } public SocatContainer(final DockerImageName dockerImageName) { diff --git a/core/src/main/java/org/testcontainers/containers/VncRecordingContainer.java b/core/src/main/java/org/testcontainers/containers/VncRecordingContainer.java index fd48dd01f92..8ac060c2af6 100644 --- a/core/src/main/java/org/testcontainers/containers/VncRecordingContainer.java +++ b/core/src/main/java/org/testcontainers/containers/VncRecordingContainer.java @@ -52,7 +52,7 @@ public VncRecordingContainer(@NonNull GenericContainer targetContainer) { * Create a sidekick container and attach it to another container. The VNC output of that container will be recorded. */ public VncRecordingContainer(@NonNull Network network, @NonNull String targetNetworkAlias) throws IllegalStateException { - super(TestcontainersConfiguration.getInstance().getVncRecordedContainerImage()); + super(TestcontainersConfiguration.getInstance().getVncDockerImageName()); this.targetNetworkAlias = targetNetworkAlias; withNetwork(network); From faf1217e3476256c3b3c4fbd3968633263be1b9f Mon Sep 17 00:00:00 2001 From: Richard North Date: Sat, 4 Jul 2020 11:36:51 +0100 Subject: [PATCH 16/17] Update references to DockerImageName.parse in example code --- docs/features/creating_container.md | 2 +- .../src/test/java/DisqueBackedMailSenderTest.java | 2 +- .../src/test/java/SingleDisqueInstanceTest.java | 2 +- .../example/linkedcontainer/LinkedContainerTestImages.java | 4 ++-- .../java/org/testcontainers/containers/MongoDbContainer.java | 2 +- .../org/testcontainers/containers/MongoDbContainerTest.java | 2 +- .../src/test/java/RedisBackedCacheTest.java | 2 +- .../src/test/java/RedisBackedCacheTest.java | 2 +- .../src/test/java/com/example/AbstractIntegrationTest.java | 2 +- .../src/test/java/com/example/SolrQueryTest.java | 2 +- .../src/test/java/com/example/AbstractIntegrationTest.java | 2 +- .../java/org/testcontainers/junit/mysql/SimpleMySQLTest.java | 4 ++-- 12 files changed, 14 insertions(+), 14 deletions(-) diff --git a/docs/features/creating_container.md b/docs/features/creating_container.md index 40b50e67f17..443e04f1a91 100644 --- a/docs/features/creating_container.md +++ b/docs/features/creating_container.md @@ -12,7 +12,7 @@ images as temporary test dependencies. For example, if you might use it to test With a generic container, you set the container image using a parameter to the rule constructor, e.g.: ```java -new GenericContainer(DockerImageName.of("jboss/wildfly:9.0.1.Final")) +new GenericContainer(DockerImageName.parse("jboss/wildfly:9.0.1.Final")) ``` ### Specifying an image diff --git a/examples/disque-job-queue/src/test/java/DisqueBackedMailSenderTest.java b/examples/disque-job-queue/src/test/java/DisqueBackedMailSenderTest.java index 8eccdb90b4c..add59fd15ba 100644 --- a/examples/disque-job-queue/src/test/java/DisqueBackedMailSenderTest.java +++ b/examples/disque-job-queue/src/test/java/DisqueBackedMailSenderTest.java @@ -22,7 +22,7 @@ public class DisqueBackedMailSenderTest { @Rule - public GenericContainer container = new GenericContainer<>(DockerImageName.of("richnorth/disque:1.0-rc1")) + public GenericContainer container = new GenericContainer<>(DockerImageName.parse("richnorth/disque:1.0-rc1")) .withExposedPorts(7711); private DisqueClient disqueClient; diff --git a/examples/disque-job-queue/src/test/java/SingleDisqueInstanceTest.java b/examples/disque-job-queue/src/test/java/SingleDisqueInstanceTest.java index f1e13b0efd0..3fa115bea20 100644 --- a/examples/disque-job-queue/src/test/java/SingleDisqueInstanceTest.java +++ b/examples/disque-job-queue/src/test/java/SingleDisqueInstanceTest.java @@ -22,7 +22,7 @@ public class SingleDisqueInstanceTest { @Rule - public GenericContainer container = new GenericContainer<>(DockerImageName.of("richnorth/disque:1.0-rc1")) + public GenericContainer container = new GenericContainer<>(DockerImageName.parse("richnorth/disque:1.0-rc1")) .withExposedPorts(7711); private DisqueCommands connection; private AddJobArgs retryAfter1Second; diff --git a/examples/linked-container/src/test/java/com/example/linkedcontainer/LinkedContainerTestImages.java b/examples/linked-container/src/test/java/com/example/linkedcontainer/LinkedContainerTestImages.java index 0936401d870..8bbbafd189f 100644 --- a/examples/linked-container/src/test/java/com/example/linkedcontainer/LinkedContainerTestImages.java +++ b/examples/linked-container/src/test/java/com/example/linkedcontainer/LinkedContainerTestImages.java @@ -3,6 +3,6 @@ import org.testcontainers.utility.DockerImageName; public interface LinkedContainerTestImages { - DockerImageName POSTGRES_TEST_IMAGE = DockerImageName.of("postgres:9.6.12"); - DockerImageName REDMINE_TEST_IMAGE = DockerImageName.of("redmine:3.3.2"); + DockerImageName POSTGRES_TEST_IMAGE = DockerImageName.parse("postgres:9.6.12"); + DockerImageName REDMINE_TEST_IMAGE = DockerImageName.parse("redmine:3.3.2"); } diff --git a/examples/mongodb-container/src/test/java/org/testcontainers/containers/MongoDbContainer.java b/examples/mongodb-container/src/test/java/org/testcontainers/containers/MongoDbContainer.java index 567eea7bcb2..e44f2bb982e 100644 --- a/examples/mongodb-container/src/test/java/org/testcontainers/containers/MongoDbContainer.java +++ b/examples/mongodb-container/src/test/java/org/testcontainers/containers/MongoDbContainer.java @@ -40,7 +40,7 @@ public MongoDbContainer() { */ @Deprecated public MongoDbContainer(@NotNull String image) { - this(DockerImageName.of(image)); + this(DockerImageName.parse(image)); } /** diff --git a/examples/mongodb-container/src/test/java/org/testcontainers/containers/MongoDbContainerTest.java b/examples/mongodb-container/src/test/java/org/testcontainers/containers/MongoDbContainerTest.java index d2e3d6fd2a4..7c87e46bccd 100644 --- a/examples/mongodb-container/src/test/java/org/testcontainers/containers/MongoDbContainerTest.java +++ b/examples/mongodb-container/src/test/java/org/testcontainers/containers/MongoDbContainerTest.java @@ -11,7 +11,7 @@ public class MongoDbContainerTest { @Test public void containerStartsAndPublicPortIsAvailable() { - try (MongoDbContainer container = new MongoDbContainer(DockerImageName.of("mongo:4.0"))) { + try (MongoDbContainer container = new MongoDbContainer(DockerImageName.parse("mongo:4.0"))) { container.start(); assertThatPortIsAvailable(container); } diff --git a/examples/redis-backed-cache-testng/src/test/java/RedisBackedCacheTest.java b/examples/redis-backed-cache-testng/src/test/java/RedisBackedCacheTest.java index 728d06da00f..5d204cf99c4 100644 --- a/examples/redis-backed-cache-testng/src/test/java/RedisBackedCacheTest.java +++ b/examples/redis-backed-cache-testng/src/test/java/RedisBackedCacheTest.java @@ -19,7 +19,7 @@ */ public class RedisBackedCacheTest { - private static GenericContainer redis = new GenericContainer<>(DockerImageName.of("redis:3.0.6")).withExposedPorts(6379); + private static GenericContainer redis = new GenericContainer<>(DockerImageName.parse("redis:3.0.6")).withExposedPorts(6379); private Cache cache; diff --git a/examples/redis-backed-cache/src/test/java/RedisBackedCacheTest.java b/examples/redis-backed-cache/src/test/java/RedisBackedCacheTest.java index 52cfbaaad82..d9d93b8255e 100644 --- a/examples/redis-backed-cache/src/test/java/RedisBackedCacheTest.java +++ b/examples/redis-backed-cache/src/test/java/RedisBackedCacheTest.java @@ -19,7 +19,7 @@ public class RedisBackedCacheTest { @Rule - public GenericContainer redis = new GenericContainer<>(DockerImageName.of("redis:3.0.6")) + public GenericContainer redis = new GenericContainer<>(DockerImageName.parse("redis:3.0.6")) .withExposedPorts(6379); private Cache cache; diff --git a/examples/singleton-container/src/test/java/com/example/AbstractIntegrationTest.java b/examples/singleton-container/src/test/java/com/example/AbstractIntegrationTest.java index 8c1ad3034c4..d152540fb1c 100644 --- a/examples/singleton-container/src/test/java/com/example/AbstractIntegrationTest.java +++ b/examples/singleton-container/src/test/java/com/example/AbstractIntegrationTest.java @@ -5,7 +5,7 @@ public abstract class AbstractIntegrationTest { - public static final GenericContainer redis = new GenericContainer<>(DockerImageName.of("redis:3.0.6")) + public static final GenericContainer redis = new GenericContainer<>(DockerImageName.parse("redis:3.0.6")) .withExposedPorts(6379); static { diff --git a/examples/solr-container/src/test/java/com/example/SolrQueryTest.java b/examples/solr-container/src/test/java/com/example/SolrQueryTest.java index 269d91a8a64..63ac67ac1cd 100644 --- a/examples/solr-container/src/test/java/com/example/SolrQueryTest.java +++ b/examples/solr-container/src/test/java/com/example/SolrQueryTest.java @@ -20,7 +20,7 @@ public class SolrQueryTest { - private static final DockerImageName SOLR_IMAGE = DockerImageName.of("solr:8.3.0"); + private static final DockerImageName SOLR_IMAGE = DockerImageName.parse("solr:8.3.0"); public static final SolrContainer solrContainer = new SolrContainer(SOLR_IMAGE) .withCollection(COLLECTION_NAME); diff --git a/examples/spring-boot/src/test/java/com/example/AbstractIntegrationTest.java b/examples/spring-boot/src/test/java/com/example/AbstractIntegrationTest.java index 5c98588e062..b6859563c69 100644 --- a/examples/spring-boot/src/test/java/com/example/AbstractIntegrationTest.java +++ b/examples/spring-boot/src/test/java/com/example/AbstractIntegrationTest.java @@ -17,7 +17,7 @@ @ActiveProfiles("test") public abstract class AbstractIntegrationTest { - static GenericContainer redis = new GenericContainer<>(DockerImageName.of("redis:3-alpine")) + static GenericContainer redis = new GenericContainer<>(DockerImageName.parse("redis:3-alpine")) .withExposedPorts(6379); @DynamicPropertySource diff --git a/modules/mysql/src/test/java/org/testcontainers/junit/mysql/SimpleMySQLTest.java b/modules/mysql/src/test/java/org/testcontainers/junit/mysql/SimpleMySQLTest.java index 7ff8f041f26..f0ceeb92a48 100644 --- a/modules/mysql/src/test/java/org/testcontainers/junit/mysql/SimpleMySQLTest.java +++ b/modules/mysql/src/test/java/org/testcontainers/junit/mysql/SimpleMySQLTest.java @@ -43,10 +43,10 @@ public class SimpleMySQLTest extends AbstractContainerDatabaseTest { public static MySQLContainer mysql = new MySQLContainer<>(MYSQL_IMAGE); @ClassRule - public static MySQLContainer mysqlOldVersion = new MySQLContainer<>(DockerImageName.of("mysql:5.5");) + public static MySQLContainer mysqlOldVersion = new MySQLContainer<>(DockerImageName.parse("mysql:5.5");) @ClassRule - public static MySQLContainer mysqlCustomConfig = new MySQLContainer<>(DockerImageName.of("mysql:5.6")) + public static MySQLContainer mysqlCustomConfig = new MySQLContainer<>(DockerImageName.parse("mysql:5.6")) .withConfigurationOverride("somepath/mysql_conf_override"); */ From cc4190d5af24b5c4580ae2bf75b741663d34f91b Mon Sep 17 00:00:00 2001 From: Richard North Date: Sun, 19 Jul 2020 11:41:40 +0100 Subject: [PATCH 17/17] Update core/src/test/java/org/testcontainers/images/ImagePullPolicyTest.java Co-authored-by: Sergei Egorov --- .../java/org/testcontainers/images/ImagePullPolicyTest.java | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/core/src/test/java/org/testcontainers/images/ImagePullPolicyTest.java b/core/src/test/java/org/testcontainers/images/ImagePullPolicyTest.java index 5290a191e8e..9b22f5e6166 100644 --- a/core/src/test/java/org/testcontainers/images/ImagePullPolicyTest.java +++ b/core/src/test/java/org/testcontainers/images/ImagePullPolicyTest.java @@ -85,10 +85,7 @@ public void shouldAlwaysPull() { container.start(); } - DockerClientFactory.instance().client() - .removeImageCmd(imageName.asCanonicalNameString()) - .withForce(true) - .exec(); + removeImage(); try ( GenericContainer container = new GenericContainer<>(imageName)