diff --git a/mkdocs.yml b/mkdocs.yml
index 708fbe06883..e1b21d80811 100644
--- a/mkdocs.yml
+++ b/mkdocs.yml
@@ -50,6 +50,7 @@ nav:
- modules/databases/dynalite.md
- modules/databases/influxdb.md
- modules/databases/mariadb.md
+ - modules/databases/mongodb.md
- modules/databases/mssqlserver.md
- modules/databases/mysql.md
- modules/databases/neo4j.md
diff --git a/modules/mongodb/build.gradle b/modules/mongodb/build.gradle
new file mode 100644
index 00000000000..57db1be21de
--- /dev/null
+++ b/modules/mongodb/build.gradle
@@ -0,0 +1,7 @@
+description = "Testcontainers :: MongoDB"
+
+dependencies {
+ compile project(':testcontainers')
+
+ testCompile("org.mongodb:mongodb-driver-sync:4.0.2")
+}
diff --git a/modules/mongodb/src/main/java/org/testcontainers/containers/MongoDBContainer.java b/modules/mongodb/src/main/java/org/testcontainers/containers/MongoDBContainer.java
new file mode 100644
index 00000000000..a7f57d310f2
--- /dev/null
+++ b/modules/mongodb/src/main/java/org/testcontainers/containers/MongoDBContainer.java
@@ -0,0 +1,120 @@
+package org.testcontainers.containers;
+
+import com.github.dockerjava.api.command.InspectContainerResponse;
+import lombok.NonNull;
+import lombok.SneakyThrows;
+import lombok.extern.slf4j.Slf4j;
+import org.testcontainers.containers.wait.strategy.Wait;
+
+import java.io.IOException;
+
+/**
+ * Constructs a single node MongoDB replica set for testing transactions.
+ * To construct a multi-node MongoDB cluster, consider the mongodb-replica-set project on GitHub
+ *
Tested on a MongoDB version 4.0.10+ (that is the default version if not specified).
+ */
+@Slf4j
+public class MongoDBContainer extends GenericContainer {
+ private static final int CONTAINER_EXIT_CODE_OK = 0;
+ private static final int MONGODB_INTERNAL_PORT = 27017;
+ private static final int AWAIT_INIT_REPLICA_SET_ATTEMPTS = 60;
+ private static final String MONGODB_VERSION_DEFAULT = "4.0.10";
+ private static final String MONGODB_DATABASE_NAME_DEFAULT = "test";
+
+ public MongoDBContainer() {
+ this("mongo:" + MONGODB_VERSION_DEFAULT);
+ }
+
+ public MongoDBContainer(@NonNull final String dockerImageName) {
+ super(dockerImageName);
+ withExposedPorts(MONGODB_INTERNAL_PORT);
+ withCommand("--replSet", "docker-rs");
+ waitingFor(
+ Wait.forLogMessage(".*waiting for connections on port.*", 1)
+ );
+ }
+
+ public String getReplicaSetUrl() {
+ if (!isRunning()) {
+ throw new IllegalStateException("MongoDBContainer should be started first");
+ }
+ return String.format(
+ "mongodb://%s:%d/%s",
+ getContainerIpAddress(),
+ getMappedPort(MONGODB_INTERNAL_PORT),
+ MONGODB_DATABASE_NAME_DEFAULT
+ );
+ }
+
+ @Override
+ protected void containerIsStarted(InspectContainerResponse containerInfo) {
+ initReplicaSet();
+ }
+
+ private String[] buildMongoEvalCommand(final String command) {
+ return new String[]{"mongo", "--eval", command};
+ }
+
+ private void checkMongoNodeExitCode(final Container.ExecResult execResult) {
+ if (execResult.getExitCode() != CONTAINER_EXIT_CODE_OK) {
+ final String errorMessage = String.format("An error occurred: %s", execResult.getStdout());
+ log.error(errorMessage);
+ throw new ReplicaSetInitializationException(errorMessage);
+ }
+ }
+
+ private String buildMongoWaitCommand() {
+ return String.format(
+ "var attempt = 0; " +
+ "while" +
+ "(%s) " +
+ "{ " +
+ "if (attempt > %d) {quit(1);} " +
+ "print('%s ' + attempt); sleep(100); attempt++; " +
+ " }",
+ "db.runCommand( { isMaster: 1 } ).ismaster==false",
+ AWAIT_INIT_REPLICA_SET_ATTEMPTS,
+ "An attempt to await for a single node replica set initialization:"
+ );
+ }
+
+ private void checkMongoNodeExitCodeAfterWaiting(
+ final Container.ExecResult execResultWaitForMaster
+ ) {
+ if (execResultWaitForMaster.getExitCode() != CONTAINER_EXIT_CODE_OK) {
+ final String errorMessage = String.format(
+ "A single node replica set was not initialized in a set timeout: %d attempts",
+ AWAIT_INIT_REPLICA_SET_ATTEMPTS
+ );
+ log.error(errorMessage);
+ throw new ReplicaSetInitializationException(errorMessage);
+ }
+ }
+
+ @SneakyThrows(value = {IOException.class, InterruptedException.class})
+ private void initReplicaSet() {
+ log.debug("Initializing a single node node replica set...");
+ final ExecResult execResultInitRs = execInContainer(
+ buildMongoEvalCommand("rs.initiate();")
+ );
+ log.debug(execResultInitRs.getStdout());
+ checkMongoNodeExitCode(execResultInitRs);
+
+ log.debug(
+ "Awaiting for a single node replica set initialization up to {} attempts",
+ AWAIT_INIT_REPLICA_SET_ATTEMPTS
+ );
+ final ExecResult execResultWaitForMaster = execInContainer(
+ buildMongoEvalCommand(buildMongoWaitCommand())
+ );
+ log.debug(execResultWaitForMaster.getStdout());
+
+ checkMongoNodeExitCodeAfterWaiting(execResultWaitForMaster);
+ }
+
+ public static class ReplicaSetInitializationException extends RuntimeException {
+ ReplicaSetInitializationException(final String errorMessage) {
+ super(errorMessage);
+ }
+ }
+}
diff --git a/modules/mongodb/src/test/java/org/testcontainers/containers/MongoDBContainerTest.java b/modules/mongodb/src/test/java/org/testcontainers/containers/MongoDBContainerTest.java
new file mode 100644
index 00000000000..7c4f4c12408
--- /dev/null
+++ b/modules/mongodb/src/test/java/org/testcontainers/containers/MongoDBContainerTest.java
@@ -0,0 +1,74 @@
+package org.testcontainers.containers;
+
+import com.mongodb.ReadConcern;
+import com.mongodb.ReadPreference;
+import com.mongodb.TransactionOptions;
+import com.mongodb.WriteConcern;
+import com.mongodb.client.ClientSession;
+import com.mongodb.client.MongoClient;
+import com.mongodb.client.MongoClients;
+import com.mongodb.client.MongoCollection;
+import com.mongodb.client.TransactionBody;
+import org.bson.Document;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
+
+public class MongoDBContainerTest {
+ /**
+ * Taken from https://docs.mongodb.com
+ */
+ @Test
+ public void shouldExecuteTransactions() {
+ try (
+ // creatingMongoDBContainer {
+ final MongoDBContainer mongoDBContainer = new MongoDBContainer()
+ // }
+ ) {
+
+ // startingMongoDBContainer {
+ mongoDBContainer.start();
+ // }
+
+ final String mongoRsUrl = mongoDBContainer.getReplicaSetUrl();
+ assertNotNull(mongoRsUrl);
+ final MongoClient mongoSyncClient = MongoClients.create(mongoRsUrl);
+ mongoSyncClient.getDatabase("mydb1").getCollection("foo")
+ .withWriteConcern(WriteConcern.MAJORITY).insertOne(new Document("abc", 0));
+ mongoSyncClient.getDatabase("mydb2").getCollection("bar")
+ .withWriteConcern(WriteConcern.MAJORITY).insertOne(new Document("xyz", 0));
+
+ final ClientSession clientSession = mongoSyncClient.startSession();
+ final TransactionOptions txnOptions = TransactionOptions.builder()
+ .readPreference(ReadPreference.primary())
+ .readConcern(ReadConcern.LOCAL)
+ .writeConcern(WriteConcern.MAJORITY)
+ .build();
+
+ final String trxResult = "Inserted into collections in different databases";
+
+ TransactionBody txnBody = () -> {
+ final MongoCollection coll1 =
+ mongoSyncClient.getDatabase("mydb1").getCollection("foo");
+ final MongoCollection coll2 =
+ mongoSyncClient.getDatabase("mydb2").getCollection("bar");
+
+ coll1.insertOne(clientSession, new Document("abc", 1));
+ coll2.insertOne(clientSession, new Document("xyz", 999));
+ return trxResult;
+ };
+
+ try {
+ final String trxResultActual = clientSession.withTransaction(txnBody, txnOptions);
+ assertEquals(trxResult, trxResultActual);
+ } catch (RuntimeException re) {
+ throw new IllegalStateException(re.getMessage(), re);
+ } finally {
+ clientSession.close();
+ mongoSyncClient.close();
+ }
+ }
+ }
+}
diff --git a/modules/mongodb/src/test/resources/logback-test.xml b/modules/mongodb/src/test/resources/logback-test.xml
new file mode 100644
index 00000000000..535e406fc13
--- /dev/null
+++ b/modules/mongodb/src/test/resources/logback-test.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+ %d{HH:mm:ss.SSS} %-5level %logger - %msg%n
+
+
+
+
+
+
+
+
+
From e6930d6ac986db1373e29b61263f61aecbfc5155 Mon Sep 17 00:00:00 2001
From: Vivek Jaiswal
Date: Wed, 13 May 2020 22:50:49 +0530
Subject: [PATCH 0072/4341] Fix typo in DinD docs (#2725)
---
.../continuous_integration/dind_patterns.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/docs/supported_docker_environment/continuous_integration/dind_patterns.md b/docs/supported_docker_environment/continuous_integration/dind_patterns.md
index 1534949e1bd..e742c047afa 100644
--- a/docs/supported_docker_environment/continuous_integration/dind_patterns.md
+++ b/docs/supported_docker_environment/continuous_integration/dind_patterns.md
@@ -32,7 +32,7 @@ Where:
* `-v /var/run/docker.sock:/var/run/docker.sock` will map the Docker socket
### Docker Compose example
-The same can be achived with Docker Compose:
+The same can be achieved with Docker Compose:
```yaml
tests:
image: maven:3
From 123f13aeec72b9c7998b8b5fa32aa1de57c3b31e Mon Sep 17 00:00:00 2001
From: Perennes
Date: Wed, 13 May 2020 21:34:26 +0200
Subject: [PATCH 0073/4341] Do not fail on duplicated local image tags. Fixes
#2431 (#2692)
* #2431 Correction for an edge case in local image repos (duplicates repo tags) crashing the image pulling
* Indentation correction
* Indentation correction
---
.../org/testcontainers/images/LocalImagesCache.java | 12 ++++++++----
1 file changed, 8 insertions(+), 4 deletions(-)
diff --git a/core/src/main/java/org/testcontainers/images/LocalImagesCache.java b/core/src/main/java/org/testcontainers/images/LocalImagesCache.java
index 29bc8ef1408..e6b330d4c90 100644
--- a/core/src/main/java/org/testcontainers/images/LocalImagesCache.java
+++ b/core/src/main/java/org/testcontainers/images/LocalImagesCache.java
@@ -79,10 +79,14 @@ private void populateFromList(List images) {
}
cache.putAll(
- Stream.of(repoTags).collect(Collectors.toMap(
- DockerImageName::new,
- it -> ImageData.from(image)
- ))
+ Stream.of(repoTags)
+ // Protection against some edge case where local image repository tags end up with duplicates
+ // making toMap crash at merge time.
+ .distinct()
+ .collect(Collectors.toMap(
+ DockerImageName::new,
+ it -> ImageData.from(image)
+ ))
);
}
}
From 284c272cbf5095fd586ffebfd7d7ec6e7f634f84 Mon Sep 17 00:00:00 2001
From: "dependabot-preview[bot]"
<27856297+dependabot-preview[bot]@users.noreply.github.com>
Date: Thu, 14 May 2020 10:25:00 +0100
Subject: [PATCH 0074/4341] Bump HikariCP from 3.4.3 to 3.4.5 in
/modules/junit-jupiter (#2697)
---
modules/junit-jupiter/build.gradle | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/modules/junit-jupiter/build.gradle b/modules/junit-jupiter/build.gradle
index fb5548c320d..5e143b3b706 100644
--- a/modules/junit-jupiter/build.gradle
+++ b/modules/junit-jupiter/build.gradle
@@ -6,7 +6,7 @@ dependencies {
testCompile project(':mysql')
testCompile project(':postgresql')
- testCompile 'com.zaxxer:HikariCP:3.4.3'
+ testCompile 'com.zaxxer:HikariCP:3.4.5'
testCompile 'redis.clients:jedis:3.3.0'
testCompile 'org.apache.httpcomponents:httpclient:4.5.12'
testCompile ('org.mockito:mockito-core:3.3.3') {
From d2b677856aa41940a106f2a9da9c15370cfb8077 Mon Sep 17 00:00:00 2001
From: "dependabot-preview[bot]"
<27856297+dependabot-preview[bot]@users.noreply.github.com>
Date: Thu, 14 May 2020 10:25:19 +0100
Subject: [PATCH 0075/4341] Bump tomcat-jdbc from 9.0.34 to 9.0.35 in
/modules/mariadb (#2712)
---
modules/mariadb/build.gradle | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/modules/mariadb/build.gradle b/modules/mariadb/build.gradle
index 730dae7c794..226e34aae90 100644
--- a/modules/mariadb/build.gradle
+++ b/modules/mariadb/build.gradle
@@ -12,7 +12,7 @@ dependencies {
testCompile 'org.mariadb.jdbc:mariadb-java-client:2.6.0'
testCompile 'com.zaxxer:HikariCP-java6:2.3.13'
testCompile 'commons-dbutils:commons-dbutils:1.7'
- testCompile 'org.apache.tomcat:tomcat-jdbc:9.0.34'
+ testCompile 'org.apache.tomcat:tomcat-jdbc:9.0.35'
testCompile 'org.vibur:vibur-dbcp:25.0'
testCompile testFixtures(project(':r2dbc'))
From df6816940a2970a0577933e6b9bd88719984ea30 Mon Sep 17 00:00:00 2001
From: "dependabot-preview[bot]"
<27856297+dependabot-preview[bot]@users.noreply.github.com>
Date: Thu, 14 May 2020 10:25:36 +0100
Subject: [PATCH 0076/4341] Bump assertj-core from 3.16.0 to 3.16.1 in
/modules/neo4j (#2698)
---
modules/neo4j/build.gradle | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/modules/neo4j/build.gradle b/modules/neo4j/build.gradle
index 77ac94a5e8d..4bc92e49cda 100644
--- a/modules/neo4j/build.gradle
+++ b/modules/neo4j/build.gradle
@@ -34,5 +34,5 @@ dependencies {
compile project(":testcontainers")
testCompile "org.neo4j.driver:neo4j-java-driver:1.7.5"
- testCompile 'org.assertj:assertj-core:3.16.0'
+ testCompile 'org.assertj:assertj-core:3.16.1'
}
From 1a754757ebc0d580e04a2ffdc504ed53a2a1e953 Mon Sep 17 00:00:00 2001
From: "dependabot-preview[bot]"
<27856297+dependabot-preview[bot]@users.noreply.github.com>
Date: Thu, 14 May 2020 10:25:41 +0100
Subject: [PATCH 0077/4341] Bump assertj-core from 3.16.0 to 3.16.1 in
/modules/junit-jupiter (#2700)
---
modules/junit-jupiter/build.gradle | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/modules/junit-jupiter/build.gradle b/modules/junit-jupiter/build.gradle
index 5e143b3b706..485e02f6089 100644
--- a/modules/junit-jupiter/build.gradle
+++ b/modules/junit-jupiter/build.gradle
@@ -12,7 +12,7 @@ dependencies {
testCompile ('org.mockito:mockito-core:3.3.3') {
exclude(module: 'hamcrest-core')
}
- testCompile 'org.assertj:assertj-core:3.16.0'
+ testCompile 'org.assertj:assertj-core:3.16.1'
testCompile 'org.junit.jupiter:junit-jupiter-params:5.6.2'
testRuntime 'org.postgresql:postgresql:42.2.12'
From f60160993117e83eae612d3614a4bdb7fc5fda37 Mon Sep 17 00:00:00 2001
From: "dependabot-preview[bot]"
<27856297+dependabot-preview[bot]@users.noreply.github.com>
Date: Thu, 14 May 2020 10:25:56 +0100
Subject: [PATCH 0078/4341] Bump assertj-core from 3.16.0 to 3.16.1 in
/modules/kafka (#2709)
---
modules/kafka/build.gradle | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/modules/kafka/build.gradle b/modules/kafka/build.gradle
index 17d6f4b652d..06090c5b35e 100644
--- a/modules/kafka/build.gradle
+++ b/modules/kafka/build.gradle
@@ -4,6 +4,6 @@ dependencies {
compile project(':testcontainers')
testCompile 'org.apache.kafka:kafka-clients:2.5.0'
- testCompile 'org.assertj:assertj-core:3.16.0'
+ testCompile 'org.assertj:assertj-core:3.16.1'
testCompile 'com.google.guava:guava:23.0'
}
From 948e58dca8ab80e60251f2e7065fc2e3d05a4513 Mon Sep 17 00:00:00 2001
From: "dependabot-preview[bot]"
<27856297+dependabot-preview[bot]@users.noreply.github.com>
Date: Thu, 14 May 2020 10:26:11 +0100
Subject: [PATCH 0079/4341] Bump HikariCP from 3.4.3 to 3.4.5 in /modules/spock
(#2699)
---
modules/spock/build.gradle | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/modules/spock/build.gradle b/modules/spock/build.gradle
index 7b1780391b5..fea1c8baa2d 100644
--- a/modules/spock/build.gradle
+++ b/modules/spock/build.gradle
@@ -12,7 +12,7 @@ dependencies {
testCompile project(':mysql')
testCompile project(':postgresql')
- testCompile 'com.zaxxer:HikariCP:3.4.3'
+ testCompile 'com.zaxxer:HikariCP:3.4.5'
testCompile 'org.apache.httpcomponents:httpclient:4.5.12'
testRuntime 'org.postgresql:postgresql:42.2.12'
From 7b3a45d1b2f607ba921f3523a9a0e1745768509d Mon Sep 17 00:00:00 2001
From: Richard North
Date: Thu, 14 May 2020 10:24:13 +0100
Subject: [PATCH 0080/4341] Reduce dependabot bump frequency
---
.dependabot/config.yml | 52 +++++++++++++++++++++---------------------
1 file changed, 26 insertions(+), 26 deletions(-)
diff --git a/.dependabot/config.yml b/.dependabot/config.yml
index 7fe8921a36b..bf80d72ab92 100644
--- a/.dependabot/config.yml
+++ b/.dependabot/config.yml
@@ -3,150 +3,150 @@ version: 1
update_configs:
- package_manager: "java:gradle"
directory: "/core"
- update_schedule: "daily"
+ update_schedule: "weekly"
# Explicit entry for each module
- package_manager: "java:gradle"
directory: "/modules/cassandra"
- update_schedule: "daily"
+ update_schedule: "weekly"
automerged_updates:
- match: { dependency_type: "development", update_type: "semver:minor" }
- match: { dependency_type: "production", update_type: "semver:minor" }
- package_manager: "java:gradle"
directory: "/modules/clickhouse"
- update_schedule: "daily"
+ update_schedule: "weekly"
automerged_updates:
- match: { dependency_type: "development", update_type: "semver:minor" }
- match: { dependency_type: "production", update_type: "semver:minor" }
- package_manager: "java:gradle"
directory: "/modules/couchbase"
- update_schedule: "daily"
+ update_schedule: "weekly"
automerged_updates:
- match: { dependency_type: "development", update_type: "semver:minor" }
- match: { dependency_type: "production", update_type: "semver:minor" }
- package_manager: "java:gradle"
directory: "/modules/database-commons"
- update_schedule: "daily"
+ update_schedule: "weekly"
automerged_updates:
- match: { dependency_type: "development", update_type: "semver:minor" }
- match: { dependency_type: "production", update_type: "semver:minor" }
- package_manager: "java:gradle"
directory: "/modules/dynalite"
- update_schedule: "daily"
+ update_schedule: "weekly"
automerged_updates:
- match: { dependency_type: "development", update_type: "semver:minor" }
- match: { dependency_type: "production", update_type: "semver:minor" }
- package_manager: "java:gradle"
directory: "/modules/elasticsearch"
- update_schedule: "daily"
+ update_schedule: "weekly"
automerged_updates:
- match: { dependency_type: "development", update_type: "semver:minor" }
- match: { dependency_type: "production", update_type: "semver:minor" }
- package_manager: "java:gradle"
directory: "/modules/influxdb"
- update_schedule: "daily"
+ update_schedule: "weekly"
automerged_updates:
- match: { dependency_type: "development", update_type: "semver:minor" }
- match: { dependency_type: "production", update_type: "semver:minor" }
- package_manager: "java:gradle"
directory: "/modules/jdbc"
- update_schedule: "daily"
+ update_schedule: "weekly"
automerged_updates:
- match: { dependency_type: "development", update_type: "semver:minor" }
- match: { dependency_type: "production", update_type: "semver:minor" }
- package_manager: "java:gradle"
directory: "/modules/jdbc-test"
- update_schedule: "daily"
+ update_schedule: "weekly"
automerged_updates:
- match: { dependency_type: "development", update_type: "semver:minor" }
- match: { dependency_type: "production", update_type: "semver:minor" }
- package_manager: "java:gradle"
directory: "/modules/junit-jupiter"
- update_schedule: "daily"
+ update_schedule: "weekly"
automerged_updates:
- match: { dependency_type: "development", update_type: "semver:minor" }
- match: { dependency_type: "production", update_type: "semver:minor" }
- package_manager: "java:gradle"
directory: "/modules/kafka"
- update_schedule: "daily"
+ update_schedule: "weekly"
automerged_updates:
- match: { dependency_type: "development", update_type: "semver:minor" }
- match: { dependency_type: "production", update_type: "semver:minor" }
- package_manager: "java:gradle"
directory: "/modules/localstack"
- update_schedule: "daily"
+ update_schedule: "weekly"
automerged_updates:
- match: { dependency_type: "development", update_type: "semver:minor" }
- match: { dependency_type: "production", update_type: "semver:minor" }
- package_manager: "java:gradle"
directory: "/modules/mariadb"
- update_schedule: "daily"
+ update_schedule: "weekly"
automerged_updates:
- match: { dependency_type: "development", update_type: "semver:minor" }
- match: { dependency_type: "production", update_type: "semver:minor" }
- package_manager: "java:gradle"
directory: "/modules/mockserver"
- update_schedule: "daily"
+ update_schedule: "weekly"
automerged_updates:
- match: { dependency_type: "development", update_type: "semver:minor" }
- match: { dependency_type: "production", update_type: "semver:minor" }
- package_manager: "java:gradle"
directory: "/modules/mssqlserver"
- update_schedule: "daily"
+ update_schedule: "weekly"
automerged_updates:
- match: { dependency_type: "development", update_type: "semver:minor" }
- match: { dependency_type: "production", update_type: "semver:minor" }
- package_manager: "java:gradle"
directory: "/modules/mysql"
- update_schedule: "daily"
+ update_schedule: "weekly"
automerged_updates:
- match: { dependency_type: "development", update_type: "semver:minor" }
- match: { dependency_type: "production", update_type: "semver:minor" }
- package_manager: "java:gradle"
directory: "/modules/neo4j"
- update_schedule: "daily"
+ update_schedule: "weekly"
automerged_updates:
- match: { dependency_type: "development", update_type: "semver:minor" }
- match: { dependency_type: "production", update_type: "semver:minor" }
- package_manager: "java:gradle"
directory: "/modules/nginx"
- update_schedule: "daily"
+ update_schedule: "weekly"
automerged_updates:
- match: { dependency_type: "development", update_type: "semver:minor" }
- match: { dependency_type: "production", update_type: "semver:minor" }
- package_manager: "java:gradle"
directory: "/modules/oracle-xe"
- update_schedule: "daily"
+ update_schedule: "weekly"
automerged_updates:
- match: { dependency_type: "development", update_type: "semver:minor" }
- match: { dependency_type: "production", update_type: "semver:minor" }
- package_manager: "java:gradle"
directory: "/modules/postgresql"
- update_schedule: "daily"
+ update_schedule: "weekly"
automerged_updates:
- match: { dependency_type: "development", update_type: "semver:minor" }
- match: { dependency_type: "production", update_type: "semver:minor" }
- package_manager: "java:gradle"
directory: "/modules/pulsar"
- update_schedule: "daily"
+ update_schedule: "weekly"
automerged_updates:
- match: { dependency_type: "development", update_type: "semver:minor" }
- match: { dependency_type: "production", update_type: "semver:minor" }
- package_manager: "java:gradle"
directory: "/modules/selenium"
- update_schedule: "daily"
+ update_schedule: "weekly"
automerged_updates:
- match: { dependency_type: "development", update_type: "semver:minor" }
- match: { dependency_type: "production", update_type: "semver:minor" }
- package_manager: "java:gradle"
directory: "/modules/spock"
- update_schedule: "daily"
+ update_schedule: "weekly"
automerged_updates:
- match: { dependency_type: "development", update_type: "semver:minor" }
- match: { dependency_type: "production", update_type: "semver:minor" }
- package_manager: "java:gradle"
directory: "/modules/vault"
- update_schedule: "daily"
+ update_schedule: "weekly"
automerged_updates:
- match: { dependency_type: "development", update_type: "semver:minor" }
- match: { dependency_type: "production", update_type: "semver:minor" }
@@ -154,7 +154,7 @@ update_configs:
# Examples
- package_manager: "java:gradle"
directory: "/examples"
- update_schedule: "daily"
+ update_schedule: "weekly"
automerged_updates:
- match: { dependency_type: "development", update_type: "semver:minor" }
- match: { dependency_type: "production", update_type: "semver:minor" }
From 64fc34a10e0bab2b1675b3878e52be72d6c65451 Mon Sep 17 00:00:00 2001
From: "dependabot-preview[bot]"
<27856297+dependabot-preview[bot]@users.noreply.github.com>
Date: Thu, 14 May 2020 10:26:39 +0100
Subject: [PATCH 0081/4341] Bump assertj-core from 3.16.0 to 3.16.1 in
/modules/pulsar (#2696)
---
modules/pulsar/build.gradle | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/modules/pulsar/build.gradle b/modules/pulsar/build.gradle
index ecfa7c5f26a..74626006ba0 100644
--- a/modules/pulsar/build.gradle
+++ b/modules/pulsar/build.gradle
@@ -4,5 +4,5 @@ dependencies {
compile project(':testcontainers')
testCompile group: 'org.apache.pulsar', name: 'pulsar-client', version: '2.5.1'
- testCompile group: 'org.assertj', name: 'assertj-core', version: '3.16.0'
+ testCompile group: 'org.assertj', name: 'assertj-core', version: '3.16.1'
}
From 279b5b25438e07856d437d4650cc0ec37b8b72de Mon Sep 17 00:00:00 2001
From: "dependabot-preview[bot]"
<27856297+dependabot-preview[bot]@users.noreply.github.com>
Date: Thu, 14 May 2020 10:26:45 +0100
Subject: [PATCH 0082/4341] Bump assertj-core from 3.16.0 to 3.16.1 in
/modules/vault (#2695)
---
modules/vault/build.gradle | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/modules/vault/build.gradle b/modules/vault/build.gradle
index b8681be150d..2b9f702f9d9 100644
--- a/modules/vault/build.gradle
+++ b/modules/vault/build.gradle
@@ -5,6 +5,6 @@ dependencies {
testCompile 'com.bettercloud:vault-java-driver:5.1.0'
testCompile 'io.rest-assured:rest-assured:4.3.0'
- testCompile 'org.assertj:assertj-core:3.16.0'
+ testCompile 'org.assertj:assertj-core:3.16.1'
}
From 82be21d7272f4e25adbd14db281f5a63e5c35489 Mon Sep 17 00:00:00 2001
From: "dependabot-preview[bot]"
<27856297+dependabot-preview[bot]@users.noreply.github.com>
Date: Thu, 14 May 2020 10:27:12 +0100
Subject: [PATCH 0083/4341] Bump assertj-core from 3.16.0 to 3.16.1 in
/modules/database-commons (#2703)
---
modules/database-commons/build.gradle | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/modules/database-commons/build.gradle b/modules/database-commons/build.gradle
index 14dffc649ac..82e318e5017 100644
--- a/modules/database-commons/build.gradle
+++ b/modules/database-commons/build.gradle
@@ -3,5 +3,5 @@ description = "Testcontainers :: Database-Commons"
dependencies {
compile project(':testcontainers')
- testCompile 'org.assertj:assertj-core:3.16.0'
+ testCompile 'org.assertj:assertj-core:3.16.1'
}
From 024d33261ed4c4337b4b6319a991d59e2401140f Mon Sep 17 00:00:00 2001
From: "dependabot-preview[bot]"
<27856297+dependabot-preview[bot]@users.noreply.github.com>
Date: Thu, 14 May 2020 10:27:25 +0100
Subject: [PATCH 0084/4341] Bump s3 from 2.13.12 to 2.13.16 in
/modules/localstack (#2729)
---
modules/localstack/build.gradle | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/modules/localstack/build.gradle b/modules/localstack/build.gradle
index 874e5fe54df..566eb403468 100644
--- a/modules/localstack/build.gradle
+++ b/modules/localstack/build.gradle
@@ -8,5 +8,5 @@ dependencies {
testCompile 'com.amazonaws:aws-java-sdk-sqs:1.11.778'
testCompile 'com.amazonaws:aws-java-sdk-logs:1.11.777'
testCompile 'com.amazonaws:aws-java-sdk-logs:1.11.775'
- testCompile 'software.amazon.awssdk:s3:2.13.12'
+ testCompile 'software.amazon.awssdk:s3:2.13.16'
}
From 1cefa4b9255d13a0ef20c1cec96d127e3b8d7dcd Mon Sep 17 00:00:00 2001
From: "dependabot-preview[bot]"
<27856297+dependabot-preview[bot]@users.noreply.github.com>
Date: Thu, 14 May 2020 10:27:37 +0100
Subject: [PATCH 0085/4341] Bump aws-java-sdk-sqs from 1.11.778 to 1.11.782 in
/modules/localstack (#2732)
---
modules/localstack/build.gradle | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/modules/localstack/build.gradle b/modules/localstack/build.gradle
index 566eb403468..44b732d4c60 100644
--- a/modules/localstack/build.gradle
+++ b/modules/localstack/build.gradle
@@ -5,7 +5,7 @@ dependencies {
compileOnly 'com.amazonaws:aws-java-sdk-s3:1.11.778'
testCompile 'com.amazonaws:aws-java-sdk-s3:1.11.775'
- testCompile 'com.amazonaws:aws-java-sdk-sqs:1.11.778'
+ testCompile 'com.amazonaws:aws-java-sdk-sqs:1.11.782'
testCompile 'com.amazonaws:aws-java-sdk-logs:1.11.777'
testCompile 'com.amazonaws:aws-java-sdk-logs:1.11.775'
testCompile 'software.amazon.awssdk:s3:2.13.16'
From 1a9e55457ab0f9b8ec5b5b3f8b27428d307118ac Mon Sep 17 00:00:00 2001
From: "dependabot-preview[bot]"
<27856297+dependabot-preview[bot]@users.noreply.github.com>
Date: Thu, 14 May 2020 10:29:43 +0100
Subject: [PATCH 0086/4341] Bump auto-service from 1.0-rc6 to 1.0-rc7 in
/modules/mssqlserver (#2734)
---
modules/mssqlserver/build.gradle | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/modules/mssqlserver/build.gradle b/modules/mssqlserver/build.gradle
index 4a496e9eb35..055548d4182 100644
--- a/modules/mssqlserver/build.gradle
+++ b/modules/mssqlserver/build.gradle
@@ -1,7 +1,7 @@
description = "Testcontainers :: MS SQL Server"
dependencies {
- annotationProcessor 'com.google.auto.service:auto-service:1.0-rc6'
+ annotationProcessor 'com.google.auto.service:auto-service:1.0-rc7'
compileOnly 'com.google.auto.service:auto-service:1.0-rc6'
compile project(':jdbc')
From 4ef332644a08ee57b3e01c57d275da3a33cec31b Mon Sep 17 00:00:00 2001
From: "dependabot-preview[bot]"
<27856297+dependabot-preview[bot]@users.noreply.github.com>
Date: Thu, 14 May 2020 10:30:07 +0100
Subject: [PATCH 0087/4341] Bump auto-service from 1.0-rc6 to 1.0-rc7 in
/modules/postgresql (#2735)
---
modules/postgresql/build.gradle | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/modules/postgresql/build.gradle b/modules/postgresql/build.gradle
index 9893ec28bd1..8c07465d424 100644
--- a/modules/postgresql/build.gradle
+++ b/modules/postgresql/build.gradle
@@ -1,7 +1,7 @@
description = "Testcontainers :: JDBC :: PostgreSQL"
dependencies {
- annotationProcessor 'com.google.auto.service:auto-service:1.0-rc6'
+ annotationProcessor 'com.google.auto.service:auto-service:1.0-rc7'
compileOnly 'com.google.auto.service:auto-service:1.0-rc6'
compile project(':jdbc')
From c40d56e4d44cfe4f5d0e0487a2f4b4627d9f6454 Mon Sep 17 00:00:00 2001
From: "dependabot-preview[bot]"
<27856297+dependabot-preview[bot]@users.noreply.github.com>
Date: Thu, 14 May 2020 10:30:16 +0100
Subject: [PATCH 0088/4341] Bump auto-service from 1.0-rc6 to 1.0-rc7 in
/modules/mysql (#2736)
---
modules/mysql/build.gradle | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/modules/mysql/build.gradle b/modules/mysql/build.gradle
index 2ee2d62ce59..d41609ac6aa 100644
--- a/modules/mysql/build.gradle
+++ b/modules/mysql/build.gradle
@@ -1,7 +1,7 @@
description = "Testcontainers :: JDBC :: MySQL"
dependencies {
- annotationProcessor 'com.google.auto.service:auto-service:1.0-rc6'
+ annotationProcessor 'com.google.auto.service:auto-service:1.0-rc7'
compileOnly 'com.google.auto.service:auto-service:1.0-rc6'
compile project(':jdbc')
From 44ab8134b286febe8a40f979372b550fd40dd9d1 Mon Sep 17 00:00:00 2001
From: "dependabot-preview[bot]"
<27856297+dependabot-preview[bot]@users.noreply.github.com>
Date: Thu, 14 May 2020 10:30:31 +0100
Subject: [PATCH 0089/4341] Bump auto-service from 1.0-rc6 to 1.0-rc7 in
/modules/mariadb (#2739)
---
modules/mariadb/build.gradle | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/modules/mariadb/build.gradle b/modules/mariadb/build.gradle
index 226e34aae90..fe8788cb06b 100644
--- a/modules/mariadb/build.gradle
+++ b/modules/mariadb/build.gradle
@@ -1,7 +1,7 @@
description = "Testcontainers :: JDBC :: MariaDB"
dependencies {
- annotationProcessor 'com.google.auto.service:auto-service:1.0-rc6'
+ annotationProcessor 'com.google.auto.service:auto-service:1.0-rc7'
compileOnly 'com.google.auto.service:auto-service:1.0-rc6'
compile project(':jdbc')
From 3f7c0ed2916cc103051fdcb713d1dabf96da3a16 Mon Sep 17 00:00:00 2001
From: "dependabot-preview[bot]"
<27856297+dependabot-preview[bot]@users.noreply.github.com>
Date: Thu, 14 May 2020 10:32:40 +0100
Subject: [PATCH 0090/4341] Bump java-client from 2.7.14 to 2.7.15 in
/modules/couchbase (#2701)
---
modules/couchbase/build.gradle | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/modules/couchbase/build.gradle b/modules/couchbase/build.gradle
index 9dd0856fd51..9cb778fd479 100644
--- a/modules/couchbase/build.gradle
+++ b/modules/couchbase/build.gradle
@@ -3,5 +3,5 @@ description = "Testcontainers :: Couchbase"
dependencies {
compile project(':testcontainers')
- testCompile 'com.couchbase.client:java-client:2.7.14'
+ testCompile 'com.couchbase.client:java-client:2.7.15'
}
From c4e2e3184afdef0b265e16498b83c520a1cfb31a Mon Sep 17 00:00:00 2001
From: "dependabot-preview[bot]"
<27856297+dependabot-preview[bot]@users.noreply.github.com>
Date: Thu, 14 May 2020 10:33:06 +0100
Subject: [PATCH 0091/4341] Bump tomcat-jdbc from 9.0.34 to 9.0.35 in
/modules/mysql (#2713)
---
modules/mysql/build.gradle | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/modules/mysql/build.gradle b/modules/mysql/build.gradle
index d41609ac6aa..04648e35f94 100644
--- a/modules/mysql/build.gradle
+++ b/modules/mysql/build.gradle
@@ -11,7 +11,7 @@ dependencies {
testCompile 'mysql:mysql-connector-java:8.0.20'
testCompile 'com.zaxxer:HikariCP-java6:2.3.13'
- testCompile 'org.apache.tomcat:tomcat-jdbc:9.0.34'
+ testCompile 'org.apache.tomcat:tomcat-jdbc:9.0.35'
testCompile 'commons-dbutils:commons-dbutils:1.7'
testCompile 'org.vibur:vibur-dbcp:25.0'
From e508b542f6d54adad17bf104ac0e34afd8ccc7f3 Mon Sep 17 00:00:00 2001
From: "dependabot-preview[bot]"
<27856297+dependabot-preview[bot]@users.noreply.github.com>
Date: Thu, 14 May 2020 10:33:40 +0100
Subject: [PATCH 0092/4341] Bump transport from 6.7.1 to 7.7.0 in
/modules/elasticsearch (#2737)
---
modules/elasticsearch/build.gradle | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/modules/elasticsearch/build.gradle b/modules/elasticsearch/build.gradle
index 6deaf802112..959d17e3d02 100644
--- a/modules/elasticsearch/build.gradle
+++ b/modules/elasticsearch/build.gradle
@@ -3,5 +3,5 @@ description = "TestContainers :: elasticsearch"
dependencies {
compile project(':testcontainers')
testCompile "org.elasticsearch.client:elasticsearch-rest-client:7.6.2"
- testCompile "org.elasticsearch.client:transport:6.7.1"
+ testCompile "org.elasticsearch.client:transport:7.7.0"
}
From 79d89ce75c300d26904a75f84430a118ab36d69b Mon Sep 17 00:00:00 2001
From: Richard North
Date: Thu, 14 May 2020 10:42:33 +0100
Subject: [PATCH 0093/4341] Revert "Bump transport from 6.7.1 to 7.7.0 in
/modules/elasticsearch" (#2740)
---
modules/elasticsearch/build.gradle | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/modules/elasticsearch/build.gradle b/modules/elasticsearch/build.gradle
index 959d17e3d02..6deaf802112 100644
--- a/modules/elasticsearch/build.gradle
+++ b/modules/elasticsearch/build.gradle
@@ -3,5 +3,5 @@ description = "TestContainers :: elasticsearch"
dependencies {
compile project(':testcontainers')
testCompile "org.elasticsearch.client:elasticsearch-rest-client:7.6.2"
- testCompile "org.elasticsearch.client:transport:7.7.0"
+ testCompile "org.elasticsearch.client:transport:6.7.1"
}
From 2f8bbdd57287bcf0409b02cf85f0343a05f52e68 Mon Sep 17 00:00:00 2001
From: "dependabot-preview[bot]"
<27856297+dependabot-preview[bot]@users.noreply.github.com>
Date: Thu, 14 May 2020 11:05:41 +0100
Subject: [PATCH 0094/4341] Bump assertj-core from 3.16.0 to 3.16.1 in /core
(#2706)
---
core/build.gradle | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/core/build.gradle b/core/build.gradle
index 312298bf77d..4c62a2416ef 100644
--- a/core/build.gradle
+++ b/core/build.gradle
@@ -165,7 +165,7 @@ dependencies {
// Synthetic JAR used for MountableFileTest and DirectoryTarResourceTest
testCompile files('testlib/repo/fakejar/fakejar/0/fakejar-0.jar')
- testCompile 'org.assertj:assertj-core:3.16.0'
+ testCompile 'org.assertj:assertj-core:3.16.1'
testCompile project(':test-support')
jarFileTestCompileOnly "org.projectlombok:lombok:${lombok.version}"
From c18a203e3bf06872c0f73a2743bb2c4da0a72023 Mon Sep 17 00:00:00 2001
From: Richard North
Date: Thu, 14 May 2020 11:37:08 +0100
Subject: [PATCH 0095/4341] Split JDBC tests (#2556)
---
modules/clickhouse/build.gradle | 3 +
.../clickhouse/ClickhouseJDBCDriverTest.java | 21 ++++
.../clickhouse/SimpleClickhouseTest.java | 25 +++++
modules/cockroachdb/build.gradle | 3 +
.../CockroachDBJDBCDriverTest.java | 21 ++++
.../cockroachdb}/SimpleCockroachDBTest.java | 3 +-
.../resources/somepath/init_postgresql.sql | 0
modules/db2/build.gradle | 3 +
.../jdbc/db2/DB2JDBCDriverTest.java | 21 ++++
.../junit/db2/SimpleDb2Test.java | 27 ++++++
.../container-license-acceptance.txt | 1 +
modules/jdbc-test/build.gradle | 46 ++++-----
.../db}/AbstractContainerDatabaseTest.java | 23 +----
.../jdbc/AbstractJDBCDriverTest.java} | 42 +-------
.../{test => main}/resources/logback-test.xml | 0
.../junit/CustomizableMSSQLServerTest.java | 44 ---------
.../junit/CustomizableMysqlTest.java | 47 ---------
.../junit/CustomizablePostgreSQLTest.java | 48 ----------
.../junit/EmptyPasswordMysqlTest.java | 46 ---------
.../junit/SimpleClickhouseTest.java | 25 -----
.../testcontainers/junit/SimpleDb2Test.java | 41 --------
.../junit/SimpleMSSQLServerTest.java | 47 ---------
.../container-license-acceptance.txt | 2 -
modules/jdbc/build.gradle | 7 ++
.../jupiter/inheritance/InheritedTests.java | 1 -
modules/mariadb/build.gradle | 5 +-
.../jdbc/mariadb/MariaDBJDBCDriverTest.java | 29 ++++++
.../junit/mariadb}/SimpleMariaDBTest.java | 42 +++-----
.../test/resources/somepath/init_mariadb.sql | 0
.../somepath/init_unicode_mariadb.sql} | 0
.../somepath/mariadb_conf_override/my.cnf | 0
modules/mssqlserver/build.gradle | 3 +
.../MSSQLServerJDBCDriverTest.java | 21 ++++
.../CustomPasswordMSSQLServerTest.java | 4 +-
.../CustomizableMSSQLServerTest.java | 28 ++++++
.../mssqlserver/SimpleMSSQLServerTest.java | 47 +++++++++
modules/mysql/build.gradle | 5 +-
modules/mysql/sql/init_mysql.sql | 5 +
.../jdbc/mysql}/JDBCDriverWithPoolTest.java | 36 ++++---
.../jdbc/mysql/MySQLJDBCDriverTest.java | 30 ++++++
.../junit/mysql/CustomizableMysqlTest.java | 34 +++++++
.../junit/mysql}/MultiVersionMySQLTest.java | 9 +-
.../junit/mysql}/SimpleMySQLTest.java | 96 ++++++++++---------
.../test/resources/somepath/init_mysql.sql | 0
.../resources/somepath/init_unicode_mysql.sql | 5 +
.../somepath/mysql_conf_override/my.cnf | 0
modules/oracle-xe/build.gradle | 3 +-
.../{ => jdbc}/OracleJDBCDriverTest.java | 2 +-
.../junit/oracle}/SimpleOracleTest.java | 19 ++--
modules/postgresql/build.gradle | 5 +-
.../PostgreSQLConnectionURLTest.java | 10 +-
.../jdbc/DatabaseDriverShutdownTest.java | 5 +-
.../jdbc/DatabaseDriverTmpfsTest.java | 6 ++
.../jdbc/postgis/PostgisJDBCDriverTest.java | 22 +++++
.../postgresql/PostgreSQLJDBCDriverTest.java | 21 ++++
.../CustomizablePostgreSQLTest.java | 35 +++++++
.../postgresql}/SimplePostgreSQLTest.java | 11 ++-
.../resources/somepath/init_postgresql.sql | 5 +
modules/presto/build.gradle | 4 +-
.../jdbc/presto/PrestoJDBCDriverTest.java | 21 ++++
test-support/build.gradle | 2 +-
61 files changed, 596 insertions(+), 521 deletions(-)
create mode 100644 modules/clickhouse/src/test/java/org/testcontainers/jdbc/clickhouse/ClickhouseJDBCDriverTest.java
create mode 100644 modules/clickhouse/src/test/java/org/testcontainers/junit/clickhouse/SimpleClickhouseTest.java
create mode 100644 modules/cockroachdb/src/test/java/org/testcontainers/jdbc/cockroachdb/CockroachDBJDBCDriverTest.java
rename modules/{jdbc-test/src/test/java/org/testcontainers/junit => cockroachdb/src/test/java/org/testcontainers/junit/cockroachdb}/SimpleCockroachDBTest.java (93%)
rename modules/{jdbc-test => cockroachdb}/src/test/resources/somepath/init_postgresql.sql (100%)
create mode 100644 modules/db2/src/test/java/org/testcontainers/jdbc/db2/DB2JDBCDriverTest.java
create mode 100644 modules/db2/src/test/java/org/testcontainers/junit/db2/SimpleDb2Test.java
create mode 100644 modules/db2/src/test/resources/container-license-acceptance.txt
rename modules/jdbc-test/src/{test/java/org/testcontainers/junit => main/java/org/testcontainers/db}/AbstractContainerDatabaseTest.java (55%)
rename modules/jdbc-test/src/{test/java/org/testcontainers/jdbc/JDBCDriverTest.java => main/java/org/testcontainers/jdbc/AbstractJDBCDriverTest.java} (63%)
rename modules/jdbc-test/src/{test => main}/resources/logback-test.xml (100%)
delete mode 100644 modules/jdbc-test/src/test/java/org/testcontainers/junit/CustomizableMSSQLServerTest.java
delete mode 100644 modules/jdbc-test/src/test/java/org/testcontainers/junit/CustomizableMysqlTest.java
delete mode 100644 modules/jdbc-test/src/test/java/org/testcontainers/junit/CustomizablePostgreSQLTest.java
delete mode 100644 modules/jdbc-test/src/test/java/org/testcontainers/junit/EmptyPasswordMysqlTest.java
delete mode 100644 modules/jdbc-test/src/test/java/org/testcontainers/junit/SimpleClickhouseTest.java
delete mode 100644 modules/jdbc-test/src/test/java/org/testcontainers/junit/SimpleDb2Test.java
delete mode 100644 modules/jdbc-test/src/test/java/org/testcontainers/junit/SimpleMSSQLServerTest.java
delete mode 100644 modules/jdbc-test/src/test/resources/container-license-acceptance.txt
create mode 100644 modules/mariadb/src/test/java/org/testcontainers/jdbc/mariadb/MariaDBJDBCDriverTest.java
rename modules/{jdbc-test/src/test/java/org/testcontainers/junit => mariadb/src/test/java/org/testcontainers/junit/mariadb}/SimpleMariaDBTest.java (70%)
rename modules/{jdbc-test => mariadb}/src/test/resources/somepath/init_mariadb.sql (100%)
rename modules/{jdbc-test/src/test/resources/somepath/init_unicode_mysql.sql => mariadb/src/test/resources/somepath/init_unicode_mariadb.sql} (100%)
rename modules/{jdbc-test => mariadb}/src/test/resources/somepath/mariadb_conf_override/my.cnf (100%)
create mode 100644 modules/mssqlserver/src/test/java/org/testcontainers/jdbc/mssqlserver/MSSQLServerJDBCDriverTest.java
rename modules/{jdbc-test/src/test/java/org/testcontainers/junit => mssqlserver/src/test/java/org/testcontainers/junit/mssqlserver}/CustomPasswordMSSQLServerTest.java (95%)
create mode 100644 modules/mssqlserver/src/test/java/org/testcontainers/junit/mssqlserver/CustomizableMSSQLServerTest.java
create mode 100644 modules/mssqlserver/src/test/java/org/testcontainers/junit/mssqlserver/SimpleMSSQLServerTest.java
create mode 100644 modules/mysql/sql/init_mysql.sql
rename modules/{jdbc-test/src/test/java/org/testcontainers/jdbc => mysql/src/test/java/org/testcontainers/jdbc/mysql}/JDBCDriverWithPoolTest.java (78%)
create mode 100644 modules/mysql/src/test/java/org/testcontainers/jdbc/mysql/MySQLJDBCDriverTest.java
create mode 100644 modules/mysql/src/test/java/org/testcontainers/junit/mysql/CustomizableMysqlTest.java
rename modules/{jdbc-test/src/test/java/org/testcontainers/junit => mysql/src/test/java/org/testcontainers/junit/mysql}/MultiVersionMySQLTest.java (76%)
rename modules/{jdbc-test/src/test/java/org/testcontainers/junit => mysql/src/test/java/org/testcontainers/junit/mysql}/SimpleMySQLTest.java (58%)
rename modules/{jdbc-test => mysql}/src/test/resources/somepath/init_mysql.sql (100%)
create mode 100644 modules/mysql/src/test/resources/somepath/init_unicode_mysql.sql
rename modules/{jdbc-test => mysql}/src/test/resources/somepath/mysql_conf_override/my.cnf (100%)
rename modules/oracle-xe/src/test/java/org/testcontainers/containers/{ => jdbc}/OracleJDBCDriverTest.java (97%)
rename modules/{jdbc-test/src/test/java/org/testcontainers/junit => oracle-xe/src/test/java/org/testcontainers/junit/oracle}/SimpleOracleTest.java (50%)
rename modules/{jdbc-test => postgresql}/src/test/java/org/testcontainers/jdbc/DatabaseDriverShutdownTest.java (76%)
rename modules/{jdbc-test => postgresql}/src/test/java/org/testcontainers/jdbc/DatabaseDriverTmpfsTest.java (71%)
create mode 100644 modules/postgresql/src/test/java/org/testcontainers/jdbc/postgis/PostgisJDBCDriverTest.java
create mode 100644 modules/postgresql/src/test/java/org/testcontainers/jdbc/postgresql/PostgreSQLJDBCDriverTest.java
create mode 100644 modules/postgresql/src/test/java/org/testcontainers/junit/postgresql/CustomizablePostgreSQLTest.java
rename modules/{jdbc-test/src/test/java/org/testcontainers/junit => postgresql/src/test/java/org/testcontainers/junit/postgresql}/SimplePostgreSQLTest.java (78%)
create mode 100644 modules/postgresql/src/test/resources/somepath/init_postgresql.sql
create mode 100644 modules/presto/src/test/java/org/testcontainers/jdbc/presto/PrestoJDBCDriverTest.java
diff --git a/modules/clickhouse/build.gradle b/modules/clickhouse/build.gradle
index 4f0e1a1fd90..323475b1d1c 100644
--- a/modules/clickhouse/build.gradle
+++ b/modules/clickhouse/build.gradle
@@ -3,4 +3,7 @@ description = "Testcontainers :: JDBC :: ClickHouse"
dependencies {
compile project(':testcontainers')
compile project(':jdbc')
+
+ testCompile project(':jdbc-test')
+ testCompile 'ru.yandex.clickhouse:clickhouse-jdbc:0.2.4'
}
diff --git a/modules/clickhouse/src/test/java/org/testcontainers/jdbc/clickhouse/ClickhouseJDBCDriverTest.java b/modules/clickhouse/src/test/java/org/testcontainers/jdbc/clickhouse/ClickhouseJDBCDriverTest.java
new file mode 100644
index 00000000000..f3946c8a317
--- /dev/null
+++ b/modules/clickhouse/src/test/java/org/testcontainers/jdbc/clickhouse/ClickhouseJDBCDriverTest.java
@@ -0,0 +1,21 @@
+package org.testcontainers.jdbc.clickhouse;
+
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.testcontainers.jdbc.AbstractJDBCDriverTest;
+
+import java.util.EnumSet;
+
+import static java.util.Arrays.asList;
+
+@RunWith(Parameterized.class)
+public class ClickhouseJDBCDriverTest extends AbstractJDBCDriverTest {
+
+ @Parameterized.Parameters(name = "{index} - {0}")
+ public static Iterable data() {
+ return asList(
+ new Object[][]{
+ {"jdbc:tc:clickhouse://hostname/databasename", EnumSet.of(Options.PmdKnownBroken)},
+ });
+ }
+}
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
new file mode 100644
index 00000000000..2dbce0b3593
--- /dev/null
+++ b/modules/clickhouse/src/test/java/org/testcontainers/junit/clickhouse/SimpleClickhouseTest.java
@@ -0,0 +1,25 @@
+package org.testcontainers.junit.clickhouse;
+
+import org.junit.Test;
+import org.testcontainers.containers.ClickHouseContainer;
+import org.testcontainers.db.AbstractContainerDatabaseTest;
+
+import java.sql.ResultSet;
+import java.sql.SQLException;
+
+import static org.rnorth.visibleassertions.VisibleAssertions.assertEquals;
+
+public class SimpleClickhouseTest extends AbstractContainerDatabaseTest {
+
+ @Test
+ public void testSimple() throws SQLException {
+ try (ClickHouseContainer clickhouse = new ClickHouseContainer()) {
+ clickhouse.start();
+
+ ResultSet resultSet = performQuery(clickhouse, "SELECT 1");
+
+ int resultSetInt = resultSet.getInt(1);
+ assertEquals("A basic SELECT query succeeds", 1, resultSetInt);
+ }
+ }
+}
diff --git a/modules/cockroachdb/build.gradle b/modules/cockroachdb/build.gradle
index e52f9f3729c..a3927258679 100644
--- a/modules/cockroachdb/build.gradle
+++ b/modules/cockroachdb/build.gradle
@@ -2,4 +2,7 @@ description = "Testcontainers :: JDBC :: CockroachDB"
dependencies {
compile project(':jdbc')
+
+ testCompile project(':jdbc-test')
+ testCompile 'org.postgresql:postgresql:42.2.12'
}
diff --git a/modules/cockroachdb/src/test/java/org/testcontainers/jdbc/cockroachdb/CockroachDBJDBCDriverTest.java b/modules/cockroachdb/src/test/java/org/testcontainers/jdbc/cockroachdb/CockroachDBJDBCDriverTest.java
new file mode 100644
index 00000000000..75b1fadb47e
--- /dev/null
+++ b/modules/cockroachdb/src/test/java/org/testcontainers/jdbc/cockroachdb/CockroachDBJDBCDriverTest.java
@@ -0,0 +1,21 @@
+package org.testcontainers.jdbc.cockroachdb;
+
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.testcontainers.jdbc.AbstractJDBCDriverTest;
+
+import java.util.EnumSet;
+
+import static java.util.Arrays.asList;
+
+@RunWith(Parameterized.class)
+public class CockroachDBJDBCDriverTest extends AbstractJDBCDriverTest {
+
+ @Parameterized.Parameters(name = "{index} - {0}")
+ public static Iterable data() {
+ return asList(
+ new Object[][]{
+ {"jdbc:tc:cockroach://hostname/databasename", EnumSet.noneOf(Options.class)},
+ });
+ }
+}
diff --git a/modules/jdbc-test/src/test/java/org/testcontainers/junit/SimpleCockroachDBTest.java b/modules/cockroachdb/src/test/java/org/testcontainers/junit/cockroachdb/SimpleCockroachDBTest.java
similarity index 93%
rename from modules/jdbc-test/src/test/java/org/testcontainers/junit/SimpleCockroachDBTest.java
rename to modules/cockroachdb/src/test/java/org/testcontainers/junit/cockroachdb/SimpleCockroachDBTest.java
index c21a5ddfaf1..7c62b2f6bcf 100644
--- a/modules/jdbc-test/src/test/java/org/testcontainers/junit/SimpleCockroachDBTest.java
+++ b/modules/cockroachdb/src/test/java/org/testcontainers/junit/cockroachdb/SimpleCockroachDBTest.java
@@ -1,7 +1,8 @@
-package org.testcontainers.junit;
+package org.testcontainers.junit.cockroachdb;
import org.junit.Test;
import org.testcontainers.containers.CockroachContainer;
+import org.testcontainers.db.AbstractContainerDatabaseTest;
import java.sql.ResultSet;
import java.sql.SQLException;
diff --git a/modules/jdbc-test/src/test/resources/somepath/init_postgresql.sql b/modules/cockroachdb/src/test/resources/somepath/init_postgresql.sql
similarity index 100%
rename from modules/jdbc-test/src/test/resources/somepath/init_postgresql.sql
rename to modules/cockroachdb/src/test/resources/somepath/init_postgresql.sql
diff --git a/modules/db2/build.gradle b/modules/db2/build.gradle
index a92631df264..feaf5f790c5 100644
--- a/modules/db2/build.gradle
+++ b/modules/db2/build.gradle
@@ -2,4 +2,7 @@ description = "Testcontainers :: JDBC :: DB2"
dependencies {
compile project(':jdbc')
+
+ testCompile project(':jdbc-test')
+ testCompile 'com.ibm.db2:jcc:11.5.0.0'
}
diff --git a/modules/db2/src/test/java/org/testcontainers/jdbc/db2/DB2JDBCDriverTest.java b/modules/db2/src/test/java/org/testcontainers/jdbc/db2/DB2JDBCDriverTest.java
new file mode 100644
index 00000000000..2c87a4a1a65
--- /dev/null
+++ b/modules/db2/src/test/java/org/testcontainers/jdbc/db2/DB2JDBCDriverTest.java
@@ -0,0 +1,21 @@
+package org.testcontainers.jdbc.db2;
+
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.testcontainers.jdbc.AbstractJDBCDriverTest;
+
+import java.util.EnumSet;
+
+import static java.util.Arrays.asList;
+
+@RunWith(Parameterized.class)
+public class DB2JDBCDriverTest extends AbstractJDBCDriverTest {
+
+ @Parameterized.Parameters(name = "{index} - {0}")
+ public static Iterable data() {
+ return asList(
+ new Object[][]{
+ {"jdbc:tc:db2://hostname/databasename", EnumSet.noneOf(Options.class)}
+ });
+ }
+}
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
new file mode 100644
index 00000000000..08f427cf12b
--- /dev/null
+++ b/modules/db2/src/test/java/org/testcontainers/junit/db2/SimpleDb2Test.java
@@ -0,0 +1,27 @@
+package org.testcontainers.junit.db2;
+
+import org.junit.Test;
+import org.testcontainers.containers.Db2Container;
+import org.testcontainers.db.AbstractContainerDatabaseTest;
+
+import java.sql.ResultSet;
+import java.sql.SQLException;
+
+import static org.rnorth.visibleassertions.VisibleAssertions.assertEquals;
+
+public class SimpleDb2Test extends AbstractContainerDatabaseTest {
+
+ @Test
+ public void testSimple() throws SQLException {
+ try (Db2Container db2 = new Db2Container()
+ .acceptLicense()) {
+
+ db2.start();
+
+ ResultSet resultSet = performQuery(db2, "SELECT 1 FROM SYSIBM.SYSDUMMY1");
+
+ int resultSetInt = resultSet.getInt(1);
+ assertEquals("A basic SELECT query succeeds", 1, resultSetInt);
+ }
+ }
+}
diff --git a/modules/db2/src/test/resources/container-license-acceptance.txt b/modules/db2/src/test/resources/container-license-acceptance.txt
new file mode 100644
index 00000000000..c4ad0a38410
--- /dev/null
+++ b/modules/db2/src/test/resources/container-license-acceptance.txt
@@ -0,0 +1 @@
+ibmcom/db2:11.5.0.0a
diff --git a/modules/jdbc-test/build.gradle b/modules/jdbc-test/build.gradle
index c7c909782bb..8b36f126b86 100644
--- a/modules/jdbc-test/build.gradle
+++ b/modules/jdbc-test/build.gradle
@@ -1,35 +1,21 @@
-repositories {
- maven {
- url "https://maven.atlassian.com/3rdparty/"
- }
-}
-
dependencies {
- compile project(':mysql')
- compile project(':postgresql')
- compile project(':presto')
- compile project(':cockroachdb')
- compile project(':mariadb')
- compile project(':oracle-xe')
- compile project(':mssqlserver')
- compile project(':clickhouse')
- compile project(':db2')
+ compile project(':jdbc')
+ compile project(':test-support')
- testCompile 'com.google.guava:guava:18.0'
- testCompile 'org.postgresql:postgresql:42.0.0'
- testCompile 'io.prestosql:presto-jdbc:329'
- testCompile 'mysql:mysql-connector-java:8.0.14'
- testCompile 'org.mariadb.jdbc:mariadb-java-client:1.4.6'
- testCompile 'com.oracle:ojdbc6:12.1.0.1-atlassian-hosted'
- testCompile 'com.microsoft.sqlserver:mssql-jdbc:6.1.0.jre8'
- testCompile 'ru.yandex.clickhouse:clickhouse-jdbc:0.1.41'
- testCompile 'com.ibm.db2:jcc:11.1.4.4'
+ compile 'com.google.guava:guava:28.2-jre'
+ compile 'org.apache.commons:commons-lang3:3.10'
+ compile 'com.zaxxer:HikariCP-java6:2.3.13'
+ compile 'commons-dbutils:commons-dbutils:1.7'
- testCompile 'com.zaxxer:HikariCP-java6:2.3.8'
- testCompile 'org.apache.tomcat:tomcat-jdbc:8.5.4'
- testCompile 'org.vibur:vibur-dbcp:9.0'
- testCompile 'commons-dbutils:commons-dbutils:1.6'
+ compile 'com.googlecode.junit-toolbox:junit-toolbox:2.4'
+
+ compile('org.rnorth.visible-assertions:visible-assertions:2.1.2') {
+ // Excluded in favor of jna-platform
+ exclude(group: "net.java.dev.jna", module: "jna")
+ }
- testCompile 'com.googlecode.junit-toolbox:junit-toolbox:2.4'
- testCompile project(':test-support')
+ compile 'commons-dbutils:commons-dbutils:1.7'
+ compile 'org.apache.tomcat:tomcat-jdbc:9.0.33'
+ compile 'org.vibur:vibur-dbcp:25.0'
+ compile 'mysql:mysql-connector-java:8.0.19'
}
diff --git a/modules/jdbc-test/src/test/java/org/testcontainers/junit/AbstractContainerDatabaseTest.java b/modules/jdbc-test/src/main/java/org/testcontainers/db/AbstractContainerDatabaseTest.java
similarity index 55%
rename from modules/jdbc-test/src/test/java/org/testcontainers/junit/AbstractContainerDatabaseTest.java
rename to modules/jdbc-test/src/main/java/org/testcontainers/db/AbstractContainerDatabaseTest.java
index 7230759382d..8881ed963d8 100644
--- a/modules/jdbc-test/src/test/java/org/testcontainers/junit/AbstractContainerDatabaseTest.java
+++ b/modules/jdbc-test/src/main/java/org/testcontainers/db/AbstractContainerDatabaseTest.java
@@ -1,22 +1,17 @@
-package org.testcontainers.junit;
+package org.testcontainers.db;
import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;
-import org.junit.After;
import org.testcontainers.containers.JdbcDatabaseContainer;
import javax.sql.DataSource;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
-import java.util.HashSet;
-import java.util.Set;
-abstract class AbstractContainerDatabaseTest {
+public abstract class AbstractContainerDatabaseTest {
- private final Set datasourcesForCleanup = new HashSet<>();
-
- ResultSet performQuery(JdbcDatabaseContainer container, String sql) throws SQLException {
+ protected ResultSet performQuery(JdbcDatabaseContainer> container, String sql) throws SQLException {
DataSource ds = getDataSource(container);
Statement statement = ds.getConnection().createStatement();
statement.execute(sql);
@@ -26,21 +21,13 @@ ResultSet performQuery(JdbcDatabaseContainer container, String sql) throws SQLEx
return resultSet;
}
- DataSource getDataSource(JdbcDatabaseContainer container) {
+ protected DataSource getDataSource(JdbcDatabaseContainer> container) {
HikariConfig hikariConfig = new HikariConfig();
hikariConfig.setJdbcUrl(container.getJdbcUrl());
hikariConfig.setUsername(container.getUsername());
hikariConfig.setPassword(container.getPassword());
hikariConfig.setDriverClassName(container.getDriverClassName());
- final HikariDataSource dataSource = new HikariDataSource(hikariConfig);
- datasourcesForCleanup.add(dataSource);
-
- return dataSource;
- }
-
- @After
- public void teardown() {
- datasourcesForCleanup.forEach(HikariDataSource::close);
+ return new HikariDataSource(hikariConfig);
}
}
diff --git a/modules/jdbc-test/src/test/java/org/testcontainers/jdbc/JDBCDriverTest.java b/modules/jdbc-test/src/main/java/org/testcontainers/jdbc/AbstractJDBCDriverTest.java
similarity index 63%
rename from modules/jdbc-test/src/test/java/org/testcontainers/jdbc/JDBCDriverTest.java
rename to modules/jdbc-test/src/main/java/org/testcontainers/jdbc/AbstractJDBCDriverTest.java
index c96ce251a63..38ca2237567 100644
--- a/modules/jdbc-test/src/test/java/org/testcontainers/jdbc/JDBCDriverTest.java
+++ b/modules/jdbc-test/src/main/java/org/testcontainers/jdbc/AbstractJDBCDriverTest.java
@@ -6,8 +6,6 @@
import org.apache.commons.lang.SystemUtils;
import org.junit.AfterClass;
import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameter;
import java.sql.Connection;
@@ -16,15 +14,13 @@
import java.sql.Statement;
import java.util.EnumSet;
-import static java.util.Arrays.asList;
import static org.junit.Assume.assumeFalse;
import static org.rnorth.visibleassertions.VisibleAssertions.assertEquals;
import static org.rnorth.visibleassertions.VisibleAssertions.assertTrue;
-@RunWith(Parameterized.class)
-public class JDBCDriverTest {
+public class AbstractJDBCDriverTest {
- private enum Options {
+ protected enum Options {
ScriptedSchema,
CharacterSet,
CustomIniFile,
@@ -37,40 +33,6 @@ private enum Options {
@Parameter(1)
public EnumSet options;
- @Parameterized.Parameters(name = "{index} - {0}")
- public static Iterable data() {
- return asList(
- new Object[][]{
- {"jdbc:tc:mysql://hostname/databasename", EnumSet.noneOf(Options.class)},
- {"jdbc:tc:mysql://hostname/databasename?user=someuser&TC_INITSCRIPT=somepath/init_mysql.sql", EnumSet.of(Options.ScriptedSchema, Options.JDBCParams)},
- {"jdbc:tc:mysql:5.5.43://hostname/databasename?user=someuser&TC_INITFUNCTION=org.testcontainers.jdbc.JDBCDriverTest::sampleInitFunction", EnumSet.of(Options.ScriptedSchema, Options.JDBCParams)},
- {"jdbc:tc:mysql:5.5.43://hostname/databasename?user=someuser&password=somepwd&TC_INITSCRIPT=somepath/init_mysql.sql", EnumSet.of(Options.ScriptedSchema, Options.JDBCParams)},
- {"jdbc:tc:mysql:5.5.43://hostname/databasename?user=someuser&password=somepwd&TC_INITSCRIPT=file:sql/init_mysql.sql", EnumSet.of(Options.ScriptedSchema, Options.JDBCParams)},
- {"jdbc:tc:mysql:5.5.43://hostname/databasename?user=someuser&password=somepwd&TC_INITFUNCTION=org.testcontainers.jdbc.JDBCDriverTest::sampleInitFunction", EnumSet.of(Options.ScriptedSchema, Options.JDBCParams)},
- {"jdbc:tc:mysql:5.5.43://hostname/databasename?TC_INITSCRIPT=somepath/init_unicode_mysql.sql&useUnicode=yes&characterEncoding=utf8", EnumSet.of(Options.CharacterSet)},
- {"jdbc:tc:mysql:5.5.43://hostname/databasename", EnumSet.noneOf(Options.class)},
- {"jdbc:tc:mysql:5.5.43://hostname/databasename?useSSL=false", EnumSet.noneOf(Options.class)},
- {"jdbc:tc:postgresql:9.6.8://hostname/databasename?user=someuser&password=somepwd", EnumSet.of(Options.JDBCParams)},
- {"jdbc:tc:postgis://hostname/databasename?user=someuser&password=somepwd", EnumSet.of(Options.JDBCParams)},
- {"jdbc:tc:postgis:9.6://hostname/databasename?user=someuser&password=somepwd", EnumSet.of(Options.JDBCParams)},
- {"jdbc:tc:presto:329://hostname/", EnumSet.of(Options.PmdKnownBroken)},
- {"jdbc:tc:mysql:5.6://hostname/databasename?TC_MY_CNF=somepath/mysql_conf_override", EnumSet.of(Options.CustomIniFile)},
- {"jdbc:tc:mariadb://hostname/databasename", EnumSet.noneOf(Options.class)},
- {"jdbc:tc:mariadb://hostname/databasename?user=someuser&TC_INITSCRIPT=somepath/init_mariadb.sql", EnumSet.of(Options.ScriptedSchema, Options.JDBCParams)},
- {"jdbc:tc:mariadb:10.2.14://hostname/databasename", EnumSet.noneOf(Options.class)},
- {"jdbc:tc:mariadb:10.2.14://hostname/databasename?TC_INITSCRIPT=somepath/init_unicode_mysql.sql&useUnicode=yes&characterEncoding=utf8", EnumSet.of(Options.CharacterSet)},
- {"jdbc:tc:mariadb:10.2.14://hostname/databasename?user=someuser&TC_INITSCRIPT=somepath/init_mariadb.sql", EnumSet.of(Options.ScriptedSchema, Options.JDBCParams)},
- {"jdbc:tc:mariadb:10.2.14://hostname/databasename?user=someuser&TC_INITFUNCTION=org.testcontainers.jdbc.JDBCDriverTest::sampleInitFunction", EnumSet.of(Options.ScriptedSchema, Options.JDBCParams)},
- {"jdbc:tc:mariadb:10.2.14://hostname/databasename?user=someuser&password=somepwd&TC_INITSCRIPT=somepath/init_mariadb.sql", EnumSet.of(Options.ScriptedSchema, Options.JDBCParams)},
- {"jdbc:tc:mariadb:10.2.14://hostname/databasename?user=someuser&password=somepwd&TC_INITFUNCTION=org.testcontainers.jdbc.JDBCDriverTest::sampleInitFunction", EnumSet.of(Options.ScriptedSchema, Options.JDBCParams)},
- {"jdbc:tc:mariadb:10.2.14://hostname/databasename?TC_MY_CNF=somepath/mariadb_conf_override", EnumSet.of(Options.CustomIniFile)},
- {"jdbc:tc:clickhouse://hostname/databasename", EnumSet.of(Options.PmdKnownBroken)},
- {"jdbc:tc:sqlserver:2017-CU12://hostname:hostport;databaseName=databasename", EnumSet.noneOf(Options.class)},
- {"jdbc:tc:cockroach://hostname/databasename", EnumSet.noneOf(Options.class)},
-// {"jdbc:tc:db2://hostname/databasename", EnumSet.noneOf(Options.class)}
- });
- }
-
public static void sampleInitFunction(Connection connection) throws SQLException {
connection.createStatement().execute("CREATE TABLE bar (\n" +
" foo VARCHAR(255)\n" +
diff --git a/modules/jdbc-test/src/test/resources/logback-test.xml b/modules/jdbc-test/src/main/resources/logback-test.xml
similarity index 100%
rename from modules/jdbc-test/src/test/resources/logback-test.xml
rename to modules/jdbc-test/src/main/resources/logback-test.xml
diff --git a/modules/jdbc-test/src/test/java/org/testcontainers/junit/CustomizableMSSQLServerTest.java b/modules/jdbc-test/src/test/java/org/testcontainers/junit/CustomizableMSSQLServerTest.java
deleted file mode 100644
index 2f6e43a771f..00000000000
--- a/modules/jdbc-test/src/test/java/org/testcontainers/junit/CustomizableMSSQLServerTest.java
+++ /dev/null
@@ -1,44 +0,0 @@
-package org.testcontainers.junit;
-
-import com.zaxxer.hikari.HikariConfig;
-import com.zaxxer.hikari.HikariDataSource;
-import org.junit.Rule;
-import org.junit.Test;
-import org.testcontainers.containers.MSSQLServerContainer;
-
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.sql.Statement;
-
-import static org.rnorth.visibleassertions.VisibleAssertions.assertEquals;
-import static org.rnorth.visibleassertions.VisibleAssertions.fail;
-
-public class CustomizableMSSQLServerTest {
-
- private static final String STRONG_PASSWORD = "myStrong(!)Password";
-
- @Rule
- public MSSQLServerContainer mssqlServerContainer = new MSSQLServerContainer()
- .withPassword(STRONG_PASSWORD);
-
- @Test
- public void testSqlServerConnection() throws SQLException {
- HikariConfig hikariConfig = new HikariConfig();
- hikariConfig.setJdbcUrl("jdbc:sqlserver://localhost:" +
- mssqlServerContainer.getMappedPort(MSSQLServerContainer.MS_SQL_SERVER_PORT));
- hikariConfig.setUsername("SA");
- hikariConfig.setPassword(STRONG_PASSWORD);
-
- HikariDataSource ds = new HikariDataSource(hikariConfig);
- Statement statement = ds.getConnection().createStatement();
- statement.execute(mssqlServerContainer.getTestQueryString());
- ResultSet resultSet = statement.getResultSet();
- if (resultSet.next()) {
- int resultSetInt = resultSet.getInt(1);
- assertEquals("A basic SELECT query succeeds", 1, resultSetInt);
- } else {
- fail("No results returned from query");
- }
-
- }
-}
diff --git a/modules/jdbc-test/src/test/java/org/testcontainers/junit/CustomizableMysqlTest.java b/modules/jdbc-test/src/test/java/org/testcontainers/junit/CustomizableMysqlTest.java
deleted file mode 100644
index 11ad8f111ee..00000000000
--- a/modules/jdbc-test/src/test/java/org/testcontainers/junit/CustomizableMysqlTest.java
+++ /dev/null
@@ -1,47 +0,0 @@
-package org.testcontainers.junit;
-
-import com.zaxxer.hikari.HikariConfig;
-import com.zaxxer.hikari.HikariDataSource;
-import org.junit.Rule;
-import org.junit.Test;
-import org.testcontainers.containers.MySQLContainer;
-
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.sql.Statement;
-
-import static org.rnorth.visibleassertions.VisibleAssertions.assertEquals;
-
-public class CustomizableMysqlTest {
- private static final String DB_NAME = "foo";
- private static final String USER = "bar";
- private static final String PWD = "baz";
-
- // Add MYSQL_ROOT_HOST environment so that we can root login from anywhere for testing purposes
- @Rule
- public MySQLContainer mysql = (MySQLContainer) new MySQLContainer("mysql:5.5")
- .withDatabaseName(DB_NAME)
- .withUsername(USER)
- .withPassword(PWD)
- .withEnv("MYSQL_ROOT_HOST", "%");
-
- @Test
- public void testSimple() throws SQLException {
- HikariConfig hikariConfig = new HikariConfig();
- hikariConfig.setJdbcUrl("jdbc:mysql://"
- + mysql.getContainerIpAddress()
- + ":" + mysql.getMappedPort(MySQLContainer.MYSQL_PORT)
- + "/" + DB_NAME);
- hikariConfig.setUsername(USER);
- hikariConfig.setPassword(PWD);
-
- HikariDataSource ds = new HikariDataSource(hikariConfig);
- Statement statement = ds.getConnection().createStatement();
- statement.execute("SELECT 1");
- ResultSet resultSet = statement.getResultSet();
-
- assertEquals("There is a result", resultSet.next(), true);
- int resultSetInt = resultSet.getInt(1);
- assertEquals("A basic SELECT query succeeds", 1, resultSetInt);
- }
-}
diff --git a/modules/jdbc-test/src/test/java/org/testcontainers/junit/CustomizablePostgreSQLTest.java b/modules/jdbc-test/src/test/java/org/testcontainers/junit/CustomizablePostgreSQLTest.java
deleted file mode 100644
index ef1c7b212db..00000000000
--- a/modules/jdbc-test/src/test/java/org/testcontainers/junit/CustomizablePostgreSQLTest.java
+++ /dev/null
@@ -1,48 +0,0 @@
-package org.testcontainers.junit;
-
-import com.zaxxer.hikari.HikariConfig;
-import com.zaxxer.hikari.HikariDataSource;
-import org.junit.Rule;
-import org.junit.Test;
-import org.testcontainers.containers.PostgreSQLContainer;
-
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.sql.Statement;
-
-import static org.rnorth.visibleassertions.VisibleAssertions.assertEquals;
-
-/**
- * @author richardnorth
- */
-public class CustomizablePostgreSQLTest {
- private static final String DB_NAME = "foo";
- private static final String USER = "bar";
- private static final String PWD = "baz";
-
- @Rule
- public PostgreSQLContainer postgres = new PostgreSQLContainer("postgres:9.6.8")
- .withDatabaseName(DB_NAME)
- .withUsername(USER)
- .withPassword(PWD);
-
- @Test
- public void testSimple() throws SQLException {
- HikariConfig hikariConfig = new HikariConfig();
- hikariConfig.setJdbcUrl("jdbc:postgresql://"
- + postgres.getContainerIpAddress()
- + ":" + postgres.getMappedPort(PostgreSQLContainer.POSTGRESQL_PORT)
- + "/" + DB_NAME);
- hikariConfig.setUsername(USER);
- hikariConfig.setPassword(PWD);
-
- HikariDataSource ds = new HikariDataSource(hikariConfig);
- Statement statement = ds.getConnection().createStatement();
- statement.execute("SELECT 1");
- ResultSet resultSet = statement.getResultSet();
-
- resultSet.next();
- int resultSetInt = resultSet.getInt(1);
- assertEquals("A basic SELECT query succeeds", 1, resultSetInt);
- }
-}
diff --git a/modules/jdbc-test/src/test/java/org/testcontainers/junit/EmptyPasswordMysqlTest.java b/modules/jdbc-test/src/test/java/org/testcontainers/junit/EmptyPasswordMysqlTest.java
deleted file mode 100644
index 0dfc3149ef5..00000000000
--- a/modules/jdbc-test/src/test/java/org/testcontainers/junit/EmptyPasswordMysqlTest.java
+++ /dev/null
@@ -1,46 +0,0 @@
-package org.testcontainers.junit;
-
-import com.zaxxer.hikari.HikariConfig;
-import com.zaxxer.hikari.HikariDataSource;
-import org.junit.Rule;
-import org.junit.Test;
-import org.testcontainers.containers.MySQLContainer;
-
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.sql.Statement;
-
-import static org.rnorth.visibleassertions.VisibleAssertions.assertEquals;
-
-public class EmptyPasswordMysqlTest {
- private static final String DB_NAME = "foo";
- private static final String USER = "root"; // MySQL allows empty password with root only
-
- // Add MYSQL_ROOT_HOST environment so that we can root login from anywhere for testing purposes
- @Rule
- public MySQLContainer mysql = (MySQLContainer) new MySQLContainer("mysql:5.5")
- .withDatabaseName(DB_NAME)
- .withUsername(USER)
- .withPassword("")
- .withEnv("MYSQL_ROOT_HOST", "%");
-
- @Test
- public void testSimple() throws SQLException {
- HikariConfig hikariConfig = new HikariConfig();
- hikariConfig.setJdbcUrl("jdbc:mysql://"
- + mysql.getContainerIpAddress()
- + ":" + mysql.getMappedPort(MySQLContainer.MYSQL_PORT)
- + "/" + DB_NAME);
- hikariConfig.setUsername(USER);
- hikariConfig.setPassword("");
-
- HikariDataSource ds = new HikariDataSource(hikariConfig);
- Statement statement = ds.getConnection().createStatement();
- statement.execute("SELECT 1");
- ResultSet resultSet = statement.getResultSet();
-
- assertEquals("There is a result", resultSet.next(), true);
- int resultSetInt = resultSet.getInt(1);
- assertEquals("A basic SELECT query succeeds", 1, resultSetInt);
- }
-}
diff --git a/modules/jdbc-test/src/test/java/org/testcontainers/junit/SimpleClickhouseTest.java b/modules/jdbc-test/src/test/java/org/testcontainers/junit/SimpleClickhouseTest.java
deleted file mode 100644
index b765208e212..00000000000
--- a/modules/jdbc-test/src/test/java/org/testcontainers/junit/SimpleClickhouseTest.java
+++ /dev/null
@@ -1,25 +0,0 @@
-package org.testcontainers.junit;
-
-import org.junit.Rule;
-import org.junit.Test;
-import org.testcontainers.containers.ClickHouseContainer;
-
-import java.sql.ResultSet;
-import java.sql.SQLException;
-
-import static org.rnorth.visibleassertions.VisibleAssertions.assertEquals;
-
-public class SimpleClickhouseTest extends AbstractContainerDatabaseTest {
-
- @Rule
- public ClickHouseContainer clickhouse = new ClickHouseContainer();
-
- @Test
- public void testSimple() throws SQLException {
- ResultSet resultSet = performQuery(clickhouse, "SELECT 1");
-
- resultSet.next();
- int resultSetInt = resultSet.getInt(1);
- assertEquals("A basic SELECT query succeeds", 1, resultSetInt);
- }
-}
diff --git a/modules/jdbc-test/src/test/java/org/testcontainers/junit/SimpleDb2Test.java b/modules/jdbc-test/src/test/java/org/testcontainers/junit/SimpleDb2Test.java
deleted file mode 100644
index 60ad9a23a27..00000000000
--- a/modules/jdbc-test/src/test/java/org/testcontainers/junit/SimpleDb2Test.java
+++ /dev/null
@@ -1,41 +0,0 @@
-package org.testcontainers.junit;
-
-import com.zaxxer.hikari.HikariConfig;
-import com.zaxxer.hikari.HikariDataSource;
-import org.junit.Ignore;
-import org.junit.Rule;
-import org.junit.Test;
-import org.testcontainers.containers.Db2Container;
-
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.sql.Statement;
-
-import static org.rnorth.visibleassertions.VisibleAssertions.assertEquals;
-
-
-@Ignore("Disabled since we had problems with CI disk space filling up from images in jdbc-test module")
-public class SimpleDb2Test {
-
- @Rule
- public Db2Container db2 = new Db2Container()
- .acceptLicense();
-
- @Test
- public void testSimple() throws SQLException {
- HikariConfig hikariConfig = new HikariConfig();
- hikariConfig.setJdbcUrl(db2.getJdbcUrl());
- hikariConfig.setUsername(db2.getUsername());
- hikariConfig.setPassword(db2.getPassword());
-
- HikariDataSource ds = new HikariDataSource(hikariConfig);
- Statement statement = ds.getConnection().createStatement();
- statement.execute("SELECT 1 FROM SYSIBM.SYSDUMMY1");
- ResultSet resultSet = statement.getResultSet();
-
- resultSet.next();
- int resultSetInt = resultSet.getInt(1);
- assertEquals("A basic SELECT query succeeds", 1, resultSetInt);
- }
-
-}
diff --git a/modules/jdbc-test/src/test/java/org/testcontainers/junit/SimpleMSSQLServerTest.java b/modules/jdbc-test/src/test/java/org/testcontainers/junit/SimpleMSSQLServerTest.java
deleted file mode 100644
index 2791efa0780..00000000000
--- a/modules/jdbc-test/src/test/java/org/testcontainers/junit/SimpleMSSQLServerTest.java
+++ /dev/null
@@ -1,47 +0,0 @@
-package org.testcontainers.junit;
-
-import org.junit.Rule;
-import org.junit.Test;
-import org.testcontainers.containers.MSSQLServerContainer;
-
-import javax.sql.DataSource;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.sql.Statement;
-
-import static org.rnorth.visibleassertions.VisibleAssertions.assertEquals;
-
-/**
- * @author Stefan Hufschmidt
- */
-public class SimpleMSSQLServerTest extends AbstractContainerDatabaseTest {
-
- @Rule
- public MSSQLServerContainer mssqlServer = new MSSQLServerContainer();
-
- @Test
- public void testSimple() throws SQLException {
- ResultSet resultSet = performQuery(mssqlServer, "SELECT 1");
-
- int resultSetInt = resultSet.getInt(1);
- assertEquals("A basic SELECT query succeeds", 1, resultSetInt);
- }
-
- @Test
- public void testSetupDatabase() throws SQLException {
- DataSource ds = getDataSource(mssqlServer);
- Statement statement = ds.getConnection().createStatement();
- statement.executeUpdate("CREATE DATABASE [test];");
- statement = ds.getConnection().createStatement();
- statement.executeUpdate("CREATE TABLE [test].[dbo].[Foo](ID INT PRIMARY KEY);");
- statement = ds.getConnection().createStatement();
- statement.executeUpdate("INSERT INTO [test].[dbo].[Foo] (ID) VALUES (3);");
- statement = ds.getConnection().createStatement();
- statement.execute("SELECT * FROM [test].[dbo].[Foo];");
- ResultSet resultSet = statement.getResultSet();
-
- resultSet.next();
- int resultSetInt = resultSet.getInt("ID");
- assertEquals("A basic SELECT query succeeds", 3, resultSetInt);
- }
-}
diff --git a/modules/jdbc-test/src/test/resources/container-license-acceptance.txt b/modules/jdbc-test/src/test/resources/container-license-acceptance.txt
deleted file mode 100644
index 4af979f0f18..00000000000
--- a/modules/jdbc-test/src/test/resources/container-license-acceptance.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-mcr.microsoft.com/mssql/server:2017-CU12
-ibmcom/db2:11.5.0.0a
diff --git a/modules/jdbc/build.gradle b/modules/jdbc/build.gradle
index 2278b14006d..aa21939c769 100644
--- a/modules/jdbc/build.gradle
+++ b/modules/jdbc/build.gradle
@@ -2,4 +2,11 @@ description = "Testcontainers :: JDBC"
dependencies {
compile project(':database-commons')
+ testCompile project(':test-support')
+
+ testCompile 'commons-dbutils:commons-dbutils:1.7'
+ testCompile 'org.vibur:vibur-dbcp:25.0'
+ testCompile 'org.apache.tomcat:tomcat-jdbc:9.0.33'
+ testCompile 'com.zaxxer:HikariCP-java6:2.3.13'
+ testCompile 'com.googlecode.junit-toolbox:junit-toolbox:2.4'
}
diff --git a/modules/junit-jupiter/src/test/java/org/testcontainers/junit/jupiter/inheritance/InheritedTests.java b/modules/junit-jupiter/src/test/java/org/testcontainers/junit/jupiter/inheritance/InheritedTests.java
index f050e428692..720c31cf794 100644
--- a/modules/junit-jupiter/src/test/java/org/testcontainers/junit/jupiter/inheritance/InheritedTests.java
+++ b/modules/junit-jupiter/src/test/java/org/testcontainers/junit/jupiter/inheritance/InheritedTests.java
@@ -2,7 +2,6 @@
import org.junit.jupiter.api.Test;
import org.testcontainers.junit.jupiter.Container;
-import org.testcontainers.junit.jupiter.Testcontainers;
import static org.junit.jupiter.api.Assertions.assertEquals;
diff --git a/modules/mariadb/build.gradle b/modules/mariadb/build.gradle
index fe8788cb06b..71f2417f2ad 100644
--- a/modules/mariadb/build.gradle
+++ b/modules/mariadb/build.gradle
@@ -9,11 +9,8 @@ dependencies {
compileOnly project(':r2dbc')
compileOnly 'org.mariadb:r2dbc-mariadb:0.8.1-alpha1'
+ testCompile project(':jdbc-test')
testCompile 'org.mariadb.jdbc:mariadb-java-client:2.6.0'
- testCompile 'com.zaxxer:HikariCP-java6:2.3.13'
- testCompile 'commons-dbutils:commons-dbutils:1.7'
- testCompile 'org.apache.tomcat:tomcat-jdbc:9.0.35'
- testCompile 'org.vibur:vibur-dbcp:25.0'
testCompile testFixtures(project(':r2dbc'))
testCompile 'org.mariadb:r2dbc-mariadb:0.8.1-alpha1'
diff --git a/modules/mariadb/src/test/java/org/testcontainers/jdbc/mariadb/MariaDBJDBCDriverTest.java b/modules/mariadb/src/test/java/org/testcontainers/jdbc/mariadb/MariaDBJDBCDriverTest.java
new file mode 100644
index 00000000000..ef1dfef2703
--- /dev/null
+++ b/modules/mariadb/src/test/java/org/testcontainers/jdbc/mariadb/MariaDBJDBCDriverTest.java
@@ -0,0 +1,29 @@
+package org.testcontainers.jdbc.mariadb;
+
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.testcontainers.jdbc.AbstractJDBCDriverTest;
+
+import java.util.EnumSet;
+
+import static java.util.Arrays.asList;
+
+@RunWith(Parameterized.class)
+public class MariaDBJDBCDriverTest extends AbstractJDBCDriverTest {
+
+ @Parameterized.Parameters(name = "{index} - {0}")
+ public static Iterable data() {
+ return asList(
+ new Object[][]{
+ {"jdbc:tc:mariadb://hostname/databasename", EnumSet.noneOf(Options.class)},
+ {"jdbc:tc:mariadb://hostname/databasename?user=someuser&TC_INITSCRIPT=somepath/init_mariadb.sql", EnumSet.of(Options.ScriptedSchema, Options.JDBCParams)},
+ {"jdbc:tc:mariadb:10.2.14://hostname/databasename", EnumSet.noneOf(Options.class)},
+ {"jdbc:tc:mariadb:10.2.14://hostname/databasename?TC_INITSCRIPT=somepath/init_unicode_mariadb.sql&useUnicode=yes&characterEncoding=utf8", EnumSet.of(Options.CharacterSet)},
+ {"jdbc:tc:mariadb:10.2.14://hostname/databasename?user=someuser&TC_INITSCRIPT=somepath/init_mariadb.sql", EnumSet.of(Options.ScriptedSchema, Options.JDBCParams)},
+ {"jdbc:tc:mariadb:10.2.14://hostname/databasename?user=someuser&TC_INITFUNCTION=org.testcontainers.jdbc.AbstractJDBCDriverTest::sampleInitFunction", EnumSet.of(Options.ScriptedSchema, Options.JDBCParams)},
+ {"jdbc:tc:mariadb:10.2.14://hostname/databasename?user=someuser&password=somepwd&TC_INITSCRIPT=somepath/init_mariadb.sql", EnumSet.of(Options.ScriptedSchema, Options.JDBCParams)},
+ {"jdbc:tc:mariadb:10.2.14://hostname/databasename?user=someuser&password=somepwd&TC_INITFUNCTION=org.testcontainers.jdbc.AbstractJDBCDriverTest::sampleInitFunction", EnumSet.of(Options.ScriptedSchema, Options.JDBCParams)},
+ {"jdbc:tc:mariadb:10.2.14://hostname/databasename?TC_MY_CNF=somepath/mariadb_conf_override", EnumSet.of(Options.CustomIniFile)},
+ });
+ }
+}
diff --git a/modules/jdbc-test/src/test/java/org/testcontainers/junit/SimpleMariaDBTest.java b/modules/mariadb/src/test/java/org/testcontainers/junit/mariadb/SimpleMariaDBTest.java
similarity index 70%
rename from modules/jdbc-test/src/test/java/org/testcontainers/junit/SimpleMariaDBTest.java
rename to modules/mariadb/src/test/java/org/testcontainers/junit/mariadb/SimpleMariaDBTest.java
index 21badefb9fb..646fbb40947 100644
--- a/modules/jdbc-test/src/test/java/org/testcontainers/junit/SimpleMariaDBTest.java
+++ b/modules/mariadb/src/test/java/org/testcontainers/junit/mariadb/SimpleMariaDBTest.java
@@ -1,8 +1,9 @@
-package org.testcontainers.junit;
+package org.testcontainers.junit.mariadb;
import org.apache.commons.lang.SystemUtils;
import org.junit.Test;
import org.testcontainers.containers.MariaDBContainer;
+import org.testcontainers.db.AbstractContainerDatabaseTest;
import java.sql.ResultSet;
import java.sql.SQLException;
@@ -12,72 +13,59 @@
import static org.rnorth.visibleassertions.VisibleAssertions.assertTrue;
-/**
- * @author Miguel Gonzalez Sanchez
- */
public class SimpleMariaDBTest extends AbstractContainerDatabaseTest {
@Test
public void testSimple() throws SQLException {
- MariaDBContainer mariadb = new MariaDBContainer();
- mariadb.start();
+ try (MariaDBContainer> mariadb = new MariaDBContainer<>()) {
+
+ mariadb.start();
- try {
ResultSet resultSet = performQuery(mariadb, "SELECT 1");
int resultSetInt = resultSet.getInt(1);
assertEquals("A basic SELECT query succeeds", 1, resultSetInt);
- } finally {
- mariadb.stop();
}
}
@Test
public void testSpecificVersion() throws SQLException {
- MariaDBContainer mariadbOldVersion = new MariaDBContainer("mariadb:5.5.51");
- mariadbOldVersion.start();
+ try (MariaDBContainer> mariadbOldVersion = new MariaDBContainer<>("mariadb:5.5.51")) {
+
+ mariadbOldVersion.start();
- try {
ResultSet resultSet = performQuery(mariadbOldVersion, "SELECT VERSION()");
String resultSetString = resultSet.getString(1);
assertTrue("The database version can be set using a container rule parameter", resultSetString.startsWith("5.5.51"));
- } finally {
- mariadbOldVersion.stop();
}
}
@Test
public void testMariaDBWithCustomIniFile() throws SQLException {
assumeFalse(SystemUtils.IS_OS_WINDOWS);
- MariaDBContainer mariadbCustomConfig = new MariaDBContainer("mariadb:10.1.16")
- .withConfigurationOverride("somepath/mariadb_conf_override");
- mariadbCustomConfig.start();
- try {
+ try (MariaDBContainer> mariadbCustomConfig = new MariaDBContainer<>("mariadb:10.1.16")
+ .withConfigurationOverride("somepath/mariadb_conf_override")) {
+ mariadbCustomConfig.start();
+
ResultSet resultSet = performQuery(mariadbCustomConfig, "SELECT @@GLOBAL.innodb_file_format");
String result = resultSet.getString(1);
assertEquals("The InnoDB file format has been set by the ini file content", "Barracuda", result);
- } finally {
- mariadbCustomConfig.stop();
}
}
@Test
public void testMariaDBWithCommandOverride() throws SQLException {
- MariaDBContainer mariadbCustomConfig = (MariaDBContainer) new MariaDBContainer("mariadb:10.1.16")
- .withCommand("mysqld --auto_increment_increment=10");
- mariadbCustomConfig.start();
-
- try {
+ try (MariaDBContainer> mariadbCustomConfig = new MariaDBContainer<>("mariadb:10.1.16")
+ .withCommand("mysqld --auto_increment_increment=10")) {
+ mariadbCustomConfig.start();
ResultSet resultSet = performQuery(mariadbCustomConfig, "show variables like 'auto_increment_increment'");
String result = resultSet.getString("Value");
assertEquals("Auto increment increment should be overriden by command line", "10", result);
- } finally {
- mariadbCustomConfig.stop();
}
}
}
diff --git a/modules/jdbc-test/src/test/resources/somepath/init_mariadb.sql b/modules/mariadb/src/test/resources/somepath/init_mariadb.sql
similarity index 100%
rename from modules/jdbc-test/src/test/resources/somepath/init_mariadb.sql
rename to modules/mariadb/src/test/resources/somepath/init_mariadb.sql
diff --git a/modules/jdbc-test/src/test/resources/somepath/init_unicode_mysql.sql b/modules/mariadb/src/test/resources/somepath/init_unicode_mariadb.sql
similarity index 100%
rename from modules/jdbc-test/src/test/resources/somepath/init_unicode_mysql.sql
rename to modules/mariadb/src/test/resources/somepath/init_unicode_mariadb.sql
diff --git a/modules/jdbc-test/src/test/resources/somepath/mariadb_conf_override/my.cnf b/modules/mariadb/src/test/resources/somepath/mariadb_conf_override/my.cnf
similarity index 100%
rename from modules/jdbc-test/src/test/resources/somepath/mariadb_conf_override/my.cnf
rename to modules/mariadb/src/test/resources/somepath/mariadb_conf_override/my.cnf
diff --git a/modules/mssqlserver/build.gradle b/modules/mssqlserver/build.gradle
index 055548d4182..c21bc43c869 100644
--- a/modules/mssqlserver/build.gradle
+++ b/modules/mssqlserver/build.gradle
@@ -9,6 +9,9 @@ dependencies {
compileOnly project(':r2dbc')
compileOnly 'io.r2dbc:r2dbc-mssql:0.8.2.RELEASE'
+ testCompile project(':jdbc-test')
+ testCompile 'com.microsoft.sqlserver:mssql-jdbc:8.2.2.jre8'
+
testCompile project(':r2dbc')
testCompile 'io.r2dbc:r2dbc-mssql:0.8.1.RELEASE'
diff --git a/modules/mssqlserver/src/test/java/org/testcontainers/jdbc/mssqlserver/MSSQLServerJDBCDriverTest.java b/modules/mssqlserver/src/test/java/org/testcontainers/jdbc/mssqlserver/MSSQLServerJDBCDriverTest.java
new file mode 100644
index 00000000000..00e22199b46
--- /dev/null
+++ b/modules/mssqlserver/src/test/java/org/testcontainers/jdbc/mssqlserver/MSSQLServerJDBCDriverTest.java
@@ -0,0 +1,21 @@
+package org.testcontainers.jdbc.mssqlserver;
+
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.testcontainers.jdbc.AbstractJDBCDriverTest;
+
+import java.util.EnumSet;
+
+import static java.util.Arrays.asList;
+
+@RunWith(Parameterized.class)
+public class MSSQLServerJDBCDriverTest extends AbstractJDBCDriverTest {
+
+ @Parameterized.Parameters(name = "{index} - {0}")
+ public static Iterable data() {
+ return asList(
+ new Object[][]{
+ {"jdbc:tc:sqlserver:2017-CU12://hostname:hostport;databaseName=databasename", EnumSet.noneOf(Options.class)},
+ });
+ }
+}
diff --git a/modules/jdbc-test/src/test/java/org/testcontainers/junit/CustomPasswordMSSQLServerTest.java b/modules/mssqlserver/src/test/java/org/testcontainers/junit/mssqlserver/CustomPasswordMSSQLServerTest.java
similarity index 95%
rename from modules/jdbc-test/src/test/java/org/testcontainers/junit/CustomPasswordMSSQLServerTest.java
rename to modules/mssqlserver/src/test/java/org/testcontainers/junit/mssqlserver/CustomPasswordMSSQLServerTest.java
index 2f77dad44fc..0e1ea05b31d 100644
--- a/modules/jdbc-test/src/test/java/org/testcontainers/junit/CustomPasswordMSSQLServerTest.java
+++ b/modules/mssqlserver/src/test/java/org/testcontainers/junit/mssqlserver/CustomPasswordMSSQLServerTest.java
@@ -1,4 +1,4 @@
-package org.testcontainers.junit;
+package org.testcontainers.junit.mssqlserver;
import org.apache.commons.lang.RandomStringUtils;
import org.junit.Test;
@@ -66,7 +66,7 @@ public static Collection data() {
@Test
public void runPasswordTests() {
try {
- new MSSQLServerContainer().withPassword(this.password);
+ new MSSQLServerContainer<>().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
new file mode 100644
index 00000000000..ecbc4e31714
--- /dev/null
+++ b/modules/mssqlserver/src/test/java/org/testcontainers/junit/mssqlserver/CustomizableMSSQLServerTest.java
@@ -0,0 +1,28 @@
+package org.testcontainers.junit.mssqlserver;
+
+import org.junit.Test;
+import org.testcontainers.containers.MSSQLServerContainer;
+import org.testcontainers.db.AbstractContainerDatabaseTest;
+
+import java.sql.ResultSet;
+import java.sql.SQLException;
+
+import static org.rnorth.visibleassertions.VisibleAssertions.assertEquals;
+
+public class CustomizableMSSQLServerTest extends AbstractContainerDatabaseTest {
+
+ private static final String STRONG_PASSWORD = "myStrong(!)Password";
+
+ @Test
+ public void testSqlServerConnection() throws SQLException {
+ try (MSSQLServerContainer> mssqlServerContainer = new MSSQLServerContainer<>()
+ .withPassword(STRONG_PASSWORD)) {
+
+ mssqlServerContainer.start();
+
+ ResultSet resultSet = performQuery(mssqlServerContainer, mssqlServerContainer.getTestQueryString());
+ int resultSetInt = resultSet.getInt(1);
+ assertEquals("A basic SELECT query succeeds", 1, resultSetInt);
+ }
+ }
+}
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
new file mode 100644
index 00000000000..c1699d2473a
--- /dev/null
+++ b/modules/mssqlserver/src/test/java/org/testcontainers/junit/mssqlserver/SimpleMSSQLServerTest.java
@@ -0,0 +1,47 @@
+package org.testcontainers.junit.mssqlserver;
+
+import org.junit.Test;
+import org.testcontainers.containers.MSSQLServerContainer;
+import org.testcontainers.db.AbstractContainerDatabaseTest;
+
+import javax.sql.DataSource;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+
+import static org.rnorth.visibleassertions.VisibleAssertions.assertEquals;
+
+public class SimpleMSSQLServerTest extends AbstractContainerDatabaseTest {
+
+ @Test
+ public void testSimple() throws SQLException {
+ try (MSSQLServerContainer> mssqlServer = new MSSQLServerContainer<>()) {
+ mssqlServer.start();
+ ResultSet resultSet = performQuery(mssqlServer, "SELECT 1");
+
+ int resultSetInt = resultSet.getInt(1);
+ assertEquals("A basic SELECT query succeeds", 1, resultSetInt);
+ }
+ }
+
+ @Test
+ public void testSetupDatabase() throws SQLException {
+ try (MSSQLServerContainer> mssqlServer = new MSSQLServerContainer<>()) {
+ mssqlServer.start();
+ DataSource ds = getDataSource(mssqlServer);
+ Statement statement = ds.getConnection().createStatement();
+ statement.executeUpdate("CREATE DATABASE [test];");
+ statement = ds.getConnection().createStatement();
+ statement.executeUpdate("CREATE TABLE [test].[dbo].[Foo](ID INT PRIMARY KEY);");
+ statement = ds.getConnection().createStatement();
+ statement.executeUpdate("INSERT INTO [test].[dbo].[Foo] (ID) VALUES (3);");
+ statement = ds.getConnection().createStatement();
+ statement.execute("SELECT * FROM [test].[dbo].[Foo];");
+ ResultSet resultSet = statement.getResultSet();
+
+ resultSet.next();
+ int resultSetInt = resultSet.getInt("ID");
+ assertEquals("A basic SELECT query succeeds", 3, resultSetInt);
+ }
+ }
+}
diff --git a/modules/mysql/build.gradle b/modules/mysql/build.gradle
index 04648e35f94..c9c165cc874 100644
--- a/modules/mysql/build.gradle
+++ b/modules/mysql/build.gradle
@@ -9,11 +9,8 @@ dependencies {
compileOnly project(':r2dbc')
compileOnly 'dev.miku:r2dbc-mysql:0.8.1.RELEASE'
+ testCompile project(':jdbc-test')
testCompile 'mysql:mysql-connector-java:8.0.20'
- testCompile 'com.zaxxer:HikariCP-java6:2.3.13'
- testCompile 'org.apache.tomcat:tomcat-jdbc:9.0.35'
- testCompile 'commons-dbutils:commons-dbutils:1.7'
- testCompile 'org.vibur:vibur-dbcp:25.0'
testCompile testFixtures(project(':r2dbc'))
testCompile 'dev.miku:r2dbc-mysql:0.8.1.RELEASE'
diff --git a/modules/mysql/sql/init_mysql.sql b/modules/mysql/sql/init_mysql.sql
new file mode 100644
index 00000000000..2b00ee968b0
--- /dev/null
+++ b/modules/mysql/sql/init_mysql.sql
@@ -0,0 +1,5 @@
+CREATE TABLE bar (
+ foo VARCHAR(255)
+);
+
+INSERT INTO bar (foo) VALUES ('hello world');
\ No newline at end of file
diff --git a/modules/jdbc-test/src/test/java/org/testcontainers/jdbc/JDBCDriverWithPoolTest.java b/modules/mysql/src/test/java/org/testcontainers/jdbc/mysql/JDBCDriverWithPoolTest.java
similarity index 78%
rename from modules/jdbc-test/src/test/java/org/testcontainers/jdbc/JDBCDriverWithPoolTest.java
rename to modules/mysql/src/test/java/org/testcontainers/jdbc/mysql/JDBCDriverWithPoolTest.java
index 53daa1316f5..1ad77264c62 100644
--- a/modules/jdbc-test/src/test/java/org/testcontainers/jdbc/JDBCDriverWithPoolTest.java
+++ b/modules/mysql/src/test/java/org/testcontainers/jdbc/mysql/JDBCDriverWithPoolTest.java
@@ -1,4 +1,4 @@
-package org.testcontainers.jdbc;
+package org.testcontainers.jdbc.mysql;
import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;
@@ -8,6 +8,7 @@
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
+import org.testcontainers.jdbc.ContainerDatabaseDriver;
import org.vibur.dbcp.ViburDBCPDataSource;
import javax.sql.DataSource;
@@ -22,23 +23,26 @@
import static org.rnorth.visibleassertions.VisibleAssertions.assertEquals;
/**
- *
+ * This test belongs in the jdbc module, as it is focused on testing the behaviour of {@link org.testcontainers.containers.JdbcDatabaseContainer}.
+ * However, the need to use the {@link org.testcontainers.containers.MySQLContainerProvider} (due to the jdbc:tc:mysql) URL forces it to live here in
+ * the mysql module, to avoid circular dependencies.
+ * TODO: Move to the jdbc module and either (a) implement a barebones {@link org.testcontainers.containers.JdbcDatabaseContainerProvider} for testing, or (b) refactor into a unit test.
*/
@RunWith(Parameterized.class)
public class JDBCDriverWithPoolTest {
- public static final String URL = "jdbc:tc:mysql:5://hostname/databasename?TC_INITFUNCTION=org.testcontainers.jdbc.JDBCDriverWithPoolTest::sampleInitFunction";
+ public static final String URL = "jdbc:tc:mysql:5://hostname/databasename?TC_INITFUNCTION=org.testcontainers.jdbc.mysql.JDBCDriverWithPoolTest::sampleInitFunction";
private final DataSource dataSource;
@Parameterized.Parameters
public static Iterable> dataSourceSuppliers() {
return asList(
- JDBCDriverWithPoolTest::getTomcatDataSourceWithDriverClassName,
- JDBCDriverWithPoolTest::getTomcatDataSource,
- JDBCDriverWithPoolTest::getHikariDataSourceWithDriverClassName,
- JDBCDriverWithPoolTest::getHikariDataSource,
- JDBCDriverWithPoolTest::getViburDataSourceWithDriverClassName,
- JDBCDriverWithPoolTest::getViburDataSource
+ JDBCDriverWithPoolTest::getTomcatDataSourceWithDriverClassName,
+ JDBCDriverWithPoolTest::getTomcatDataSource,
+ JDBCDriverWithPoolTest::getHikariDataSourceWithDriverClassName,
+ JDBCDriverWithPoolTest::getHikariDataSource,
+ JDBCDriverWithPoolTest::getViburDataSourceWithDriverClassName,
+ JDBCDriverWithPoolTest::getViburDataSource
);
}
@@ -56,7 +60,7 @@ public void testMySQLWithConnectionPoolUsingSameContainer() throws SQLException,
executorService.submit(() -> {
try {
new QueryRunner(dataSource).insert("INSERT INTO my_counter (n) VALUES (5)",
- (ResultSetHandler) rs -> true);
+ (ResultSetHandler) rs -> true);
} catch (SQLException e) {
e.printStackTrace();
}
@@ -130,6 +134,8 @@ private static DataSource getViburDataSourceWithDriverClassName() {
ViburDBCPDataSource ds = new ViburDBCPDataSource();
ds.setJdbcUrl(URL + ";TEST=VIBUR_WITH_CLASSNAME");
+ ds.setUsername("any"); // Recent versions of Vibur require a username, even though it will not be used
+ ds.setPassword("");
ds.setPoolInitialSize(3);
ds.setPoolMaxSize(10);
ds.setTestConnectionQuery("SELECT 1");
@@ -143,6 +149,8 @@ private static DataSource getViburDataSourceWithDriverClassName() {
private static DataSource getViburDataSource() {
ViburDBCPDataSource ds = new ViburDBCPDataSource();
ds.setJdbcUrl(URL + ";TEST=VIBUR");
+ ds.setUsername("any"); // Recent versions of Vibur require a username, even though it will not be used
+ ds.setPassword("");
ds.setPoolInitialSize(3);
ds.setPoolMaxSize(10);
ds.setTestConnectionQuery("SELECT 1");
@@ -155,11 +163,11 @@ private static DataSource getViburDataSource() {
@SuppressWarnings("SqlNoDataSourceInspection")
public static void sampleInitFunction(Connection connection) throws SQLException {
connection.createStatement().execute("CREATE TABLE bar (\n" +
- " foo VARCHAR(255)\n" +
- ");");
+ " foo VARCHAR(255)\n" +
+ ");");
connection.createStatement().execute("INSERT INTO bar (foo) VALUES ('hello world');");
connection.createStatement().execute("CREATE TABLE my_counter (\n" +
- " n INT\n" +
- ");");
+ " n INT\n" +
+ ");");
}
}
diff --git a/modules/mysql/src/test/java/org/testcontainers/jdbc/mysql/MySQLJDBCDriverTest.java b/modules/mysql/src/test/java/org/testcontainers/jdbc/mysql/MySQLJDBCDriverTest.java
new file mode 100644
index 00000000000..d4b37b291d5
--- /dev/null
+++ b/modules/mysql/src/test/java/org/testcontainers/jdbc/mysql/MySQLJDBCDriverTest.java
@@ -0,0 +1,30 @@
+package org.testcontainers.jdbc.mysql;
+
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.testcontainers.jdbc.AbstractJDBCDriverTest;
+
+import java.util.EnumSet;
+
+import static java.util.Arrays.asList;
+
+@RunWith(Parameterized.class)
+public class MySQLJDBCDriverTest extends AbstractJDBCDriverTest {
+
+ @Parameterized.Parameters(name = "{index} - {0}")
+ public static Iterable data() {
+ return asList(
+ new Object[][]{
+ {"jdbc:tc:mysql://hostname/databasename", EnumSet.noneOf(Options.class)},
+ {"jdbc:tc:mysql://hostname/databasename?user=someuser&TC_INITSCRIPT=somepath/init_mysql.sql", EnumSet.of(Options.ScriptedSchema, Options.JDBCParams)},
+ {"jdbc:tc:mysql:5.5.43://hostname/databasename?user=someuser&TC_INITFUNCTION=org.testcontainers.jdbc.AbstractJDBCDriverTest::sampleInitFunction", EnumSet.of(Options.ScriptedSchema, Options.JDBCParams)},
+ {"jdbc:tc:mysql:5.5.43://hostname/databasename?user=someuser&password=somepwd&TC_INITSCRIPT=somepath/init_mysql.sql", EnumSet.of(Options.ScriptedSchema, Options.JDBCParams)},
+ {"jdbc:tc:mysql:5.5.43://hostname/databasename?user=someuser&password=somepwd&TC_INITSCRIPT=file:sql/init_mysql.sql", EnumSet.of(Options.ScriptedSchema, Options.JDBCParams)},
+ {"jdbc:tc:mysql:5.5.43://hostname/databasename?user=someuser&password=somepwd&TC_INITFUNCTION=org.testcontainers.jdbc.AbstractJDBCDriverTest::sampleInitFunction", EnumSet.of(Options.ScriptedSchema, Options.JDBCParams)},
+ {"jdbc:tc:mysql:5.5.43://hostname/databasename?TC_INITSCRIPT=somepath/init_unicode_mysql.sql&useUnicode=yes&characterEncoding=utf8", EnumSet.of(Options.CharacterSet)},
+ {"jdbc:tc:mysql:5.5.43://hostname/databasename", EnumSet.noneOf(Options.class)},
+ {"jdbc:tc:mysql:5.5.43://hostname/databasename?useSSL=false", EnumSet.noneOf(Options.class)},
+ {"jdbc:tc:mysql:5.6://hostname/databasename?TC_MY_CNF=somepath/mysql_conf_override", EnumSet.of(Options.CustomIniFile)},
+ });
+ }
+}
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
new file mode 100644
index 00000000000..590d288e3fe
--- /dev/null
+++ b/modules/mysql/src/test/java/org/testcontainers/junit/mysql/CustomizableMysqlTest.java
@@ -0,0 +1,34 @@
+package org.testcontainers.junit.mysql;
+
+import org.junit.Test;
+import org.testcontainers.containers.MySQLContainer;
+import org.testcontainers.db.AbstractContainerDatabaseTest;
+
+import java.sql.ResultSet;
+import java.sql.SQLException;
+
+import static org.rnorth.visibleassertions.VisibleAssertions.assertEquals;
+
+public class CustomizableMysqlTest extends AbstractContainerDatabaseTest {
+ private static final String DB_NAME = "foo";
+ private static final String USER = "bar";
+ private static final String PWD = "baz";
+
+ @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")
+ .withDatabaseName(DB_NAME)
+ .withUsername(USER)
+ .withPassword(PWD)
+ .withEnv("MYSQL_ROOT_HOST", "%")) {
+
+ mysql.start();
+
+ ResultSet resultSet = performQuery(mysql, "SELECT 1");
+
+ int resultSetInt = resultSet.getInt(1);
+ assertEquals("A basic SELECT query succeeds", 1, resultSetInt);
+ }
+ }
+}
diff --git a/modules/jdbc-test/src/test/java/org/testcontainers/junit/MultiVersionMySQLTest.java b/modules/mysql/src/test/java/org/testcontainers/junit/mysql/MultiVersionMySQLTest.java
similarity index 76%
rename from modules/jdbc-test/src/test/java/org/testcontainers/junit/MultiVersionMySQLTest.java
rename to modules/mysql/src/test/java/org/testcontainers/junit/mysql/MultiVersionMySQLTest.java
index b685d6dad80..3c0c86ffafa 100644
--- a/modules/jdbc-test/src/test/java/org/testcontainers/junit/MultiVersionMySQLTest.java
+++ b/modules/mysql/src/test/java/org/testcontainers/junit/mysql/MultiVersionMySQLTest.java
@@ -1,9 +1,10 @@
-package org.testcontainers.junit;
+package org.testcontainers.junit.mysql;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.testcontainers.containers.MySQLContainer;
+import org.testcontainers.db.AbstractContainerDatabaseTest;
import java.sql.ResultSet;
import java.sql.SQLException;
@@ -26,9 +27,9 @@ public MultiVersionMySQLTest(String version) {
@Test
public void versionCheckTest() throws SQLException {
- try (final MySQLContainer container = new MySQLContainer<>("mysql:" + version)) {
- container.start();
- final ResultSet resultSet = performQuery(container, "SELECT VERSION()");
+ try (MySQLContainer> mysql = new MySQLContainer<>("mysql:" + version)) {
+ mysql.start();
+ final ResultSet resultSet = performQuery(mysql, "SELECT VERSION()");
final String resultSetString = resultSet.getString(1);
assertEquals("The database version can be set using a container rule parameter", version, resultSetString);
diff --git a/modules/jdbc-test/src/test/java/org/testcontainers/junit/SimpleMySQLTest.java b/modules/mysql/src/test/java/org/testcontainers/junit/mysql/SimpleMySQLTest.java
similarity index 58%
rename from modules/jdbc-test/src/test/java/org/testcontainers/junit/SimpleMySQLTest.java
rename to modules/mysql/src/test/java/org/testcontainers/junit/mysql/SimpleMySQLTest.java
index 9570659c4dc..ee6c3ab6993 100644
--- a/modules/jdbc-test/src/test/java/org/testcontainers/junit/SimpleMySQLTest.java
+++ b/modules/mysql/src/test/java/org/testcontainers/junit/mysql/SimpleMySQLTest.java
@@ -1,4 +1,4 @@
-package org.testcontainers.junit;
+package org.testcontainers.junit.mysql;
import org.apache.commons.lang.SystemUtils;
import org.junit.Test;
@@ -7,6 +7,7 @@
import org.testcontainers.containers.ContainerLaunchException;
import org.testcontainers.containers.MySQLContainer;
import org.testcontainers.containers.output.Slf4jLogConsumer;
+import org.testcontainers.db.AbstractContainerDatabaseTest;
import java.sql.ResultSet;
import java.sql.SQLException;
@@ -17,9 +18,6 @@
import static org.rnorth.visibleassertions.VisibleAssertions.assertTrue;
-/**
- * @author richardnorth
- */
public class SimpleMySQLTest extends AbstractContainerDatabaseTest {
private static final Logger logger = LoggerFactory.getLogger(SimpleMySQLTest.class);
@@ -31,86 +29,79 @@ public class SimpleMySQLTest extends AbstractContainerDatabaseTest {
*/
/*
@ClassRule
- public static MySQLContainer mysql = new MySQLContainer();
+ public static MySQLContainer> mysql = new MySQLContainer<>();
@ClassRule
- public static MySQLContainer mysqlOldVersion = new MySQLContainer("mysql:5.5");
+ public static MySQLContainer> mysqlOldVersion = new MySQLContainer<>("mysql:5.5");
@ClassRule
- public static MySQLContainer mysqlCustomConfig = new MySQLContainer("mysql:5.6")
+ public static MySQLContainer> mysqlCustomConfig = new MySQLContainer<>("mysql:5.6")
.withConfigurationOverride("somepath/mysql_conf_override");
*/
@Test
public void testSimple() throws SQLException {
- MySQLContainer mysql = (MySQLContainer) new MySQLContainer()
- .withConfigurationOverride("somepath/mysql_conf_override")
- .withLogConsumer(new Slf4jLogConsumer(logger));
- mysql.start();
+ try (MySQLContainer> mysql = new MySQLContainer<>()
+ .withConfigurationOverride("somepath/mysql_conf_override")
+ .withLogConsumer(new Slf4jLogConsumer(logger))) {
+
+ mysql.start();
- try {
ResultSet resultSet = performQuery(mysql, "SELECT 1");
int resultSetInt = resultSet.getInt(1);
assertEquals("A basic SELECT query succeeds", 1, resultSetInt);
- } finally {
- mysql.stop();
}
}
@Test
public void testSpecificVersion() throws SQLException {
- MySQLContainer mysqlOldVersion = (MySQLContainer) new MySQLContainer("mysql:5.5")
- .withConfigurationOverride("somepath/mysql_conf_override")
- .withLogConsumer(new Slf4jLogConsumer(logger));
- mysqlOldVersion.start();
+ try (MySQLContainer> mysqlOldVersion = new MySQLContainer<>("mysql:5.5")
+ .withConfigurationOverride("somepath/mysql_conf_override")
+ .withLogConsumer(new Slf4jLogConsumer(logger))) {
+
+ mysqlOldVersion.start();
- try {
ResultSet resultSet = performQuery(mysqlOldVersion, "SELECT VERSION()");
String resultSetString = resultSet.getString(1);
assertTrue("The database version can be set using a container rule parameter", resultSetString.startsWith("5.5"));
- } finally {
- mysqlOldVersion.stop();
}
}
@Test
public void testMySQLWithCustomIniFile() throws SQLException {
- assumeFalse(SystemUtils.IS_OS_WINDOWS);
- MySQLContainer mysqlCustomConfig = new MySQLContainer("mysql:5.6")
- .withConfigurationOverride("somepath/mysql_conf_override");
- mysqlCustomConfig.start();
+ assumeFalse(SystemUtils.IS_OS_WINDOWS);
+
+ try (MySQLContainer> mysqlCustomConfig = new MySQLContainer<>("mysql:5.6")
+ .withConfigurationOverride("somepath/mysql_conf_override")) {
+
+ mysqlCustomConfig.start();
- try {
ResultSet resultSet = performQuery(mysqlCustomConfig, "SELECT @@GLOBAL.innodb_file_format");
String result = resultSet.getString(1);
assertEquals("The InnoDB file format has been set by the ini file content", "Barracuda", result);
- } finally {
- mysqlCustomConfig.stop();
}
}
@Test
public void testCommandOverride() throws SQLException {
- MySQLContainer mysqlCustomConfig = (MySQLContainer) new MySQLContainer().withCommand("mysqld --auto_increment_increment=42");
- mysqlCustomConfig.start();
+ try (MySQLContainer> mysqlCustomConfig = new MySQLContainer<>()
+ .withCommand("mysqld --auto_increment_increment=42")) {
+
+ mysqlCustomConfig.start();
- try {
ResultSet resultSet = performQuery(mysqlCustomConfig, "show variables like 'auto_increment_increment'");
String result = resultSet.getString("Value");
assertEquals("Auto increment increment should be overriden by command line", "42", result);
- } finally {
- mysqlCustomConfig.stop();
}
-
}
@Test
public void testExplicitInitScript() throws SQLException {
- try (MySQLContainer container = (MySQLContainer) new MySQLContainer()
+ try (MySQLContainer> container = new MySQLContainer<>()
.withInitScript("somepath/init_mysql.sql")
.withLogConsumer(new Slf4jLogConsumer(logger))) {
container.start();
@@ -120,20 +111,35 @@ public void testExplicitInitScript() throws SQLException {
assertEquals("Value from init script should equal real value", "hello world", firstColumnValue);
}
- }
+ }
- @Test
+ @Test(expected = ContainerLaunchException.class)
public void testEmptyPasswordWithNonRootUser() {
-
- MySQLContainer container = (MySQLContainer) new MySQLContainer("mysql:5.5").withDatabaseName("TEST")
- .withUsername("test").withPassword("").withEnv("MYSQL_ROOT_HOST", "%");
-
- try {
+ try (MySQLContainer> container = new MySQLContainer<>("mysql:5.5")
+ .withDatabaseName("TEST")
+ .withUsername("test")
+ .withPassword("")
+ .withEnv("MYSQL_ROOT_HOST", "%")){
container.start();
fail("ContainerLaunchException expected to be thrown");
- } catch (ContainerLaunchException e) {
- } finally {
- container.stop();
+ }
+ }
+
+ @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")
+ .withDatabaseName("foo")
+ .withUsername("root")
+ .withPassword("")
+ .withEnv("MYSQL_ROOT_HOST", "%")) {
+
+ mysql.start();
+
+ ResultSet resultSet = performQuery(mysql, "SELECT 1");
+ int resultSetInt = resultSet.getInt(1);
+
+ assertEquals("A basic SELECT query succeeds", 1, resultSetInt);
}
}
}
diff --git a/modules/jdbc-test/src/test/resources/somepath/init_mysql.sql b/modules/mysql/src/test/resources/somepath/init_mysql.sql
similarity index 100%
rename from modules/jdbc-test/src/test/resources/somepath/init_mysql.sql
rename to modules/mysql/src/test/resources/somepath/init_mysql.sql
diff --git a/modules/mysql/src/test/resources/somepath/init_unicode_mysql.sql b/modules/mysql/src/test/resources/somepath/init_unicode_mysql.sql
new file mode 100644
index 00000000000..f88969b0f30
--- /dev/null
+++ b/modules/mysql/src/test/resources/somepath/init_unicode_mysql.sql
@@ -0,0 +1,5 @@
+CREATE TABLE bar (
+ foo varchar(255) character set utf8
+);
+
+INSERT INTO bar (foo) VALUES ('привет мир');
diff --git a/modules/jdbc-test/src/test/resources/somepath/mysql_conf_override/my.cnf b/modules/mysql/src/test/resources/somepath/mysql_conf_override/my.cnf
similarity index 100%
rename from modules/jdbc-test/src/test/resources/somepath/mysql_conf_override/my.cnf
rename to modules/mysql/src/test/resources/somepath/mysql_conf_override/my.cnf
diff --git a/modules/oracle-xe/build.gradle b/modules/oracle-xe/build.gradle
index 1ab61e997af..026521e9a0c 100644
--- a/modules/oracle-xe/build.gradle
+++ b/modules/oracle-xe/build.gradle
@@ -3,7 +3,6 @@ description = "Testcontainers :: JDBC :: Oracle XE"
dependencies {
compile project(':jdbc')
+ testCompile project(':jdbc-test')
testCompile 'com.oracle.ojdbc:ojdbc8:19.3.0.0'
- testCompile 'com.zaxxer:HikariCP-java6:2.3.8'
- testCompile 'commons-dbutils:commons-dbutils:1.7'
}
diff --git a/modules/oracle-xe/src/test/java/org/testcontainers/containers/OracleJDBCDriverTest.java b/modules/oracle-xe/src/test/java/org/testcontainers/containers/jdbc/OracleJDBCDriverTest.java
similarity index 97%
rename from modules/oracle-xe/src/test/java/org/testcontainers/containers/OracleJDBCDriverTest.java
rename to modules/oracle-xe/src/test/java/org/testcontainers/containers/jdbc/OracleJDBCDriverTest.java
index fcc09ab69a4..fbe5ce95a05 100644
--- a/modules/oracle-xe/src/test/java/org/testcontainers/containers/OracleJDBCDriverTest.java
+++ b/modules/oracle-xe/src/test/java/org/testcontainers/containers/jdbc/OracleJDBCDriverTest.java
@@ -1,4 +1,4 @@
-package org.testcontainers.containers;
+package org.testcontainers.containers.jdbc;
import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;
diff --git a/modules/jdbc-test/src/test/java/org/testcontainers/junit/SimpleOracleTest.java b/modules/oracle-xe/src/test/java/org/testcontainers/junit/oracle/SimpleOracleTest.java
similarity index 50%
rename from modules/jdbc-test/src/test/java/org/testcontainers/junit/SimpleOracleTest.java
rename to modules/oracle-xe/src/test/java/org/testcontainers/junit/oracle/SimpleOracleTest.java
index 0855fd4860e..2415fed11f4 100644
--- a/modules/jdbc-test/src/test/java/org/testcontainers/junit/SimpleOracleTest.java
+++ b/modules/oracle-xe/src/test/java/org/testcontainers/junit/oracle/SimpleOracleTest.java
@@ -1,31 +1,26 @@
-package org.testcontainers.junit;
+package org.testcontainers.junit.oracle;
import org.junit.Ignore;
-import org.junit.Rule;
import org.junit.Test;
import org.testcontainers.containers.OracleContainer;
+import org.testcontainers.db.AbstractContainerDatabaseTest;
import java.sql.ResultSet;
import java.sql.SQLException;
import static org.rnorth.visibleassertions.VisibleAssertions.assertEquals;
-/**
- * @author gusohal
- */
@Ignore
public class SimpleOracleTest extends AbstractContainerDatabaseTest {
- @Rule
- public OracleContainer oracle = new OracleContainer();
-
@Test
public void testSimple() throws SQLException {
- ResultSet resultSet = performQuery(oracle, "SELECT 1 FROM dual");
+ try (OracleContainer oracle = new OracleContainer()) {
+ ResultSet resultSet = performQuery(oracle, "SELECT 1 FROM dual");
- resultSet.next();
- int resultSetInt = resultSet.getInt(1);
+ int resultSetInt = resultSet.getInt(1);
- assertEquals("A basic SELECT query succeeds", 1, resultSetInt);
+ assertEquals("A basic SELECT query succeeds", 1, resultSetInt);
+ }
}
}
diff --git a/modules/postgresql/build.gradle b/modules/postgresql/build.gradle
index 8c07465d424..380a3f86a80 100644
--- a/modules/postgresql/build.gradle
+++ b/modules/postgresql/build.gradle
@@ -5,12 +5,13 @@ dependencies {
compileOnly 'com.google.auto.service:auto-service:1.0-rc6'
compile project(':jdbc')
+
compileOnly project(':r2dbc')
compileOnly 'io.r2dbc:r2dbc-postgresql:0.8.2.RELEASE'
+ testCompile project(':jdbc-test')
+ testCompile project(':test-support')
testCompile 'org.postgresql:postgresql:42.2.12'
- testCompile 'commons-dbutils:commons-dbutils:1.7'
- testCompile 'com.zaxxer:HikariCP-java6:2.3.13'
testCompile testFixtures(project(':r2dbc'))
testCompile 'io.r2dbc:r2dbc-postgresql:0.8.1.RELEASE'
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 ec6a8756cab..3b887cedbec 100644
--- a/modules/postgresql/src/test/java/org/testcontainers/containers/PostgreSQLConnectionURLTest.java
+++ b/modules/postgresql/src/test/java/org/testcontainers/containers/PostgreSQLConnectionURLTest.java
@@ -11,7 +11,7 @@ public class PostgreSQLConnectionURLTest {
@Test
public void shouldCorrectlyAppendQueryString() {
- PostgreSQLContainer postgres = new FixedJdbcUrlPostgreSQLContainer();
+ PostgreSQLContainer> postgres = new FixedJdbcUrlPostgreSQLContainer();
String connectionUrl = postgres.constructUrlForConnection("?stringtype=unspecified&stringtype=unspecified");
String queryString = connectionUrl.substring(connectionUrl.indexOf('?'));
@@ -22,7 +22,7 @@ public void shouldCorrectlyAppendQueryString() {
@Test
public void shouldCorrectlyAppendQueryStringWhenNoBaseParams() {
- PostgreSQLContainer postgres = new NoParamsUrlPostgreSQLContainer();
+ PostgreSQLContainer> postgres = new NoParamsUrlPostgreSQLContainer();
String connectionUrl = postgres.constructUrlForConnection("?stringtype=unspecified&stringtype=unspecified");
String queryString = connectionUrl.substring(connectionUrl.indexOf('?'));
@@ -33,7 +33,7 @@ public void shouldCorrectlyAppendQueryStringWhenNoBaseParams() {
@Test
public void shouldReturnOriginalURLWhenEmptyQueryString() {
- PostgreSQLContainer postgres = new FixedJdbcUrlPostgreSQLContainer();
+ PostgreSQLContainer> postgres = new FixedJdbcUrlPostgreSQLContainer();
String connectionUrl = postgres.constructUrlForConnection("");
assertTrue("Query String remains unchanged", postgres.getJdbcUrl().equals(connectionUrl));
@@ -45,7 +45,7 @@ public void shouldRejectInvalidQueryString() {
() -> new NoParamsUrlPostgreSQLContainer().constructUrlForConnection("stringtype=unspecified"));
}
- static class FixedJdbcUrlPostgreSQLContainer extends PostgreSQLContainer {
+ static class FixedJdbcUrlPostgreSQLContainer extends PostgreSQLContainer {
@Override
public String getContainerIpAddress() {
@@ -58,7 +58,7 @@ public Integer getMappedPort(int originalPort) {
}
}
- static class NoParamsUrlPostgreSQLContainer extends PostgreSQLContainer {
+ static class NoParamsUrlPostgreSQLContainer extends PostgreSQLContainer {
@Override
public String getJdbcUrl() {
diff --git a/modules/jdbc-test/src/test/java/org/testcontainers/jdbc/DatabaseDriverShutdownTest.java b/modules/postgresql/src/test/java/org/testcontainers/jdbc/DatabaseDriverShutdownTest.java
similarity index 76%
rename from modules/jdbc-test/src/test/java/org/testcontainers/jdbc/DatabaseDriverShutdownTest.java
rename to modules/postgresql/src/test/java/org/testcontainers/jdbc/DatabaseDriverShutdownTest.java
index 855658ada56..9e3e0b03413 100644
--- a/modules/jdbc-test/src/test/java/org/testcontainers/jdbc/DatabaseDriverShutdownTest.java
+++ b/modules/postgresql/src/test/java/org/testcontainers/jdbc/DatabaseDriverShutdownTest.java
@@ -13,7 +13,10 @@
import static org.rnorth.visibleassertions.VisibleAssertions.assertTrue;
/**
- * Created by inikolaev on 08/06/2017.
+ * This test belongs in the jdbc module, as it is focused on testing the behaviour of {@link org.testcontainers.containers.JdbcDatabaseContainer}.
+ * However, the need to use the {@link org.testcontainers.containers.PostgreSQLContainerProvider} (due to the jdbc:tc:postgresql) URL forces it to live here in
+ * the mysql module, to avoid circular dependencies.
+ * TODO: Move to the jdbc module and either (a) implement a barebones {@link org.testcontainers.containers.JdbcDatabaseContainerProvider} for testing, or (b) refactor into a unit test.
*/
public class DatabaseDriverShutdownTest {
@AfterClass
diff --git a/modules/jdbc-test/src/test/java/org/testcontainers/jdbc/DatabaseDriverTmpfsTest.java b/modules/postgresql/src/test/java/org/testcontainers/jdbc/DatabaseDriverTmpfsTest.java
similarity index 71%
rename from modules/jdbc-test/src/test/java/org/testcontainers/jdbc/DatabaseDriverTmpfsTest.java
rename to modules/postgresql/src/test/java/org/testcontainers/jdbc/DatabaseDriverTmpfsTest.java
index 6f337a586b6..a2b1fd5da8b 100644
--- a/modules/jdbc-test/src/test/java/org/testcontainers/jdbc/DatabaseDriverTmpfsTest.java
+++ b/modules/postgresql/src/test/java/org/testcontainers/jdbc/DatabaseDriverTmpfsTest.java
@@ -10,6 +10,12 @@
import static org.rnorth.visibleassertions.VisibleAssertions.assertEquals;
import static org.rnorth.visibleassertions.VisibleAssertions.assertNotEquals;
+/**
+ * This test belongs in the jdbc module, as it is focused on testing the behaviour of {@link org.testcontainers.containers.JdbcDatabaseContainer}.
+ * However, the need to use the {@link org.testcontainers.containers.PostgreSQLContainerProvider} (due to the jdbc:tc:postgresql) URL forces it to live here in
+ * the mysql module, to avoid circular dependencies.
+ * TODO: Move to the jdbc module and either (a) implement a barebones {@link org.testcontainers.containers.JdbcDatabaseContainerProvider} for testing, or (b) refactor into a unit test.
+ */
public class DatabaseDriverTmpfsTest {
@Test
diff --git a/modules/postgresql/src/test/java/org/testcontainers/jdbc/postgis/PostgisJDBCDriverTest.java b/modules/postgresql/src/test/java/org/testcontainers/jdbc/postgis/PostgisJDBCDriverTest.java
new file mode 100644
index 00000000000..551ba86e185
--- /dev/null
+++ b/modules/postgresql/src/test/java/org/testcontainers/jdbc/postgis/PostgisJDBCDriverTest.java
@@ -0,0 +1,22 @@
+package org.testcontainers.jdbc.postgis;
+
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.testcontainers.jdbc.AbstractJDBCDriverTest;
+
+import java.util.EnumSet;
+
+import static java.util.Arrays.asList;
+
+@RunWith(Parameterized.class)
+public class PostgisJDBCDriverTest extends AbstractJDBCDriverTest {
+
+ @Parameterized.Parameters(name = "{index} - {0}")
+ public static Iterable data() {
+ return asList(
+ new Object[][]{
+ {"jdbc:tc:postgis://hostname/databasename?user=someuser&password=somepwd", EnumSet.of(Options.JDBCParams)},
+ {"jdbc:tc:postgis:9.6://hostname/databasename?user=someuser&password=somepwd", EnumSet.of(Options.JDBCParams)},
+ });
+ }
+}
diff --git a/modules/postgresql/src/test/java/org/testcontainers/jdbc/postgresql/PostgreSQLJDBCDriverTest.java b/modules/postgresql/src/test/java/org/testcontainers/jdbc/postgresql/PostgreSQLJDBCDriverTest.java
new file mode 100644
index 00000000000..c63eb9ffb9d
--- /dev/null
+++ b/modules/postgresql/src/test/java/org/testcontainers/jdbc/postgresql/PostgreSQLJDBCDriverTest.java
@@ -0,0 +1,21 @@
+package org.testcontainers.jdbc.postgresql;
+
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.testcontainers.jdbc.AbstractJDBCDriverTest;
+
+import java.util.EnumSet;
+
+import static java.util.Arrays.asList;
+
+@RunWith(Parameterized.class)
+public class PostgreSQLJDBCDriverTest extends AbstractJDBCDriverTest {
+
+ @Parameterized.Parameters(name = "{index} - {0}")
+ public static Iterable data() {
+ return asList(
+ new Object[][]{
+ {"jdbc:tc:postgresql:9.6.8://hostname/databasename?user=someuser&password=somepwd", EnumSet.of(Options.JDBCParams)},
+ });
+ }
+}
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
new file mode 100644
index 00000000000..8446440059e
--- /dev/null
+++ b/modules/postgresql/src/test/java/org/testcontainers/junit/postgresql/CustomizablePostgreSQLTest.java
@@ -0,0 +1,35 @@
+package org.testcontainers.junit.postgresql;
+
+import org.junit.Test;
+import org.testcontainers.containers.PostgreSQLContainer;
+import org.testcontainers.db.AbstractContainerDatabaseTest;
+
+import java.sql.ResultSet;
+import java.sql.SQLException;
+
+import static org.rnorth.visibleassertions.VisibleAssertions.assertEquals;
+
+/**
+ * @author richardnorth
+ */
+public class CustomizablePostgreSQLTest extends AbstractContainerDatabaseTest {
+ private static final String DB_NAME = "foo";
+ private static final String USER = "bar";
+ private static final String PWD = "baz";
+
+ @Test
+ public void testSimple() throws SQLException {
+ try (PostgreSQLContainer> postgres = new PostgreSQLContainer<>("postgres:9.6.8")
+ .withDatabaseName(DB_NAME)
+ .withUsername(USER)
+ .withPassword(PWD)) {
+
+ postgres.start();
+
+ ResultSet resultSet = performQuery(postgres, "SELECT 1");
+
+ int resultSetInt = resultSet.getInt(1);
+ assertEquals("A basic SELECT query succeeds", 1, resultSetInt);
+ }
+ }
+}
diff --git a/modules/jdbc-test/src/test/java/org/testcontainers/junit/SimplePostgreSQLTest.java b/modules/postgresql/src/test/java/org/testcontainers/junit/postgresql/SimplePostgreSQLTest.java
similarity index 78%
rename from modules/jdbc-test/src/test/java/org/testcontainers/junit/SimplePostgreSQLTest.java
rename to modules/postgresql/src/test/java/org/testcontainers/junit/postgresql/SimplePostgreSQLTest.java
index 7189e05fb16..9c97f51e64e 100644
--- a/modules/jdbc-test/src/test/java/org/testcontainers/junit/SimplePostgreSQLTest.java
+++ b/modules/postgresql/src/test/java/org/testcontainers/junit/postgresql/SimplePostgreSQLTest.java
@@ -1,7 +1,8 @@
-package org.testcontainers.junit;
+package org.testcontainers.junit.postgresql;
import org.junit.Test;
import org.testcontainers.containers.PostgreSQLContainer;
+import org.testcontainers.db.AbstractContainerDatabaseTest;
import java.sql.ResultSet;
import java.sql.SQLException;
@@ -20,7 +21,7 @@ public class SimplePostgreSQLTest extends AbstractContainerDatabaseTest {
@Test
public void testSimple() throws SQLException {
- try (PostgreSQLContainer postgres = new PostgreSQLContainer<>()) {
+ try (PostgreSQLContainer> postgres = new PostgreSQLContainer<>()) {
postgres.start();
ResultSet resultSet = performQuery(postgres, "SELECT 1");
@@ -31,7 +32,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<>().withCommand("postgres -c max_connections=42")) {
postgres.start();
ResultSet resultSet = performQuery(postgres, "SELECT current_setting('max_connections')");
@@ -42,7 +43,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<>().withCommand("postgres -c max_connections=42").withCommand()) {
postgres.start();
ResultSet resultSet = performQuery(postgres, "SELECT current_setting('max_connections')");
@@ -53,7 +54,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<>().withInitScript("somepath/init_postgresql.sql")) {
postgres.start();
ResultSet resultSet = performQuery(postgres, "SELECT foo FROM bar");
diff --git a/modules/postgresql/src/test/resources/somepath/init_postgresql.sql b/modules/postgresql/src/test/resources/somepath/init_postgresql.sql
new file mode 100644
index 00000000000..2b00ee968b0
--- /dev/null
+++ b/modules/postgresql/src/test/resources/somepath/init_postgresql.sql
@@ -0,0 +1,5 @@
+CREATE TABLE bar (
+ foo VARCHAR(255)
+);
+
+INSERT INTO bar (foo) VALUES ('hello world');
\ No newline at end of file
diff --git a/modules/presto/build.gradle b/modules/presto/build.gradle
index 07aad11168e..51c5bf4345e 100644
--- a/modules/presto/build.gradle
+++ b/modules/presto/build.gradle
@@ -3,6 +3,6 @@ description = "Testcontainers :: JDBC :: Presto"
dependencies {
compile project(':jdbc')
- testCompile 'io.prestosql:presto-jdbc:329'
- testCompile 'commons-dbutils:commons-dbutils:1.7'
+ testCompile project(':jdbc-test')
+ testCompile 'io.prestosql:presto-jdbc:331'
}
diff --git a/modules/presto/src/test/java/org/testcontainers/jdbc/presto/PrestoJDBCDriverTest.java b/modules/presto/src/test/java/org/testcontainers/jdbc/presto/PrestoJDBCDriverTest.java
new file mode 100644
index 00000000000..88939c62939
--- /dev/null
+++ b/modules/presto/src/test/java/org/testcontainers/jdbc/presto/PrestoJDBCDriverTest.java
@@ -0,0 +1,21 @@
+package org.testcontainers.jdbc.presto;
+
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.testcontainers.jdbc.AbstractJDBCDriverTest;
+
+import java.util.EnumSet;
+
+import static java.util.Arrays.asList;
+
+@RunWith(Parameterized.class)
+public class PrestoJDBCDriverTest extends AbstractJDBCDriverTest {
+
+ @Parameterized.Parameters(name = "{index} - {0}")
+ public static Iterable data() {
+ return asList(
+ new Object[][]{
+ {"jdbc:tc:presto:329://hostname/", EnumSet.of(Options.PmdKnownBroken)},
+ });
+ }
+}
diff --git a/test-support/build.gradle b/test-support/build.gradle
index 7cc1bb6d1d4..4c6fdd2bed1 100644
--- a/test-support/build.gradle
+++ b/test-support/build.gradle
@@ -1,4 +1,4 @@
dependencies {
implementation 'junit:junit:4.12'
- implementation 'org.slf4j:slf4j-api:1.7.26'
+ implementation 'org.slf4j:slf4j-api:1.7.30'
}
From fbda093796fec3eb6aed369b3699e426faf19ad7 Mon Sep 17 00:00:00 2001
From: "dependabot-preview[bot]"
<27856297+dependabot-preview[bot]@users.noreply.github.com>
Date: Thu, 14 May 2020 11:49:11 +0100
Subject: [PATCH 0096/4341] Bump r2dbc-mariadb from 0.8.1-alpha1 to
0.8.2-alpha2 in /modules/mariadb (#2702)
---
modules/mariadb/build.gradle | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/modules/mariadb/build.gradle b/modules/mariadb/build.gradle
index 71f2417f2ad..38862c7f03c 100644
--- a/modules/mariadb/build.gradle
+++ b/modules/mariadb/build.gradle
@@ -7,7 +7,7 @@ dependencies {
compile project(':jdbc')
compileOnly project(':r2dbc')
- compileOnly 'org.mariadb:r2dbc-mariadb:0.8.1-alpha1'
+ compileOnly 'org.mariadb:r2dbc-mariadb:0.8.2-alpha2'
testCompile project(':jdbc-test')
testCompile 'org.mariadb.jdbc:mariadb-java-client:2.6.0'
From d1bf6b836d0e3e78845b9650076a8a3388a540f3 Mon Sep 17 00:00:00 2001
From: "dependabot-preview[bot]"
<27856297+dependabot-preview[bot]@users.noreply.github.com>
Date: Thu, 14 May 2020 11:54:40 +0100
Subject: [PATCH 0097/4341] Bump aws-java-sdk-logs from 1.11.777 to 1.11.782 in
/modules/localstack (#2730)
---
modules/localstack/build.gradle | 7 +++----
1 file changed, 3 insertions(+), 4 deletions(-)
diff --git a/modules/localstack/build.gradle b/modules/localstack/build.gradle
index 44b732d4c60..3f88f41c176 100644
--- a/modules/localstack/build.gradle
+++ b/modules/localstack/build.gradle
@@ -3,10 +3,9 @@ description = "Testcontainers :: Localstack"
dependencies {
compile project(':testcontainers')
- compileOnly 'com.amazonaws:aws-java-sdk-s3:1.11.778'
- testCompile 'com.amazonaws:aws-java-sdk-s3:1.11.775'
+ compileOnly 'com.amazonaws:aws-java-sdk-s3:1.11.782'
+ testCompile 'com.amazonaws:aws-java-sdk-s3:1.11.782'
testCompile 'com.amazonaws:aws-java-sdk-sqs:1.11.782'
- testCompile 'com.amazonaws:aws-java-sdk-logs:1.11.777'
- testCompile 'com.amazonaws:aws-java-sdk-logs:1.11.775'
+ testCompile 'com.amazonaws:aws-java-sdk-logs:1.11.782'
testCompile 'software.amazon.awssdk:s3:2.13.16'
}
From 1ed8d81d5eaf8293b1fe6659060e790cbe88e6ce Mon Sep 17 00:00:00 2001
From: "dependabot-preview[bot]"
<27856297+dependabot-preview[bot]@users.noreply.github.com>
Date: Thu, 14 May 2020 11:56:40 +0100
Subject: [PATCH 0098/4341] Bump mssql-jdbc from 6.1.0.jre8 to
8.3.0.jre8-preview in /modules/mssqlserver (#2733)
---
modules/mssqlserver/build.gradle | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/modules/mssqlserver/build.gradle b/modules/mssqlserver/build.gradle
index c21bc43c869..5d72209b27e 100644
--- a/modules/mssqlserver/build.gradle
+++ b/modules/mssqlserver/build.gradle
@@ -17,5 +17,5 @@ dependencies {
// MSSQL's wait strategy requires the JDBC driver
testCompile testFixtures(project(':r2dbc'))
- testCompile 'com.microsoft.sqlserver:mssql-jdbc:6.1.0.jre8'
+ testCompile 'com.microsoft.sqlserver:mssql-jdbc:8.3.0.jre8-preview'
}
From f84bcd6136a33a336ecf6139b2f85b8bf19512d5 Mon Sep 17 00:00:00 2001
From: Simon Schneider <10846939+raynigon@users.noreply.github.com>
Date: Thu, 14 May 2020 14:25:00 +0200
Subject: [PATCH 0099/4341] Add Apache Solr Module (#2123)
---
docs/modules/solr.md | 34 +++++
examples/settings.gradle | 3 +-
examples/solr-container/build.gradle | 18 +++
.../main/java/com/example/SearchEngine.java | 6 +
.../main/java/com/example/SearchResult.java | 20 +++
.../java/com/example/SolrSearchEngine.java | 39 +++++
.../test/java/com/example/SolrQueryTest.java | 88 ++++++++++++
mkdocs.yml | 1 +
modules/solr/build.gradle | 7 +
.../containers/SolrClientUtils.java | 133 +++++++++++++++++
.../containers/SolrClientUtilsException.java | 7 +
.../containers/SolrContainer.java | 135 ++++++++++++++++++
.../SolrContainerConfiguration.java | 18 +++
.../containers/SolrContainerTest.java | 76 ++++++++++
14 files changed, 584 insertions(+), 1 deletion(-)
create mode 100644 docs/modules/solr.md
create mode 100644 examples/solr-container/build.gradle
create mode 100644 examples/solr-container/src/main/java/com/example/SearchEngine.java
create mode 100644 examples/solr-container/src/main/java/com/example/SearchResult.java
create mode 100644 examples/solr-container/src/main/java/com/example/SolrSearchEngine.java
create mode 100644 examples/solr-container/src/test/java/com/example/SolrQueryTest.java
create mode 100644 modules/solr/build.gradle
create mode 100644 modules/solr/src/main/java/org/testcontainers/containers/SolrClientUtils.java
create mode 100644 modules/solr/src/main/java/org/testcontainers/containers/SolrClientUtilsException.java
create mode 100644 modules/solr/src/main/java/org/testcontainers/containers/SolrContainer.java
create mode 100644 modules/solr/src/main/java/org/testcontainers/containers/SolrContainerConfiguration.java
create mode 100644 modules/solr/src/test/java/org/testcontainers/containers/SolrContainerTest.java
diff --git a/docs/modules/solr.md b/docs/modules/solr.md
new file mode 100644
index 00000000000..4776ffa608b
--- /dev/null
+++ b/docs/modules/solr.md
@@ -0,0 +1,34 @@
+# Solr Container
+
+!!! note
+ This module is INCUBATING. While it is ready for use and operational in the current version of Testcontainers, it is possible that it may receive breaking changes in the future. See [our contributing guidelines](/contributing/#incubating-modules) for more information on our incubating modules policy.
+
+
+This module helps running [solr](https://lucene.apache.org/solr/) using Testcontainers.
+
+Note that it's based on the [official Docker image](https://hub.docker.com/_/solr/).
+
+## Usage example
+
+You can start a solr container instance from any Java application by using:
+
+
+[Using a Solr container](../../modules/solr/src/test/java/org/testcontainers/containers/SolrContainerTest.java) inside_block:solrContainerUsage
+
+
+## Adding this module to your project dependencies
+
+Add the following dependency to your `pom.xml`/`build.gradle` file:
+
+```groovy tab='Gradle'
+testCompile "org.testcontainers:solr:{{latest_version}}"
+```
+
+```xml tab='Maven'
+
+ org.testcontainers
+ solr
+ {{latest_version}}
+ test
+
+```
diff --git a/examples/settings.gradle b/examples/settings.gradle
index 9efbf097344..ef47a61f807 100644
--- a/examples/settings.gradle
+++ b/examples/settings.gradle
@@ -10,7 +10,8 @@ include 'redis-backed-cache'
include 'redis-backed-cache-testng'
include 'selenium-container'
include 'singleton-container'
+include 'solr-container'
include 'spring-boot'
include 'cucumber'
include 'spring-boot-kotlin-redis'
-include 'spock'
\ No newline at end of file
+include 'spock'
diff --git a/examples/solr-container/build.gradle b/examples/solr-container/build.gradle
new file mode 100644
index 00000000000..62ed7d1153a
--- /dev/null
+++ b/examples/solr-container/build.gradle
@@ -0,0 +1,18 @@
+plugins {
+ id 'java'
+}
+
+repositories {
+ jcenter()
+}
+
+dependencies {
+ compileOnly "org.projectlombok:lombok:1.18.10"
+ annotationProcessor "org.projectlombok:lombok:1.18.10"
+
+ implementation 'org.apache.solr:solr-solrj:8.3.0'
+
+ testImplementation 'org.testcontainers:testcontainers'
+ testImplementation 'org.testcontainers:solr'
+
+}
diff --git a/examples/solr-container/src/main/java/com/example/SearchEngine.java b/examples/solr-container/src/main/java/com/example/SearchEngine.java
new file mode 100644
index 00000000000..c05bc23aad2
--- /dev/null
+++ b/examples/solr-container/src/main/java/com/example/SearchEngine.java
@@ -0,0 +1,6 @@
+package com.example;
+
+public interface SearchEngine {
+
+ public SearchResult search(String term);
+}
diff --git a/examples/solr-container/src/main/java/com/example/SearchResult.java b/examples/solr-container/src/main/java/com/example/SearchResult.java
new file mode 100644
index 00000000000..06544f0ba34
--- /dev/null
+++ b/examples/solr-container/src/main/java/com/example/SearchResult.java
@@ -0,0 +1,20 @@
+package com.example;
+
+import java.util.List;
+import java.util.Map;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class SearchResult {
+
+ private long totalHits;
+
+ private List> results;
+}
diff --git a/examples/solr-container/src/main/java/com/example/SolrSearchEngine.java b/examples/solr-container/src/main/java/com/example/SolrSearchEngine.java
new file mode 100644
index 00000000000..8a7f38e455d
--- /dev/null
+++ b/examples/solr-container/src/main/java/com/example/SolrSearchEngine.java
@@ -0,0 +1,39 @@
+package com.example;
+
+import java.util.stream.Collectors;
+
+import lombok.RequiredArgsConstructor;
+import lombok.SneakyThrows;
+
+import org.apache.solr.client.solrj.SolrClient;
+import org.apache.solr.client.solrj.SolrQuery;
+import org.apache.solr.client.solrj.response.QueryResponse;
+import org.apache.solr.client.solrj.util.ClientUtils;
+import org.apache.solr.common.SolrDocument;
+
+@RequiredArgsConstructor
+public class SolrSearchEngine implements SearchEngine {
+
+ public static final String COLLECTION_NAME = "products";
+
+ private final SolrClient client;
+
+ @SneakyThrows
+ public SearchResult search(String term) {
+
+ SolrQuery query = new SolrQuery();
+ query.setQuery("title:" + ClientUtils.escapeQueryChars(term));
+ QueryResponse response = client.query(COLLECTION_NAME, query);
+ return createResult(response);
+ }
+
+ private SearchResult createResult(QueryResponse response) {
+ return SearchResult.builder()
+ .totalHits(response.getResults().getNumFound())
+ .results(response.getResults()
+ .stream()
+ .map(SolrDocument::getFieldValueMap)
+ .collect(Collectors.toList()))
+ .build();
+ }
+}
diff --git a/examples/solr-container/src/test/java/com/example/SolrQueryTest.java b/examples/solr-container/src/test/java/com/example/SolrQueryTest.java
new file mode 100644
index 00000000000..413d7937853
--- /dev/null
+++ b/examples/solr-container/src/test/java/com/example/SolrQueryTest.java
@@ -0,0 +1,88 @@
+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;
+import org.apache.solr.common.SolrInputDocument;
+import org.apache.solr.common.SolrInputField;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.testcontainers.containers.SolrContainer;
+
+public class SolrQueryTest {
+
+ public static final SolrContainer solrContainer = new SolrContainer()
+ .withCollection(COLLECTION_NAME);
+
+ private static SolrClient solrClient;
+
+ @BeforeClass
+ public static void setUp() throws IOException, SolrServerException {
+ solrContainer.start();
+ solrClient = new Http2SolrClient.Builder("http://" + solrContainer.getContainerIpAddress() + ":" + solrContainer.getSolrPort() + "/solr").build();
+
+ // Add Sample Data
+ solrClient.add(COLLECTION_NAME, Collections.singletonList(
+ new SolrInputDocument(createMap(
+ "id", createInputField("id", "1"),
+ "title", createInputField("title", "old skool - trainers - shoes")
+ ))
+ ));
+
+ solrClient.add(COLLECTION_NAME, Collections.singletonList(
+ new SolrInputDocument(createMap(
+ "id", createInputField("id", "2"),
+ "title", createInputField("title", "print t-shirt")
+ ))
+ ));
+
+ solrClient.commit(COLLECTION_NAME);
+ }
+
+ @Test
+ public void testQueryForShoes() {
+ SolrSearchEngine searchEngine = new SolrSearchEngine(solrClient);
+
+ SearchResult result = searchEngine.search("shoes");
+ assertEquals("When searching for shoes we expect one result", 1L, result.getTotalHits());
+ assertEquals("The result should have the id 1", "1", result.getResults().get(0).get("id"));
+ }
+
+ @Test
+ public void testQueryForTShirt() {
+ SolrSearchEngine searchEngine = new SolrSearchEngine(solrClient);
+
+ SearchResult result = searchEngine.search("t-shirt");
+ assertEquals("When searching for t-shirt we expect one result", 1L, result.getTotalHits());
+ assertEquals("The result should have the id 2", "2", result.getResults().get(0).get("id"));
+ }
+
+ @Test
+ public void testQueryForAsterisk() {
+ SolrSearchEngine searchEngine = new SolrSearchEngine(solrClient);
+
+ SearchResult result = searchEngine.search("*");
+ assertEquals("When searching for * we expect no results", 0L, result.getTotalHits());
+ }
+
+ private static SolrInputField createInputField(String key, String value) {
+ SolrInputField inputField = new SolrInputField(key);
+ inputField.setValue(value);
+ return inputField;
+ }
+
+ private static Map createMap(String k0, SolrInputField v0, String k1, SolrInputField v1) {
+ Map result = new HashMap<>();
+ result.put(k0, v0);
+ result.put(k1, v1);
+ return result;
+ }
+}
diff --git a/mkdocs.yml b/mkdocs.yml
index e1b21d80811..48b63c59631 100644
--- a/mkdocs.yml
+++ b/mkdocs.yml
@@ -66,6 +66,7 @@ nav:
- modules/nginx.md
- modules/pulsar.md
- modules/rabbitmq.md
+ - modules/solr.md
- modules/toxiproxy.md
- modules/vault.md
- modules/webdriver_containers.md
diff --git a/modules/solr/build.gradle b/modules/solr/build.gradle
new file mode 100644
index 00000000000..af3193be52a
--- /dev/null
+++ b/modules/solr/build.gradle
@@ -0,0 +1,7 @@
+description = "Testcontainers :: Solr"
+
+dependencies {
+ compile project(':testcontainers')
+ testCompile 'org.apache.solr:solr-solrj:8.3.0'
+
+}
diff --git a/modules/solr/src/main/java/org/testcontainers/containers/SolrClientUtils.java b/modules/solr/src/main/java/org/testcontainers/containers/SolrClientUtils.java
new file mode 100644
index 00000000000..4492ca0befe
--- /dev/null
+++ b/modules/solr/src/main/java/org/testcontainers/containers/SolrClientUtils.java
@@ -0,0 +1,133 @@
+package org.testcontainers.containers;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.net.URISyntaxException;
+import java.net.URL;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipOutputStream;
+
+import org.apache.commons.io.IOUtils;
+
+import okhttp3.HttpUrl;
+import okhttp3.MediaType;
+import okhttp3.OkHttpClient;
+import okhttp3.Request;
+import okhttp3.RequestBody;
+import okhttp3.Response;
+
+/**
+ * Utils class which can create collections and configurations.
+ *
+ * @author Simon Schneider
+ */
+public class SolrClientUtils {
+
+ private static OkHttpClient httpClient = new OkHttpClient();
+
+ /**
+ * Creates a new configuration and uploads the solrconfig.xml and schema.xml
+ *
+ * @param hostname the Hostname under which solr is reachable
+ * @param port the Port on which solr is running
+ * @param configurationName the name of the configuration which should be created
+ * @param solrConfig the url under which the solrconfig.xml can be found
+ * @param solrSchema the url under which the schema.xml can be found or null if the default schema should be used
+ */
+ public static void uploadConfiguration(String hostname, int port, String configurationName, URL solrConfig, URL solrSchema) throws URISyntaxException, IOException {
+ Map parameters = new HashMap<>();
+ parameters.put("action", "UPLOAD");
+ parameters.put("name", configurationName);
+ HttpUrl url = generateSolrURL(hostname, port, Arrays.asList("admin", "configs"), parameters);
+
+ byte[] configurationZipFile = generateConfigZipFile(solrConfig, solrSchema);
+ executePost(url, configurationZipFile);
+
+ }
+
+ /**
+ * Creates a new collection
+ *
+ * @param hostname the Hostname under which solr is reachable
+ * @param port The Port on which solr is running
+ * @param collectionName the name of the collection which should be created
+ * @param configurationName the name of the configuration which should used to create the collection
+ * or null if the default configuration should be used
+ */
+ public static void createCollection(String hostname, int port, String collectionName, String configurationName) throws URISyntaxException, IOException {
+ Map parameters = new HashMap<>();
+ parameters.put("action", "CREATE");
+ parameters.put("name", collectionName);
+ parameters.put("numShards", "1");
+ parameters.put("replicationFactor", "1");
+ parameters.put("wt", "json");
+ if (configurationName != null) {
+ parameters.put("collection.configName", configurationName);
+ }
+ HttpUrl url = generateSolrURL(hostname, port, Arrays.asList("admin", "collections"), parameters);
+ executePost(url, null);
+ }
+
+ private static void executePost(HttpUrl url, byte[] data) throws IOException {
+
+ RequestBody requestBody = data == null ?
+ RequestBody.create(MediaType.parse("text/plain"), "") :
+ RequestBody.create(MediaType.parse("application/octet-stream"), data);
+ ;
+
+ Request request = new Request.Builder()
+ .url(url)
+ .post(requestBody)
+ .build();
+ Response response = httpClient.newCall(request).execute();
+ if (!response.isSuccessful()) {
+ String responseBody = "";
+ if (response.body() != null) {
+ responseBody = response.body().string();
+ response.close();
+ }
+ throw new SolrClientUtilsException(response.code(), "Unable to upload binary\n" + responseBody);
+ }
+ if (response.body() != null) {
+ response.close();
+ }
+ }
+
+ private static HttpUrl generateSolrURL(String hostname, int port, List pathSegments, Map parameters) throws URISyntaxException {
+ HttpUrl.Builder builder = new HttpUrl.Builder();
+ builder.scheme("http");
+ builder.host(hostname);
+ builder.port(port);
+ // Path
+ builder.addPathSegment("solr");
+ if (pathSegments != null) {
+ pathSegments.forEach(builder::addPathSegment);
+ }
+ // Query Parameters
+ parameters.forEach(builder::addQueryParameter);
+ return builder.build();
+ }
+
+ private static byte[] generateConfigZipFile(URL solrConfiguration, URL solrSchema) throws IOException {
+ ByteArrayOutputStream bos = new ByteArrayOutputStream();
+ ZipOutputStream zipOutputStream = new ZipOutputStream(bos);
+ // SolrConfig
+ zipOutputStream.putNextEntry(new ZipEntry("solrconfig.xml"));
+ IOUtils.copy(solrConfiguration.openStream(), zipOutputStream);
+ zipOutputStream.closeEntry();
+
+ // Solr Schema
+ if (solrSchema != null) {
+ zipOutputStream.putNextEntry(new ZipEntry("schema.xml"));
+ IOUtils.copy(solrSchema.openStream(), zipOutputStream);
+ zipOutputStream.closeEntry();
+ }
+
+ zipOutputStream.close();
+ return bos.toByteArray();
+ }
+}
diff --git a/modules/solr/src/main/java/org/testcontainers/containers/SolrClientUtilsException.java b/modules/solr/src/main/java/org/testcontainers/containers/SolrClientUtilsException.java
new file mode 100644
index 00000000000..5ba0865502c
--- /dev/null
+++ b/modules/solr/src/main/java/org/testcontainers/containers/SolrClientUtilsException.java
@@ -0,0 +1,7 @@
+package org.testcontainers.containers;
+
+public class SolrClientUtilsException extends RuntimeException {
+ public SolrClientUtilsException(int statusCode, String msg) {
+ super("Http Call Status: " + statusCode + "\n" + msg);
+ }
+}
diff --git a/modules/solr/src/main/java/org/testcontainers/containers/SolrContainer.java b/modules/solr/src/main/java/org/testcontainers/containers/SolrContainer.java
new file mode 100644
index 00000000000..90fd674dfda
--- /dev/null
+++ b/modules/solr/src/main/java/org/testcontainers/containers/SolrContainer.java
@@ -0,0 +1,135 @@
+package org.testcontainers.containers;
+
+import static java.time.temporal.ChronoUnit.SECONDS;
+
+import java.net.URL;
+import java.time.Duration;
+import java.util.HashSet;
+import java.util.Set;
+
+import com.github.dockerjava.api.command.InspectContainerResponse;
+
+import lombok.SneakyThrows;
+
+import org.apache.commons.lang.StringUtils;
+import org.testcontainers.containers.wait.strategy.LogMessageWaitStrategy;
+
+/**
+ * SolrContainer allows a solr container to be launched and controlled.
+ */
+public class SolrContainer extends GenericContainer {
+
+ public static final String IMAGE = "solr";
+ public static final String DEFAULT_TAG = "8.3.0";
+
+ public static final Integer ZOOKEEPER_PORT = 9983;
+ public static final Integer SOLR_PORT = 8983;
+
+ private SolrContainerConfiguration configuration;
+
+ public SolrContainer() {
+ this(IMAGE + ":" + DEFAULT_TAG);
+ }
+
+ public SolrContainer(final String dockerImageName) {
+ super(dockerImageName);
+ this.waitStrategy = new LogMessageWaitStrategy()
+ .withRegEx(".*o\\.e\\.j\\.s\\.Server Started.*")
+ .withStartupTimeout(Duration.of(60, SECONDS));
+ this.configuration = new SolrContainerConfiguration();
+ }
+
+ public SolrContainer withZookeeper(boolean zookeeper) {
+ configuration.setZookeeper(zookeeper);
+ return self();
+ }
+
+ public SolrContainer withCollection(String collection) {
+ if (StringUtils.isEmpty(collection)) {
+ throw new IllegalArgumentException("Collection name must not be empty");
+ }
+ configuration.setCollectionName(collection);
+ return self();
+ }
+
+ public SolrContainer withConfiguration(String name, URL solrConfig) {
+ if (StringUtils.isEmpty(name) || solrConfig == null) {
+ throw new IllegalArgumentException();
+ }
+ configuration.setConfigurationName(name);
+ configuration.setSolrConfiguration(solrConfig);
+ return self();
+ }
+
+ public SolrContainer withSchema(URL schema) {
+ configuration.setSolrSchema(schema);
+ return self();
+ }
+
+ public int getSolrPort() {
+ return getMappedPort(SOLR_PORT);
+ }
+
+ public int getZookeeperPort() {
+ return getMappedPort(ZOOKEEPER_PORT);
+ }
+
+ @Override
+ @SneakyThrows
+ protected void configure() {
+ if (configuration.getSolrSchema() != null && configuration.getSolrConfiguration() == null) {
+ throw new IllegalStateException("Solr needs to have a configuration is you want to use a schema");
+ }
+ // Generate Command Builder
+ String command = "solr -f";
+ // Add Default Ports
+ this.addExposedPort(SOLR_PORT);
+
+ // Configure Zookeeper
+ if (configuration.isZookeeper()) {
+ this.addExposedPort(ZOOKEEPER_PORT);
+ command = "-DzkRun -h localhost";
+ }
+
+ // Apply generated Command
+ this.setCommand(command);
+ }
+
+ @Override
+ public Set getLivenessCheckPortNumbers() {
+ return new HashSet<>(getSolrPort());
+ }
+
+ @Override
+ protected void waitUntilContainerStarted() {
+ getWaitStrategy().waitUntilReady(this);
+ }
+
+ @Override
+ @SneakyThrows
+ protected void containerIsStarted(InspectContainerResponse containerInfo) {
+ if (!configuration.isZookeeper()) {
+ ExecResult result = execInContainer("solr", "create_core", "-c", configuration.getCollectionName());
+ if (result.getExitCode() != 0) {
+ throw new IllegalStateException("Unable to create solr core:\nStdout: " + result.getStdout() + "\nStderr:" + result.getStderr());
+ }
+ return;
+ }
+
+ if (StringUtils.isNotEmpty(configuration.getConfigurationName())) {
+ SolrClientUtils.uploadConfiguration(
+ getContainerIpAddress(),
+ getSolrPort(),
+ configuration.getConfigurationName(),
+ configuration.getSolrConfiguration(),
+ configuration.getSolrSchema());
+ }
+
+ SolrClientUtils.createCollection(
+ getContainerIpAddress(),
+ getSolrPort(),
+ configuration.getCollectionName(),
+ configuration.getConfigurationName());
+ }
+}
+
diff --git a/modules/solr/src/main/java/org/testcontainers/containers/SolrContainerConfiguration.java b/modules/solr/src/main/java/org/testcontainers/containers/SolrContainerConfiguration.java
new file mode 100644
index 00000000000..1f35ce2a810
--- /dev/null
+++ b/modules/solr/src/main/java/org/testcontainers/containers/SolrContainerConfiguration.java
@@ -0,0 +1,18 @@
+package org.testcontainers.containers;
+
+import java.net.URL;
+
+import lombok.Data;
+
+/**
+ * @author Simon Schneider
+ */
+@Data
+public class SolrContainerConfiguration {
+
+ private boolean zookeeper = true;
+ private String collectionName = "dummy";
+ private String configurationName;
+ private URL solrConfiguration;
+ private URL solrSchema;
+}
diff --git a/modules/solr/src/test/java/org/testcontainers/containers/SolrContainerTest.java b/modules/solr/src/test/java/org/testcontainers/containers/SolrContainerTest.java
new file mode 100644
index 00000000000..48cb04b7053
--- /dev/null
+++ b/modules/solr/src/test/java/org/testcontainers/containers/SolrContainerTest.java
@@ -0,0 +1,76 @@
+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;
+
+/**
+ * @author Simon Schneider
+ */
+public class SolrContainerTest {
+
+ private SolrClient client = null;
+
+ @After
+ public void stopRestClient() throws IOException {
+ if (client != null) {
+ client.close();
+ client = null;
+ }
+ }
+
+ @Test
+ public void solrCloudTest() throws IOException, SolrServerException {
+ try (SolrContainer container = new SolrContainer()) {
+ container.start();
+ SolrPingResponse response = getClient(container).ping("dummy");
+ assertThat(response.getStatus(), is(0));
+ assertThat(response.jsonStr(), containsString("zkConnected\":true"));
+ }
+ }
+
+ @Test
+ public void solrStandaloneTest() throws IOException, SolrServerException {
+ try (SolrContainer container = new SolrContainer().withZookeeper(false)) {
+ container.start();
+ SolrPingResponse response = getClient(container).ping("dummy");
+ assertThat(response.getStatus(), is(0));
+ assertThat(response.jsonStr(), containsString("zkConnected\":null"));
+ }
+ }
+
+ @Test
+ public void solrCloudPingTest() throws IOException, SolrServerException {
+ // solrContainerUsage {
+ // Create the solr container.
+ SolrContainer container = new SolrContainer();
+
+ // Start the container. This step might take some time...
+ container.start();
+
+ // Do whatever you want with the client ...
+ SolrClient client = new Http2SolrClient.Builder("http://" + container.getContainerIpAddress() + ":" + container.getSolrPort() + "/solr").build();
+ SolrPingResponse response = client.ping("dummy");
+
+ // Stop the container.
+ container.stop();
+ // }
+ }
+
+ private SolrClient getClient(SolrContainer container) {
+ if (client == null) {
+ client = new Http2SolrClient.Builder("http://" + container.getContainerIpAddress() + ":" + container.getSolrPort() + "/solr").build();
+ }
+ return client;
+ }
+
+}
From a2a59bcf9592f1a6d8a1efbaea443ac5e2714f62 Mon Sep 17 00:00:00 2001
From: Martin Vysny
Date: Thu, 14 May 2020 18:34:41 +0300
Subject: [PATCH 0100/4341] Implement DockerClientFactory.isDockerAvailable()
(#2605)
---
.../org/testcontainers/DockerClientFactory.java | 13 +++++++++++++
1 file changed, 13 insertions(+)
diff --git a/core/src/main/java/org/testcontainers/DockerClientFactory.java b/core/src/main/java/org/testcontainers/DockerClientFactory.java
index 8d9da8825d2..4e16a7edf9d 100644
--- a/core/src/main/java/org/testcontainers/DockerClientFactory.java
+++ b/core/src/main/java/org/testcontainers/DockerClientFactory.java
@@ -101,6 +101,19 @@ public synchronized static DockerClientFactory instance() {
return instance;
}
+ /**
+ * Checks whether Docker is accessible and {@link #client()} is able to produce a client.
+ * @return true if Docker is available, false if not.
+ */
+ public synchronized boolean isDockerAvailable() {
+ try {
+ client();
+ return true;
+ } catch (IllegalStateException ex) {
+ return false;
+ }
+ }
+
@Synchronized
private DockerClientProviderStrategy getOrInitializeStrategy() {
if (strategy != null) {
From ede19c8a4efd48ed20f32105d81fb71249e386af Mon Sep 17 00:00:00 2001
From: Sergei Egorov
Date: Fri, 15 May 2020 15:10:36 +0200
Subject: [PATCH 0101/4341] Update example to Spring Boot 2.3.0 (#2743)
---
examples/spring-boot/build.gradle | 6 +++---
.../src/test/java/com/example/AbstractIntegrationTest.java | 1 -
2 files changed, 3 insertions(+), 4 deletions(-)
diff --git a/examples/spring-boot/build.gradle b/examples/spring-boot/build.gradle
index c7b0c63d7ba..ad8d8252fb6 100644
--- a/examples/spring-boot/build.gradle
+++ b/examples/spring-boot/build.gradle
@@ -1,6 +1,6 @@
plugins {
id 'java'
- id 'org.springframework.boot' version '2.2.7.RELEASE'
+ id 'org.springframework.boot' version '2.3.0.RELEASE'
}
apply plugin: 'io.spring.dependency-management'
@@ -9,8 +9,8 @@ repositories {
}
dependencies {
- compileOnly "org.projectlombok:lombok:1.18.12"
- annotationProcessor "org.projectlombok:lombok:1.18.10"
+ compileOnly "org.projectlombok:lombok"
+ annotationProcessor "org.projectlombok:lombok"
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.springframework.boot:spring-boot-starter-data-redis'
implementation 'org.springframework.boot:spring-boot-starter-web'
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 29a1f51ffcc..79828923d7d 100644
--- a/examples/spring-boot/src/test/java/com/example/AbstractIntegrationTest.java
+++ b/examples/spring-boot/src/test/java/com/example/AbstractIntegrationTest.java
@@ -12,7 +12,6 @@
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = DemoApplication.class, webEnvironment = WebEnvironment.RANDOM_PORT, properties = {
"spring.datasource.url=jdbc:tc:postgresql:11-alpine:///databasename",
- "spring.datasource.driver-class-name=org.testcontainers.jdbc.ContainerDatabaseDriver"
})
@ActiveProfiles("test")
public abstract class AbstractIntegrationTest {
From 672cbeebcac6310caab90383bce11a0b753b1106 Mon Sep 17 00:00:00 2001
From: Sergei Egorov
Date: Fri, 15 May 2020 15:11:57 +0200
Subject: [PATCH 0102/4341] Add `ContainerState#getHost` replacing
`getContainerIpAddress` (#2742)
* Add `ContainerState#getHost` replacing `getContainerIpAddress`
* post-merge fixes
* Ignore `METHOD_NEW_DEFAULT` in japicmp
* Update docs/features/networking.md
Co-authored-by: Richard North
* Add a tip about `getContainerIpAddress()`
* Fix the codeincludes
Co-authored-by: Richard North
---
core/build.gradle | 12 +++---------
.../ComposeServiceWaitStrategyTarget.java | 4 ++--
.../containers/ContainerState.java | 12 ++++++++++++
.../containers/DockerComposeContainer.java | 2 +-
.../containers/GenericContainer.java | 2 +-
.../containers/PortForwardingContainer.java | 4 ++--
.../internal/ExternalPortListeningCheck.java | 2 +-
.../wait/strategy/HostPortWaitStrategy.java | 2 +-
.../wait/strategy/HttpWaitStrategy.java | 2 +-
.../internal/ExternalPortListeningCheckTest.java | 2 +-
.../images/ImagePullPolicyTest.java | 2 +-
.../junit/DockerfileContainerTest.java | 2 +-
.../junit/FixedHostPortContainerTest.java | 2 +-
.../junit/GenericContainerRuleTest.java | 6 +++---
.../utility/AuthenticatedImagePullTest.java | 2 +-
.../java/generic/MultiplePortsExposedTest.java | 8 ++++----
.../java/quickstart/RedisBackedCacheIntTest.java | 2 +-
.../java/quickstart/RedisBackedCacheIntTest.java | 2 +-
.../quickstart/RedisBackedCacheIntTest.groovy | 2 +-
docs/features/networking.md | 16 ++++++++++------
docs/modules/vault.md | 2 +-
docs/quickstart/junit_4_quickstart.md | 4 ++--
docs/quickstart/junit_5_quickstart.md | 4 ++--
.../containers/CassandraContainer.java | 2 +-
.../containers/CassandraContainerTest.java | 2 +-
.../containers/ClickHouseContainer.java | 2 +-
.../containers/CockroachContainer.java | 2 +-
.../couchbase/CouchbaseContainer.java | 10 +++++-----
.../couchbase/CouchbaseContainerTest.java | 2 +-
.../testcontainers/containers/Db2Container.java | 10 +---------
.../dynamodb/DynaliteContainer.java | 2 +-
.../elasticsearch/ElasticsearchContainer.java | 4 ++--
.../containers/InfluxDBContainer.java | 2 +-
.../jupiter/inheritance/RedisContainer.java | 2 +-
.../containers/KafkaContainer.java | 2 +-
.../localstack/LocalStackContainer.java | 4 ++--
.../containers/MariaDBContainer.java | 2 +-
.../MariaDBR2DBCDatabaseContainer.java | 2 +-
.../containers/MockServerContainer.java | 2 +-
.../containers/MockServerContainerTest.java | 4 ++--
.../containers/MSSQLR2DBCDatabaseContainer.java | 2 +-
.../containers/MSSQLServerContainer.java | 2 +-
.../containers/MySQLContainer.java | 2 +-
.../containers/MySQLR2DBCDatabaseContainer.java | 2 +-
.../containers/Neo4jContainer.java | 6 +++---
.../containers/NginxContainer.java | 2 +-
.../containers/OracleContainer.java | 2 +-
.../containers/OrientDBContainer.java | 2 +-
.../containers/OrientDBContainerTest.java | 2 +-
.../containers/PostgreSQLContainer.java | 2 +-
.../PostgreSQLR2DBCDatabaseContainer.java | 2 +-
.../containers/PostgreSQLConnectionURLTest.java | 2 +-
.../containers/PrestoContainer.java | 2 +-
.../containers/PulsarContainer.java | 4 ++--
.../containers/RabbitMQContainer.java | 8 ++++----
.../containers/RabbitMQContainerTest.java | 8 ++++----
.../containers/BrowserWebDriverContainer.java | 4 ++--
.../spock/TestcontainersSharedContainerIT.groovy | 2 +-
.../containers/ToxiproxyContainer.java | 4 ++--
.../testcontainers/containers/ToxiproxyTest.java | 2 +-
.../testcontainers/vault/VaultClientTest.java | 3 +--
.../testcontainers/vault/VaultContainerTest.java | 2 +-
62 files changed, 111 insertions(+), 110 deletions(-)
diff --git a/core/build.gradle b/core/build.gradle
index 4c62a2416ef..39495e59dce 100644
--- a/core/build.gradle
+++ b/core/build.gradle
@@ -84,20 +84,14 @@ task japicmp(type: me.champeau.gradle.japicmp.JapicmpTask) {
failOnModification = true
failOnSourceIncompatibility = true
- // TODO cleanup excludes after we release the version based on docker-java 3.2.0
-
packageExcludes = [
"com.github.dockerjava.*",
"org.testcontainers.shaded.*",
]
- classExcludes = [
- // 'METHOD_REMOVED_IN_SUPERCLASS'
- "org.testcontainers.containers.output.FrameConsumerResultCallback",
- "org.testcontainers.dockerclient.LogToStringContainerCallback",
-
- // 'METHOD_RETURN_TYPE_CHANGED', exposed `com.github.dockerjava.core.command.PullImageResultCallback` to the public API
- "org.testcontainers.images.TimeLimitedLoggedPullImageResultCallback",
+ methodExcludes = [
+ // METHOD_NEW_DEFAULT
+ "org.testcontainers.containers.ContainerState#getHost()"
]
onlyBinaryIncompatibleModified = true
diff --git a/core/src/main/java/org/testcontainers/containers/ComposeServiceWaitStrategyTarget.java b/core/src/main/java/org/testcontainers/containers/ComposeServiceWaitStrategyTarget.java
index d4ad51dc1da..2fb953b4aee 100644
--- a/core/src/main/java/org/testcontainers/containers/ComposeServiceWaitStrategyTarget.java
+++ b/core/src/main/java/org/testcontainers/containers/ComposeServiceWaitStrategyTarget.java
@@ -54,8 +54,8 @@ public Integer getMappedPort(int originalPort) {
* {@inheritDoc}
*/
@Override
- public String getContainerIpAddress() {
- return proxyContainer.getContainerIpAddress();
+ public String getHost() {
+ return proxyContainer.getHost();
}
/**
diff --git a/core/src/main/java/org/testcontainers/containers/ContainerState.java b/core/src/main/java/org/testcontainers/containers/ContainerState.java
index ad006aa3b43..1565b4e7e3e 100644
--- a/core/src/main/java/org/testcontainers/containers/ContainerState.java
+++ b/core/src/main/java/org/testcontainers/containers/ContainerState.java
@@ -43,8 +43,18 @@ public interface ContainerState {
* Get the IP address that this container may be reached on (may not be the local machine).
*
* @return an IP address
+ * @see #getHost()
*/
default String getContainerIpAddress() {
+ return getHost();
+ }
+
+ /**
+ * Get the host that this container may be reached on (may not be the local machine).
+ *
+ * @return a host
+ */
+ default String getHost() {
return DockerClientFactory.instance().dockerHostIpAddress();
}
@@ -107,6 +117,7 @@ default InspectContainerResponse getCurrentContainerInfo() {
/**
* Get the actual mapped port for a first port exposed by the container.
+ * Should be used in conjunction with {@link #getHost()}.
*
* @return the port that the exposed port is mapped to
* @throws IllegalStateException if there are no exposed ports
@@ -121,6 +132,7 @@ default Integer getFirstMappedPort() {
/**
* Get the actual mapped port for a given port exposed by the container.
+ * Should be used in conjunction with {@link #getHost()}.
*
* @param originalPort the original TCP port that is exposed
* @return the port that the exposed port is mapped to, or null if it is not exposed
diff --git a/core/src/main/java/org/testcontainers/containers/DockerComposeContainer.java b/core/src/main/java/org/testcontainers/containers/DockerComposeContainer.java
index 7bf8d3c916b..651bd9c8526 100644
--- a/core/src/main/java/org/testcontainers/containers/DockerComposeContainer.java
+++ b/core/src/main/java/org/testcontainers/containers/DockerComposeContainer.java
@@ -402,7 +402,7 @@ public SELF waitingFor(String serviceName, @NonNull WaitStrategy waitStrategy) {
* @return a host IP address or hostname that can be used for accessing the service container.
*/
public String getServiceHost(String serviceName, Integer servicePort) {
- return ambassadorContainer.getContainerIpAddress();
+ return ambassadorContainer.getHost();
}
/**
diff --git a/core/src/main/java/org/testcontainers/containers/GenericContainer.java b/core/src/main/java/org/testcontainers/containers/GenericContainer.java
index 23e5f9bf173..89938cdfe56 100644
--- a/core/src/main/java/org/testcontainers/containers/GenericContainer.java
+++ b/core/src/main/java/org/testcontainers/containers/GenericContainer.java
@@ -1244,7 +1244,7 @@ public SELF withCopyFileToContainer(MountableFile mountableFile, String containe
*/
@Deprecated
public String getIpAddress() {
- return getContainerIpAddress();
+ return getHost();
}
/**
diff --git a/core/src/main/java/org/testcontainers/containers/PortForwardingContainer.java b/core/src/main/java/org/testcontainers/containers/PortForwardingContainer.java
index 852a986b58f..09f1d98bd2d 100644
--- a/core/src/main/java/org/testcontainers/containers/PortForwardingContainer.java
+++ b/core/src/main/java/org/testcontainers/containers/PortForwardingContainer.java
@@ -40,7 +40,7 @@ private Connection createSSHSession() {
);
container.start();
- Connection connection = new Connection(container.getContainerIpAddress(), container.getMappedPort(22));
+ Connection connection = new Connection(container.getHost(), container.getMappedPort(22));
connection.setTCPNoDelay(true);
connection.connect(
@@ -60,7 +60,7 @@ private Connection createSSHSession() {
public void exposeHostPort(int port) {
exposeHostPort(port, port);
}
-
+
@SneakyThrows
public void exposeHostPort(int hostPort, int containerPort) {
if (exposedPorts.add(new AbstractMap.SimpleEntry<>(hostPort, containerPort))) {
diff --git a/core/src/main/java/org/testcontainers/containers/wait/internal/ExternalPortListeningCheck.java b/core/src/main/java/org/testcontainers/containers/wait/internal/ExternalPortListeningCheck.java
index 2aae12bab8d..b9b63eeee5c 100644
--- a/core/src/main/java/org/testcontainers/containers/wait/internal/ExternalPortListeningCheck.java
+++ b/core/src/main/java/org/testcontainers/containers/wait/internal/ExternalPortListeningCheck.java
@@ -18,7 +18,7 @@ public class ExternalPortListeningCheck implements Callable {
@Override
public Boolean call() {
- String address = containerState.getContainerIpAddress();
+ String address = containerState.getHost();
externalLivenessCheckPorts.parallelStream().forEach(externalPort -> {
try {
diff --git a/core/src/main/java/org/testcontainers/containers/wait/strategy/HostPortWaitStrategy.java b/core/src/main/java/org/testcontainers/containers/wait/strategy/HostPortWaitStrategy.java
index 91f4e91fadf..a0ba1e9950c 100644
--- a/core/src/main/java/org/testcontainers/containers/wait/strategy/HostPortWaitStrategy.java
+++ b/core/src/main/java/org/testcontainers/containers/wait/strategy/HostPortWaitStrategy.java
@@ -46,7 +46,7 @@ protected void waitUntilReady() {
} catch (TimeoutException e) {
throw new ContainerLaunchException("Timed out waiting for container port to open (" +
- waitStrategyTarget.getContainerIpAddress() +
+ waitStrategyTarget.getHost() +
" ports: " +
externalLivenessCheckPorts +
" should be listening)");
diff --git a/core/src/main/java/org/testcontainers/containers/wait/strategy/HttpWaitStrategy.java b/core/src/main/java/org/testcontainers/containers/wait/strategy/HttpWaitStrategy.java
index a44fc46e4b0..5fd7834b12d 100644
--- a/core/src/main/java/org/testcontainers/containers/wait/strategy/HttpWaitStrategy.java
+++ b/core/src/main/java/org/testcontainers/containers/wait/strategy/HttpWaitStrategy.java
@@ -225,7 +225,7 @@ protected void waitUntilReady() {
*/
private URI buildLivenessUri(int livenessCheckPort) {
final String scheme = (tlsEnabled ? "https" : "http") + "://";
- final String host = waitStrategyTarget.getContainerIpAddress();
+ final String host = waitStrategyTarget.getHost();
final String portSuffix;
if ((tlsEnabled && 443 == livenessCheckPort) || (!tlsEnabled && 80 == livenessCheckPort)) {
diff --git a/core/src/test/java/org/testcontainers/containers/wait/internal/ExternalPortListeningCheckTest.java b/core/src/test/java/org/testcontainers/containers/wait/internal/ExternalPortListeningCheckTest.java
index 69bf9d06ce7..19f3a772d41 100644
--- a/core/src/test/java/org/testcontainers/containers/wait/internal/ExternalPortListeningCheckTest.java
+++ b/core/src/test/java/org/testcontainers/containers/wait/internal/ExternalPortListeningCheckTest.java
@@ -29,7 +29,7 @@ public void setUp() throws Exception {
nonListeningSocket.close();
mockContainer = mock(WaitStrategyTarget.class);
- when(mockContainer.getContainerIpAddress()).thenReturn("127.0.0.1");
+ when(mockContainer.getHost()).thenReturn("127.0.0.1");
}
@Test
diff --git a/core/src/test/java/org/testcontainers/images/ImagePullPolicyTest.java b/core/src/test/java/org/testcontainers/images/ImagePullPolicyTest.java
index 59b7486c75e..69e68f7f225 100644
--- a/core/src/test/java/org/testcontainers/images/ImagePullPolicyTest.java
+++ b/core/src/test/java/org/testcontainers/images/ImagePullPolicyTest.java
@@ -33,7 +33,7 @@ public class ImagePullPolicyTest {
@BeforeClass
public static void beforeClass() throws Exception {
- String testRegistryAddress = registry.getContainerIpAddress() + ":" + registry.getFirstMappedPort();
+ String testRegistryAddress = registry.getHost() + ":" + registry.getFirstMappedPort();
String testImageName = testRegistryAddress + "/image-pull-policy-test";
String tag = UUID.randomUUID().toString();
imageName = testImageName + ":" + tag;
diff --git a/core/src/test/java/org/testcontainers/junit/DockerfileContainerTest.java b/core/src/test/java/org/testcontainers/junit/DockerfileContainerTest.java
index 8f601b2e737..6ad7c3ea26e 100644
--- a/core/src/test/java/org/testcontainers/junit/DockerfileContainerTest.java
+++ b/core/src/test/java/org/testcontainers/junit/DockerfileContainerTest.java
@@ -31,7 +31,7 @@ public class DockerfileContainerTest {
@Test
public void simpleDslTest() throws IOException {
- String address = String.format("http://%s:%s", dslContainer.getContainerIpAddress(), dslContainer.getMappedPort(80));
+ String address = String.format("http://%s:%s", dslContainer.getHost(), dslContainer.getMappedPort(80));
CloseableHttpClient httpClient = HttpClientBuilder.create().build();
HttpGet get = new HttpGet(address);
diff --git a/core/src/test/java/org/testcontainers/junit/FixedHostPortContainerTest.java b/core/src/test/java/org/testcontainers/junit/FixedHostPortContainerTest.java
index dba48da4db1..5fe49756ba1 100644
--- a/core/src/test/java/org/testcontainers/junit/FixedHostPortContainerTest.java
+++ b/core/src/test/java/org/testcontainers/junit/FixedHostPortContainerTest.java
@@ -85,7 +85,7 @@ private String readResponse(GenericContainer container, Integer port) throws IOE
final BufferedReader reader = Unreliables.retryUntilSuccess(10, TimeUnit.SECONDS,
() -> {
Uninterruptibles.sleepUninterruptibly(1, TimeUnit.SECONDS);
- final Socket socket = new Socket(container.getContainerIpAddress(), port);
+ final Socket socket = new Socket(container.getHost(), port);
return new BufferedReader(new InputStreamReader(socket.getInputStream()));
}
)
diff --git a/core/src/test/java/org/testcontainers/junit/GenericContainerRuleTest.java b/core/src/test/java/org/testcontainers/junit/GenericContainerRuleTest.java
index 6c51713b6b1..1f4a3ff121d 100644
--- a/core/src/test/java/org/testcontainers/junit/GenericContainerRuleTest.java
+++ b/core/src/test/java/org/testcontainers/junit/GenericContainerRuleTest.java
@@ -162,7 +162,7 @@ public void withTmpFsTest() throws Exception {
@Test
public void simpleRabbitMqTest() throws IOException, TimeoutException {
ConnectionFactory factory = new ConnectionFactory();
- factory.setHost(rabbitMq.getContainerIpAddress());
+ factory.setHost(rabbitMq.getHost());
factory.setPort(rabbitMq.getMappedPort(RABBITMQ_PORT));
Connection connection = factory.newConnection();
@@ -194,7 +194,7 @@ public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProp
@Test
public void simpleMongoDbTest() {
- MongoClient mongoClient = new MongoClient(mongo.getContainerIpAddress(), mongo.getMappedPort(MONGO_PORT));
+ MongoClient mongoClient = new MongoClient(mongo.getHost(), mongo.getMappedPort(MONGO_PORT));
MongoDatabase database = mongoClient.getDatabase("test");
MongoCollection collection = database.getCollection("testCollection");
@@ -366,7 +366,7 @@ private BufferedReader getReaderForContainerPort80(GenericContainer container) {
return Unreliables.retryUntilSuccess(10, TimeUnit.SECONDS, () -> {
Uninterruptibles.sleepUninterruptibly(1, TimeUnit.SECONDS);
- Socket socket = new Socket(container.getContainerIpAddress(), container.getFirstMappedPort());
+ Socket socket = new Socket(container.getHost(), container.getFirstMappedPort());
return new BufferedReader(new InputStreamReader(socket.getInputStream()));
});
}
diff --git a/core/src/test/java/org/testcontainers/utility/AuthenticatedImagePullTest.java b/core/src/test/java/org/testcontainers/utility/AuthenticatedImagePullTest.java
index 5f4417f218b..31f098bab16 100644
--- a/core/src/test/java/org/testcontainers/utility/AuthenticatedImagePullTest.java
+++ b/core/src/test/java/org/testcontainers/utility/AuthenticatedImagePullTest.java
@@ -65,7 +65,7 @@ public static void setUp() throws InterruptedException {
originalAuthLocatorSingleton = RegistryAuthLocator.instance();
client = DockerClientFactory.instance().client();
- String testRegistryAddress = authenticatedRegistry.getContainerIpAddress() + ":" + authenticatedRegistry.getFirstMappedPort();
+ String testRegistryAddress = authenticatedRegistry.getHost() + ":" + authenticatedRegistry.getFirstMappedPort();
testImageName = testRegistryAddress + "/alpine";
testImageNameWithTag = testImageName + ":latest";
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 f22bc55defd..f5a92423b6c 100644
--- a/docs/examples/junit4/generic/src/test/java/generic/MultiplePortsExposedTest.java
+++ b/docs/examples/junit4/generic/src/test/java/generic/MultiplePortsExposedTest.java
@@ -31,13 +31,13 @@ public void fetchFirstMappedPort() {
}
@Test
- public void getContainerIpAddressOnly() {
- String ipAddress = container.getContainerIpAddress();
+ public void getHostOnly() {
+ String ipAddress = container.getHost();
}
@Test
- public void getContainerIpAddressAndMappedPort() {
+ public void getHostAndMappedPort() {
String address =
- container.getContainerIpAddress() + ":" + container.getMappedPort(2424);
+ container.getHost() + ":" + container.getMappedPort(2424);
}
}
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 ac3ae7746b4..f2ef1ab0220 100644
--- a/docs/examples/junit4/redis/src/test/java/quickstart/RedisBackedCacheIntTest.java
+++ b/docs/examples/junit4/redis/src/test/java/quickstart/RedisBackedCacheIntTest.java
@@ -21,7 +21,7 @@ public class RedisBackedCacheIntTest {
@Before
public void setUp() {
- String address = redis.getContainerIpAddress();
+ String address = redis.getHost();
Integer port = redis.getFirstMappedPort();
// Now we have an address and port for Redis, no matter where it is running
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 7c3968a724e..0f4f98fb669 100644
--- a/docs/examples/junit5/redis/src/test/java/quickstart/RedisBackedCacheIntTest.java
+++ b/docs/examples/junit5/redis/src/test/java/quickstart/RedisBackedCacheIntTest.java
@@ -24,7 +24,7 @@ public class RedisBackedCacheIntTest {
@BeforeEach
public void setUp() {
- String address = redis.getContainerIpAddress();
+ String address = redis.getHost();
Integer port = redis.getFirstMappedPort();
// Now we have an address and port for Redis, no matter where it is running
diff --git a/docs/examples/spock/redis/src/test/groovy/quickstart/RedisBackedCacheIntTest.groovy b/docs/examples/spock/redis/src/test/groovy/quickstart/RedisBackedCacheIntTest.groovy
index c2537a948d5..068c8079a7d 100644
--- a/docs/examples/spock/redis/src/test/groovy/quickstart/RedisBackedCacheIntTest.groovy
+++ b/docs/examples/spock/redis/src/test/groovy/quickstart/RedisBackedCacheIntTest.groovy
@@ -15,7 +15,7 @@ class RedisBackedCacheIntTest extends Specification {
// }
void setup() {
- String address = redis.containerIpAddress
+ String address = redis.host
Integer port = redis.firstMappedPort
// Now we have an address and port for Redis, no matter where it is running
diff --git a/docs/features/networking.md b/docs/features/networking.md
index 5de0c9dfa96..2fe039b74ef 100644
--- a/docs/features/networking.md
+++ b/docs/features/networking.md
@@ -33,23 +33,27 @@ There is also a `getFirstMappedPort` method for convenience, for the fairly comm
[Retrieving the first mapped port](../examples/junit4/generic/src/test/java/generic/MultiplePortsExposedTest.java) inside_block:fetchFirstMappedPort
-## Getting the container IP address
+## Getting the container host
When running with a local Docker daemon, exposed ports will usually be reachable on `localhost`.
However, in some CI environments they may instead be reachable on a different host.
-As such, Testcontainers provides a convenience method to obtain an IP address on which the container should be reachable from the host machine.
+As such, Testcontainers provides a convenience method to obtain an address on which the container should be reachable from the host machine.
-[Getting the container IP address](../examples/junit4/generic/src/test/java/generic/MultiplePortsExposedTest.java) inside_block:getContainerIpAddressOnly
+[Getting the container host](../examples/junit4/generic/src/test/java/generic/MultiplePortsExposedTest.java) inside_block:getHostOnly
-It is normally advisable to use `getContainerIpAddress` and `getMappedPort` together when constructing addresses - for example:
+It is normally advisable to use `getHost` and `getMappedPort` together when constructing addresses - for example:
-[Getting the container IP address and mapped port](../examples/junit4/generic/src/test/java/generic/MultiplePortsExposedTest.java) inside_block:getContainerIpAddressAndMappedPort
+[Getting the container host and mapped port](../examples/junit4/generic/src/test/java/generic/MultiplePortsExposedTest.java) inside_block:getHostAndMappedPort
+!!! tip
+ `getHost()` is a replacement for `getContainerIpAddress()` and returns the same result.
+ `getContainerIpAddress()` is believed to be confusingly named, and will eventually be deprecated.
+
## Exposing host ports to the container
In some cases it is necessary to make a network connection from a container to a socket that is listening on the host machine.
@@ -86,4 +90,4 @@ Docker provides the ability for you to create custom networks and place containe
[Creating custom networks](../../core/src/test/java/org/testcontainers/containers/NetworkTest.java) inside_block:useCustomNetwork
-
\ No newline at end of file
+
diff --git a/docs/modules/vault.md b/docs/modules/vault.md
index 43d8ff57468..1f58c0ab836 100644
--- a/docs/modules/vault.md
+++ b/docs/modules/vault.md
@@ -21,7 +21,7 @@ public class SomeTest {
//There are many integration clients for Vault so let's just define a general one here:
VaultClient client = new VaultClient(
- vaultContainer.getContainerIpAddress(),
+ vaultContainer.getHost(),
vaultContainer.getMappedPort(8200),
"my-root-token");
diff --git a/docs/quickstart/junit_4_quickstart.md b/docs/quickstart/junit_4_quickstart.md
index 86cd720942b..a3fecb1a14d 100644
--- a/docs/quickstart/junit_4_quickstart.md
+++ b/docs/quickstart/junit_4_quickstart.md
@@ -65,10 +65,10 @@ We can do this in our test `setUp` method, to set up our component under test:
!!! tip
- Notice that we also ask Testcontainers for the container's actual address with `redis.getContainerIpAddress();`,
+ Notice that we also ask Testcontainers for the container's actual address with `redis.getHost();`,
rather than hard-coding `localhost`. `localhost` may work in some environments but not others - for example it may
not work on your current or future CI environment. As such, **avoid hard-coding** the address, and use
- `getContainerIpAddress()` instead.
+ `getHost()` instead.
## 4. Run the tests!
diff --git a/docs/quickstart/junit_5_quickstart.md b/docs/quickstart/junit_5_quickstart.md
index 179a87a5448..efd52b6c523 100644
--- a/docs/quickstart/junit_5_quickstart.md
+++ b/docs/quickstart/junit_5_quickstart.md
@@ -94,10 +94,10 @@ We can do this in our test `setUp` method, to set up our component under test:
!!! tip
- Notice that we also ask Testcontainers for the container's actual address with `redis.getContainerIpAddress();`,
+ Notice that we also ask Testcontainers for the container's actual address with `redis.getHost();`,
rather than hard-coding `localhost`. `localhost` may work in some environments but not others - for example it may
not work on your current or future CI environment. As such, **avoid hard-coding** the address, and use
- `getContainerIpAddress()` instead.
+ `getHost()` instead.
## 4. Run the tests!
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 a78d23e4b4b..27c2f182e9e 100644
--- a/modules/cassandra/src/main/java/org/testcontainers/containers/CassandraContainer.java
+++ b/modules/cassandra/src/main/java/org/testcontainers/containers/CassandraContainer.java
@@ -161,7 +161,7 @@ public Cluster getCluster() {
public static Cluster getCluster(ContainerState containerState, boolean enableJmxReporting) {
final Cluster.Builder builder = Cluster.builder()
- .addContactPoint(containerState.getContainerIpAddress())
+ .addContactPoint(containerState.getHost())
.withPort(containerState.getMappedPort(CQL_PORT));
if (!enableJmxReporting) {
builder.withoutJMXReporting();
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 6105aa275c9..5bc68aa9972 100644
--- a/modules/cassandra/src/test/java/org/testcontainers/containers/CassandraContainerTest.java
+++ b/modules/cassandra/src/test/java/org/testcontainers/containers/CassandraContainerTest.java
@@ -116,7 +116,7 @@ private void testInitScript(CassandraContainer cassandraContainer) {
private ResultSet performQuery(CassandraContainer cassandraContainer, String cql) {
Cluster explicitCluster = Cluster.builder()
- .addContactPoint(cassandraContainer.getContainerIpAddress())
+ .addContactPoint(cassandraContainer.getHost())
.withPort(cassandraContainer.getMappedPort(CassandraContainer.CQL_PORT))
.build();
return performQuery(explicitCluster, cql);
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 9364ecc4d14..4d4ea2d11a9 100644
--- a/modules/clickhouse/src/main/java/org/testcontainers/containers/ClickHouseContainer.java
+++ b/modules/clickhouse/src/main/java/org/testcontainers/containers/ClickHouseContainer.java
@@ -48,7 +48,7 @@ public String getDriverClassName() {
@Override
public String getJdbcUrl() {
- return JDBC_URL_PREFIX + getContainerIpAddress() + ":" + getMappedPort(HTTP_PORT) + "/" + databaseName;
+ return JDBC_URL_PREFIX + getHost() + ":" + getMappedPort(HTTP_PORT) + "/" + databaseName;
}
@Override
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 fb13ced60d7..3768ca7a008 100644
--- a/modules/cockroachdb/src/main/java/org/testcontainers/containers/CockroachContainer.java
+++ b/modules/cockroachdb/src/main/java/org/testcontainers/containers/CockroachContainer.java
@@ -43,7 +43,7 @@ public String getDriverClassName() {
@Override
public String getJdbcUrl() {
- return JDBC_URL_PREFIX + "://" + getContainerIpAddress() + ":" + getMappedPort(DB_PORT) + "/" + databaseName;
+ return JDBC_URL_PREFIX + "://" + getHost() + ":" + getMappedPort(DB_PORT) + "/" + databaseName;
}
@Override
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 14e5744bb6d..33f87359a92 100644
--- a/modules/couchbase/src/main/java/org/testcontainers/couchbase/CouchbaseContainer.java
+++ b/modules/couchbase/src/main/java/org/testcontainers/couchbase/CouchbaseContainer.java
@@ -141,7 +141,7 @@ public int getBootstrapHttpDirectPort() {
}
public String getConnectionString() {
- return String.format("couchbase://%s:%d", getContainerIpAddress(), getBootstrapCarrierDirectPort());
+ return String.format("couchbase://%s:%d", getHost(), getBootstrapCarrierDirectPort());
}
@Override
@@ -201,7 +201,7 @@ protected void containerIsStarting(final InspectContainerResponse containerInfo)
@Override
protected void containerIsStarted(InspectContainerResponse containerInfo) {
createBuckets();
- logger().info("Couchbase container is ready! UI available at http://{}:{}", getContainerIpAddress(), getMappedPort(MGMT_PORT));
+ logger().info("Couchbase container is ready! UI available at http://{}:{}", getHost(), getMappedPort(MGMT_PORT));
}
/**
@@ -222,7 +222,7 @@ private void waitUntilNodeIsOnline() {
* up automatically, we bind the internal hostname to the internal IP address.
*/
private void renameNode() {
- logger().debug("Renaming Couchbase Node from localhost to {}", getContainerIpAddress());
+ logger().debug("Renaming Couchbase Node from localhost to {}", getHost());
Response response = doHttpRequest(MGMT_PORT, "/node/controller/rename", "POST", new FormBody.Builder()
.add("hostname", getInternalIpAddress())
@@ -284,7 +284,7 @@ private void configureExternalPorts() {
logger().debug("Mapping external ports to the alternate address configuration");
final FormBody.Builder builder = new FormBody.Builder();
- builder.add("hostname", getContainerIpAddress());
+ builder.add("hostname", getHost());
builder.add("mgmt", Integer.toString(getMappedPort(MGMT_PORT)));
builder.add("mgmtSSL", Integer.toString(getMappedPort(MGMT_SSL_PORT)));
@@ -418,7 +418,7 @@ private Response doHttpRequest(final int port, final String path, final String m
final boolean auth) {
try {
Request.Builder requestBuilder = new Request.Builder()
- .url("http://" + getContainerIpAddress() + ":" + getMappedPort(port) + path);
+ .url("http://" + getHost() + ":" + getMappedPort(port) + path);
if (auth) {
requestBuilder = requestBuilder.header("Authorization", Credentials.basic(username, password));
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 27ad0f6265a..c5c9f18a58b 100644
--- a/modules/couchbase/src/test/java/org/testcontainers/couchbase/CouchbaseContainerTest.java
+++ b/modules/couchbase/src/test/java/org/testcontainers/couchbase/CouchbaseContainerTest.java
@@ -53,7 +53,7 @@ public void testBasicContainerUsage() {
Cluster cluster = CouchbaseCluster.create(
environment,
- container.getContainerIpAddress()
+ container.getHost()
);
// }
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 13ef72c328e..b1472b21c6c 100644
--- a/modules/db2/src/main/java/org/testcontainers/containers/Db2Container.java
+++ b/modules/db2/src/main/java/org/testcontainers/containers/Db2Container.java
@@ -1,20 +1,12 @@
package org.testcontainers.containers;
-import com.github.dockerjava.api.command.InspectContainerResponse;
-import org.testcontainers.DockerClientFactory;
-import org.testcontainers.containers.output.OutputFrame;
-import org.testcontainers.containers.output.WaitingConsumer;
import org.testcontainers.containers.wait.strategy.LogMessageWaitStrategy;
import org.testcontainers.utility.LicenseAcceptance;
-import org.testcontainers.utility.LogUtils;
-import java.io.IOException;
import java.time.Duration;
import java.time.temporal.ChronoUnit;
import java.util.HashSet;
import java.util.Set;
-import java.util.concurrent.TimeoutException;
-import java.util.function.Predicate;
public class Db2Container extends JdbcDatabaseContainer {
@@ -81,7 +73,7 @@ public String getDriverClassName() {
@Override
public String getJdbcUrl() {
- return "jdbc:db2://" + getContainerIpAddress() + ":" + getMappedPort(DB2_PORT) + "/" + databaseName;
+ return "jdbc:db2://" + getHost() + ":" + getMappedPort(DB2_PORT) + "/" + databaseName;
}
@Override
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 66397452921..6280ddb9421 100644
--- a/modules/dynalite/src/main/java/org/testcontainers/dynamodb/DynaliteContainer.java
+++ b/modules/dynalite/src/main/java/org/testcontainers/dynamodb/DynaliteContainer.java
@@ -46,7 +46,7 @@ public AmazonDynamoDB getClient() {
*/
public AwsClientBuilder.EndpointConfiguration getEndpointConfiguration() {
return new AwsClientBuilder.EndpointConfiguration("http://" +
- this.getContainerIpAddress() + ":" +
+ this.getHost() + ":" +
this.getMappedPort(MAPPED_PORT), null);
}
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 3eb12969bed..e9a0b95d7ed 100644
--- a/modules/elasticsearch/src/main/java/org/testcontainers/elasticsearch/ElasticsearchContainer.java
+++ b/modules/elasticsearch/src/main/java/org/testcontainers/elasticsearch/ElasticsearchContainer.java
@@ -57,10 +57,10 @@ public ElasticsearchContainer(String dockerImageName) {
}
public String getHttpHostAddress() {
- return getContainerIpAddress() + ":" + getMappedPort(ELASTICSEARCH_DEFAULT_PORT);
+ return getHost() + ":" + getMappedPort(ELASTICSEARCH_DEFAULT_PORT);
}
public InetSocketAddress getTcpHost() {
- return new InetSocketAddress(getContainerIpAddress(), getMappedPort(ELASTICSEARCH_DEFAULT_TCP_PORT));
+ return new InetSocketAddress(getHost(), getMappedPort(ELASTICSEARCH_DEFAULT_TCP_PORT));
}
}
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 c3ac909f2d4..68efc516504 100644
--- a/modules/influxdb/src/main/java/org/testcontainers/containers/InfluxDBContainer.java
+++ b/modules/influxdb/src/main/java/org/testcontainers/containers/InfluxDBContainer.java
@@ -131,7 +131,7 @@ public SELF withPassword(final String password) {
* @return a url to influxDb
*/
public String getUrl() {
- return "http://" + getContainerIpAddress() + ":" + getLivenessCheckPort();
+ return "http://" + getHost() + ":" + getLivenessCheckPort();
}
/**
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 bae3885527d..177a48bb9d0 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
@@ -15,6 +15,6 @@ public RedisContainer(String dockerImageName) {
}
public Jedis getJedis() {
- return new Jedis(getContainerIpAddress(), getMappedPort(6379));
+ return new Jedis(getHost(), getMappedPort(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 5aab0f52ffa..bb92f85b03c 100644
--- a/modules/kafka/src/main/java/org/testcontainers/containers/KafkaContainer.java
+++ b/modules/kafka/src/main/java/org/testcontainers/containers/KafkaContainer.java
@@ -88,7 +88,7 @@ public String getBootstrapServers() {
if (port == PORT_NOT_ASSIGNED) {
throw new IllegalStateException("You should start Kafka container first");
}
- return String.format("PLAINTEXT://%s:%s", getContainerIpAddress(), port);
+ return String.format("PLAINTEXT://%s:%s", getHost(), port);
}
@Override
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 c649d322ead..96cedb37726 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
@@ -63,7 +63,7 @@ protected void configure() {
withEnv(HOSTNAME_EXTERNAL_ENV_VAR, getNetworkAliases().get(getNetworkAliases().size() - 1)); // use the last network alias set
hostnameExternalReason = "to match last network alias on container with non-default network";
} else {
- withEnv(HOSTNAME_EXTERNAL_ENV_VAR, getContainerIpAddress());
+ withEnv(HOSTNAME_EXTERNAL_ENV_VAR, getHost());
hostnameExternalReason = "to match host-routable address for container";
}
logger().info("{} environment variable set to {} ({})", HOSTNAME_EXTERNAL_ENV_VAR, getEnvMap().get(HOSTNAME_EXTERNAL_ENV_VAR), hostnameExternalReason);
@@ -134,7 +134,7 @@ public AwsClientBuilder.EndpointConfiguration getEndpointConfiguration(Service s
*/
public URI getEndpointOverride(Service service) {
try {
- final String address = getContainerIpAddress();
+ final String address = getHost();
String ipAddress = address;
// resolve IP address and use that as the endpoint so that path-style access is automatically used for S3
ipAddress = InetAddress.getByName(address).getHostAddress();
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 fb21dd9a1a9..1b4cb3344e4 100644
--- a/modules/mariadb/src/main/java/org/testcontainers/containers/MariaDBContainer.java
+++ b/modules/mariadb/src/main/java/org/testcontainers/containers/MariaDBContainer.java
@@ -60,7 +60,7 @@ public String getDriverClassName() {
@Override
public String getJdbcUrl() {
- return "jdbc:mariadb://" + getContainerIpAddress() + ":" + getMappedPort(MARIADB_PORT) + "/" + databaseName;
+ return "jdbc:mariadb://" + getHost() + ":" + getMappedPort(MARIADB_PORT) + "/" + databaseName;
}
@Override
diff --git a/modules/mariadb/src/main/java/org/testcontainers/containers/MariaDBR2DBCDatabaseContainer.java b/modules/mariadb/src/main/java/org/testcontainers/containers/MariaDBR2DBCDatabaseContainer.java
index 4ddbed997d4..e37e9b0b6bf 100644
--- a/modules/mariadb/src/main/java/org/testcontainers/containers/MariaDBR2DBCDatabaseContainer.java
+++ b/modules/mariadb/src/main/java/org/testcontainers/containers/MariaDBR2DBCDatabaseContainer.java
@@ -23,7 +23,7 @@ public static ConnectionFactoryOptions getOptions(MariaDBContainer> container)
@Override
public ConnectionFactoryOptions configure(ConnectionFactoryOptions options) {
return options.mutate()
- .option(ConnectionFactoryOptions.HOST, container.getContainerIpAddress())
+ .option(ConnectionFactoryOptions.HOST, container.getHost())
.option(ConnectionFactoryOptions.PORT, container.getMappedPort(MariaDBContainer.MARIADB_PORT))
.option(ConnectionFactoryOptions.DATABASE, container.getDatabaseName())
.option(ConnectionFactoryOptions.USER, container.getUsername())
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 f1f9dc42d19..e35370f4b27 100644
--- a/modules/mockserver/src/main/java/org/testcontainers/containers/MockServerContainer.java
+++ b/modules/mockserver/src/main/java/org/testcontainers/containers/MockServerContainer.java
@@ -20,7 +20,7 @@ public MockServerContainer(String version) {
}
public String getEndpoint() {
- return String.format("http://%s:%d", getContainerIpAddress(), getMappedPort(PORT));
+ return String.format("http://%s:%d", getHost(), getMappedPort(PORT));
}
public Integer getServerPort() {
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 be1495a04c7..91f740b4bd8 100644
--- a/modules/mockserver/src/test/java/org/testcontainers/containers/MockServerContainerTest.java
+++ b/modules/mockserver/src/test/java/org/testcontainers/containers/MockServerContainerTest.java
@@ -33,7 +33,7 @@ private static String responseFromMockserver(MockServerContainer mockServer, Str
@Test
public void shouldReturnExpectation() throws Exception {
// testSimpleExpectation {
- new MockServerClient(mockServer.getContainerIpAddress(), mockServer.getServerPort())
+ new MockServerClient(mockServer.getHost(), mockServer.getServerPort())
.when(request()
.withPath("/person")
.withQueryStringParameter("name", "peter"))
@@ -57,7 +57,7 @@ public void shouldCallActualMockserverVersion() throws Exception {
String expectedBody = "Hello World!";
- new MockServerClient(mockServer.getContainerIpAddress(), mockServer.getServerPort())
+ new MockServerClient(mockServer.getHost(), mockServer.getServerPort())
.when(request().withPath("/hello"))
.respond(response().withBody(expectedBody));
diff --git a/modules/mssqlserver/src/main/java/org/testcontainers/containers/MSSQLR2DBCDatabaseContainer.java b/modules/mssqlserver/src/main/java/org/testcontainers/containers/MSSQLR2DBCDatabaseContainer.java
index 27c486c218c..59c3ed0de68 100644
--- a/modules/mssqlserver/src/main/java/org/testcontainers/containers/MSSQLR2DBCDatabaseContainer.java
+++ b/modules/mssqlserver/src/main/java/org/testcontainers/containers/MSSQLR2DBCDatabaseContainer.java
@@ -23,7 +23,7 @@ public static ConnectionFactoryOptions getOptions(MSSQLServerContainer> contai
@Override
public ConnectionFactoryOptions configure(ConnectionFactoryOptions options) {
return options.mutate()
- .option(ConnectionFactoryOptions.HOST, container.getContainerIpAddress())
+ .option(ConnectionFactoryOptions.HOST, container.getHost())
.option(ConnectionFactoryOptions.PORT, container.getMappedPort(MSSQLServerContainer.MS_SQL_SERVER_PORT))
// TODO enable if/when MSSQLServerContainer adds support for customizing the DB name
// .option(ConnectionFactoryOptions.DATABASE, container.getDatabasseName())
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 2219a5aaf61..631228aeef2 100644
--- a/modules/mssqlserver/src/main/java/org/testcontainers/containers/MSSQLServerContainer.java
+++ b/modules/mssqlserver/src/main/java/org/testcontainers/containers/MSSQLServerContainer.java
@@ -62,7 +62,7 @@ public String getDriverClassName() {
@Override
public String getJdbcUrl() {
- return "jdbc:sqlserver://" + getContainerIpAddress() + ":" + getMappedPort(MS_SQL_SERVER_PORT);
+ return "jdbc:sqlserver://" + getHost() + ":" + getMappedPort(MS_SQL_SERVER_PORT);
}
@Override
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 b8bbe225617..79d29234b99 100644
--- a/modules/mysql/src/main/java/org/testcontainers/containers/MySQLContainer.java
+++ b/modules/mysql/src/main/java/org/testcontainers/containers/MySQLContainer.java
@@ -70,7 +70,7 @@ public String getDriverClassName() {
@Override
public String getJdbcUrl() {
- return "jdbc:mysql://" + getContainerIpAddress() + ":" + getMappedPort(MYSQL_PORT) + "/" + databaseName;
+ return "jdbc:mysql://" + getHost() + ":" + getMappedPort(MYSQL_PORT) + "/" + databaseName;
}
@Override
diff --git a/modules/mysql/src/main/java/org/testcontainers/containers/MySQLR2DBCDatabaseContainer.java b/modules/mysql/src/main/java/org/testcontainers/containers/MySQLR2DBCDatabaseContainer.java
index c43ffcca1b2..274224352a8 100644
--- a/modules/mysql/src/main/java/org/testcontainers/containers/MySQLR2DBCDatabaseContainer.java
+++ b/modules/mysql/src/main/java/org/testcontainers/containers/MySQLR2DBCDatabaseContainer.java
@@ -23,7 +23,7 @@ public static ConnectionFactoryOptions getOptions(MySQLContainer> container) {
@Override
public ConnectionFactoryOptions configure(ConnectionFactoryOptions options) {
return options.mutate()
- .option(ConnectionFactoryOptions.HOST, container.getContainerIpAddress())
+ .option(ConnectionFactoryOptions.HOST, container.getHost())
.option(ConnectionFactoryOptions.PORT, container.getMappedPort(MySQLContainer.MYSQL_PORT))
.option(ConnectionFactoryOptions.DATABASE, container.getDatabaseName())
.option(ConnectionFactoryOptions.USER, container.getUsername())
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 0c16927dba8..10545da43d6 100644
--- a/modules/neo4j/src/main/java/org/testcontainers/containers/Neo4jContainer.java
+++ b/modules/neo4j/src/main/java/org/testcontainers/containers/Neo4jContainer.java
@@ -111,21 +111,21 @@ protected void configure() {
* @return Bolt URL for use with Neo4j's Java-Driver.
*/
public String getBoltUrl() {
- return String.format("bolt://" + getContainerIpAddress() + ":" + getMappedPort(DEFAULT_BOLT_PORT));
+ return String.format("bolt://" + getHost() + ":" + getMappedPort(DEFAULT_BOLT_PORT));
}
/**
* @return URL of the transactional HTTP endpoint.
*/
public String getHttpUrl() {
- return String.format("http://" + getContainerIpAddress() + ":" + getMappedPort(DEFAULT_HTTP_PORT));
+ return String.format("http://" + getHost() + ":" + getMappedPort(DEFAULT_HTTP_PORT));
}
/**
* @return URL of the transactional HTTPS endpoint.
*/
public String getHttpsUrl() {
- return String.format("https://" + getContainerIpAddress() + ":" + getMappedPort(DEFAULT_HTTPS_PORT));
+ return String.format("https://" + getHost() + ":" + getMappedPort(DEFAULT_HTTPS_PORT));
}
/**
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 bedf040869f..fb931bce409 100644
--- a/modules/nginx/src/main/java/org/testcontainers/containers/NginxContainer.java
+++ b/modules/nginx/src/main/java/org/testcontainers/containers/NginxContainer.java
@@ -33,7 +33,7 @@ protected Set getLivenessCheckPorts() {
}
public URL getBaseUrl(String scheme, int port) throws MalformedURLException {
- return new URL(scheme + "://" + getContainerIpAddress() + ":" + getMappedPort(port));
+ return new URL(scheme + "://" + getHost() + ":" + getMappedPort(port));
}
public void setCustomContent(String htmlContentPath) {
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 e86768bc383..60603a7e222 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
@@ -64,7 +64,7 @@ public String getDriverClassName() {
@Override
public String getJdbcUrl() {
- return "jdbc:oracle:thin:" + getUsername() + "/" + getPassword() + "@" + getContainerIpAddress() + ":" + getOraclePort() + ":" + getSid();
+ return "jdbc:oracle:thin:" + getUsername() + "/" + getPassword() + "@" + getHost() + ":" + getOraclePort() + ":" + getSid();
}
@Override
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 ca0180640ce..b7fcc85573a 100644
--- a/modules/orientdb/src/main/java/org/testcontainers/containers/OrientDBContainer.java
+++ b/modules/orientdb/src/main/java/org/testcontainers/containers/OrientDBContainer.java
@@ -108,7 +108,7 @@ public OrientDB getOrientDB() {
}
public String getServerUrl() {
- return "remote:" + getContainerIpAddress() + ":" + getMappedPort(2424);
+ return "remote:" + getHost() + ":" + getMappedPort(2424);
}
public String getDbUrl() {
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 0a067b375b6..54b0661cae2 100644
--- a/modules/orientdb/src/test/java/org/testcontainers/containers/OrientDBContainerTest.java
+++ b/modules/orientdb/src/test/java/org/testcontainers/containers/OrientDBContainerTest.java
@@ -63,7 +63,7 @@ public void shouldInitializeDatabaseFromScript() {
container.start();
assertThat(container.getDbUrl())
- .isEqualTo("remote:" + container.getContainerIpAddress() + ":" + container.getMappedPort(2424) + "/persons");
+ .isEqualTo("remote:" + container.getHost() + ":" + container.getMappedPort(2424) + "/persons");
final ODatabaseSession session = container.getSession();
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 06cdd7ebc8d..8634f9d70fa 100644
--- a/modules/postgresql/src/main/java/org/testcontainers/containers/PostgreSQLContainer.java
+++ b/modules/postgresql/src/main/java/org/testcontainers/containers/PostgreSQLContainer.java
@@ -68,7 +68,7 @@ public String getDriverClassName() {
@Override
public String getJdbcUrl() {
// Disable Postgres driver use of java.util.logging to reduce noise at startup time
- return format("jdbc:postgresql://%s:%d/%s?loggerLevel=OFF", getContainerIpAddress(), getMappedPort(POSTGRESQL_PORT), databaseName);
+ return format("jdbc:postgresql://%s:%d/%s?loggerLevel=OFF", getHost(), getMappedPort(POSTGRESQL_PORT), databaseName);
}
@Override
diff --git a/modules/postgresql/src/main/java/org/testcontainers/containers/PostgreSQLR2DBCDatabaseContainer.java b/modules/postgresql/src/main/java/org/testcontainers/containers/PostgreSQLR2DBCDatabaseContainer.java
index 9bfb9fdee05..88b5497f5d3 100644
--- a/modules/postgresql/src/main/java/org/testcontainers/containers/PostgreSQLR2DBCDatabaseContainer.java
+++ b/modules/postgresql/src/main/java/org/testcontainers/containers/PostgreSQLR2DBCDatabaseContainer.java
@@ -23,7 +23,7 @@ public static ConnectionFactoryOptions getOptions(PostgreSQLContainer> contain
@Override
public ConnectionFactoryOptions configure(ConnectionFactoryOptions options) {
return options.mutate()
- .option(ConnectionFactoryOptions.HOST, container.getContainerIpAddress())
+ .option(ConnectionFactoryOptions.HOST, container.getHost())
.option(ConnectionFactoryOptions.PORT, container.getMappedPort(PostgreSQLContainer.POSTGRESQL_PORT))
.option(ConnectionFactoryOptions.DATABASE, container.getDatabaseName())
.option(ConnectionFactoryOptions.USER, container.getUsername())
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 3b887cedbec..05f6ea204a8 100644
--- a/modules/postgresql/src/test/java/org/testcontainers/containers/PostgreSQLConnectionURLTest.java
+++ b/modules/postgresql/src/test/java/org/testcontainers/containers/PostgreSQLConnectionURLTest.java
@@ -48,7 +48,7 @@ public void shouldRejectInvalidQueryString() {
static class FixedJdbcUrlPostgreSQLContainer extends PostgreSQLContainer {
@Override
- public String getContainerIpAddress() {
+ public String getHost() {
return "localhost";
}
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 0f2a82b9b9d..56488525734 100644
--- a/modules/presto/src/main/java/org/testcontainers/containers/PrestoContainer.java
+++ b/modules/presto/src/main/java/org/testcontainers/containers/PrestoContainer.java
@@ -49,7 +49,7 @@ public String getDriverClassName() {
@Override
public String getJdbcUrl() {
- return format("jdbc:presto://%s:%s/%s", getContainerIpAddress(), getMappedPort(PRESTO_PORT), nullToEmpty(catalog));
+ return format("jdbc:presto://%s:%s/%s", getHost(), getMappedPort(PRESTO_PORT), nullToEmpty(catalog));
}
@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 49f0437f95a..c9532979057 100644
--- a/modules/pulsar/src/main/java/org/testcontainers/containers/PulsarContainer.java
+++ b/modules/pulsar/src/main/java/org/testcontainers/containers/PulsarContainer.java
@@ -26,11 +26,11 @@ public PulsarContainer(String pulsarVersion) {
}
public String getPulsarBrokerUrl() {
- return String.format("pulsar://%s:%s", getContainerIpAddress(), getMappedPort(BROKER_PORT));
+ return String.format("pulsar://%s:%s", getHost(), getMappedPort(BROKER_PORT));
}
public String getHttpServiceUrl() {
- return String.format("http://%s:%s", getContainerIpAddress(), getMappedPort(BROKER_HTTP_PORT));
+ return String.format("http://%s:%s", getHost(), getMappedPort(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 aba71e25a7e..49423201d14 100644
--- a/modules/rabbitmq/src/main/java/org/testcontainers/containers/RabbitMQContainer.java
+++ b/modules/rabbitmq/src/main/java/org/testcontainers/containers/RabbitMQContainer.java
@@ -114,28 +114,28 @@ public Integer getHttpPort() {
* @return AMQP URL for use with AMQP clients.
*/
public String getAmqpUrl() {
- return "amqp://" + getContainerIpAddress() + ":" + getAmqpPort();
+ return "amqp://" + getHost() + ":" + getAmqpPort();
}
/**
* @return AMQPS URL for use with AMQPS clients.
*/
public String getAmqpsUrl() {
- return "amqps://" + getContainerIpAddress() + ":" + getAmqpsPort();
+ return "amqps://" + getHost() + ":" + getAmqpsPort();
}
/**
* @return URL of the HTTP management endpoint.
*/
public String getHttpUrl() {
- return "http://" + getContainerIpAddress() + ":" + getHttpPort();
+ return "http://" + getHost() + ":" + getHttpPort();
}
/**
* @return URL of the HTTPS management endpoint.
*/
public String getHttpsUrl() {
- return "https://" + getContainerIpAddress() + ":" + getHttpsPort();
+ return "https://" + getHost() + ":" + getHttpsPort();
}
/**
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 6f283c7451f..27ac38f55ce 100644
--- a/modules/rabbitmq/src/test/java/org/testcontainers/containers/RabbitMQContainerTest.java
+++ b/modules/rabbitmq/src/test/java/org/testcontainers/containers/RabbitMQContainerTest.java
@@ -49,13 +49,13 @@ public void shouldCreateRabbitMQContainer()
container.start();
assertThat(container.getAmqpsUrl()).isEqualTo(
- String.format("amqps://%s:%d", container.getContainerIpAddress(), container.getMappedPort(DEFAULT_AMQPS_PORT)));
+ String.format("amqps://%s:%d", container.getHost(), container.getMappedPort(DEFAULT_AMQPS_PORT)));
assertThat(container.getAmqpUrl()).isEqualTo(
- String.format("amqp://%s:%d", container.getContainerIpAddress(), container.getMappedPort(DEFAULT_AMQP_PORT)));
+ String.format("amqp://%s:%d", container.getHost(), container.getMappedPort(DEFAULT_AMQP_PORT)));
assertThat(container.getHttpsUrl()).isEqualTo(
- String.format("https://%s:%d", container.getContainerIpAddress(), container.getMappedPort(DEFAULT_HTTPS_PORT)));
+ String.format("https://%s:%d", container.getHost(), container.getMappedPort(DEFAULT_HTTPS_PORT)));
assertThat(container.getHttpUrl()).isEqualTo(
- String.format("http://%s:%d", container.getContainerIpAddress(), container.getMappedPort(DEFAULT_HTTP_PORT)));
+ String.format("http://%s:%d", container.getHost(), container.getMappedPort(DEFAULT_HTTP_PORT)));
assertThat(container.getHttpsPort()).isEqualTo(container.getMappedPort(DEFAULT_HTTPS_PORT));
assertThat(container.getHttpPort()).isEqualTo(container.getMappedPort(DEFAULT_HTTP_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 49218dfb990..397f6c4a2cf 100644
--- a/modules/selenium/src/main/java/org/testcontainers/containers/BrowserWebDriverContainer.java
+++ b/modules/selenium/src/main/java/org/testcontainers/containers/BrowserWebDriverContainer.java
@@ -207,7 +207,7 @@ public static String getImageForCapabilities(Capabilities capabilities, String s
public URL getSeleniumAddress() {
try {
- return new URL("http", getContainerIpAddress(), getMappedPort(SELENIUM_PORT), "/wd/hub");
+ return new URL("http", getHost(), getMappedPort(SELENIUM_PORT), "/wd/hub");
} catch (MalformedURLException e) {
e.printStackTrace();// TODO
return null;
@@ -216,7 +216,7 @@ public URL getSeleniumAddress() {
@Override
public String getVncAddress() {
- return "vnc://vnc:secret@" + getContainerIpAddress() + ":" + getMappedPort(VNC_PORT);
+ return "vnc://vnc:secret@" + getHost() + ":" + getMappedPort(VNC_PORT);
}
@Override
diff --git a/modules/spock/src/test/groovy/org/testcontainers/spock/TestcontainersSharedContainerIT.groovy b/modules/spock/src/test/groovy/org/testcontainers/spock/TestcontainersSharedContainerIT.groovy
index 014b25eac1f..5a12ce25b71 100644
--- a/modules/spock/src/test/groovy/org/testcontainers/spock/TestcontainersSharedContainerIT.groovy
+++ b/modules/spock/src/test/groovy/org/testcontainers/spock/TestcontainersSharedContainerIT.groovy
@@ -38,7 +38,7 @@ class TestcontainersSharedContainerIT extends Specification {
}
private CloseableHttpResponse performHttpRequest(CloseableHttpClient client) {
- String ip = genericContainer.containerIpAddress
+ String ip = genericContainer.host
String port = genericContainer.getMappedPort(80)
def response = client.execute(new HttpGet("http://$ip:$port"))
response
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 1b631fa9d6d..f2915b5af11 100644
--- a/modules/toxiproxy/src/main/java/org/testcontainers/containers/ToxiproxyContainer.java
+++ b/modules/toxiproxy/src/main/java/org/testcontainers/containers/ToxiproxyContainer.java
@@ -47,7 +47,7 @@ public ToxiproxyContainer(String imageName) {
@Override
protected void containerIsStarted(InspectContainerResponse containerInfo) {
- client = new ToxiproxyClient(getContainerIpAddress(), getMappedPort(TOXIPROXY_CONTROL_PORT));
+ client = new ToxiproxyClient(getHost(), getMappedPort(TOXIPROXY_CONTROL_PORT));
}
/**
@@ -88,7 +88,7 @@ public ContainerProxy getProxy(String hostname, int port) {
final Proxy proxy = client.createProxy(upstream, "0.0.0.0:" + toxiPort, upstream);
final int mappedPort = getMappedPort(toxiPort);
- return new ContainerProxy(proxy, getContainerIpAddress(), mappedPort, toxiPort);
+ return new ContainerProxy(proxy, getHost(), mappedPort, toxiPort);
} catch (IOException e) {
throw new RuntimeException("Proxy could not be created", e);
}
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 366f425b5b5..d76851f57b5 100644
--- a/modules/toxiproxy/src/test/java/org/testcontainers/containers/ToxiproxyTest.java
+++ b/modules/toxiproxy/src/test/java/org/testcontainers/containers/ToxiproxyTest.java
@@ -40,7 +40,7 @@ public class ToxiproxyTest {
@Test
public void testDirect() {
- final Jedis jedis = createJedis(redis.getContainerIpAddress(), redis.getFirstMappedPort());
+ final Jedis jedis = createJedis(redis.getHost(), redis.getFirstMappedPort());
jedis.set("somekey", "somevalue");
final String s = jedis.get("somekey");
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 8091980d234..dfe73cae4b9 100644
--- a/modules/vault/src/test/java/org/testcontainers/vault/VaultClientTest.java
+++ b/modules/vault/src/test/java/org/testcontainers/vault/VaultClientTest.java
@@ -5,7 +5,6 @@
import com.bettercloud.vault.VaultException;
import com.bettercloud.vault.response.LogicalResponse;
import org.junit.Test;
-import org.testcontainers.containers.wait.strategy.Wait;
import java.util.HashMap;
import java.util.Map;
@@ -26,7 +25,7 @@ public void writeAndReadMultipleValues() throws VaultException {
vaultContainer.start();
final VaultConfig config = new VaultConfig()
- .address("http://" + vaultContainer.getContainerIpAddress() + ":" + vaultContainer.getFirstMappedPort())
+ .address("http://" + vaultContainer.getHost() + ":" + vaultContainer.getFirstMappedPort())
.token(VAULT_TOKEN)
.build();
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 fae9209c8e7..d7ac5ca8686 100644
--- a/modules/vault/src/test/java/org/testcontainers/vault/VaultContainerTest.java
+++ b/modules/vault/src/test/java/org/testcontainers/vault/VaultContainerTest.java
@@ -71,7 +71,7 @@ public void readSecondSecretPathOverHttpApi() throws InterruptedException {
}
private String getHostAndPort() {
- return vaultContainer.getContainerIpAddress() + ":" + vaultContainer.getMappedPort(8200);
+ return vaultContainer.getHost() + ":" + vaultContainer.getMappedPort(8200);
}
From 1eef935529564c0f2df1384bd5d55999f849bf5c Mon Sep 17 00:00:00 2001
From: Sergei Egorov
Date: Fri, 15 May 2020 15:14:28 +0200
Subject: [PATCH 0103/4341] Store `GenericContainer#exposedPorts` as an
order-preserving `Set` (#2613)
* Store `GenericContainer#exposedPorts` as an order-preserving `Set`
* Update core/src/test/java/org/testcontainers/junit/GenericContainerRuleTest.java
Co-authored-by: Richard North
Co-authored-by: Richard North
---
.../containers/GenericContainer.java | 18 +++++++++++++++---
.../junit/GenericContainerRuleTest.java | 9 +++++++++
2 files changed, 24 insertions(+), 3 deletions(-)
diff --git a/core/src/main/java/org/testcontainers/containers/GenericContainer.java b/core/src/main/java/org/testcontainers/containers/GenericContainer.java
index 89938cdfe56..d906c320bd5 100644
--- a/core/src/main/java/org/testcontainers/containers/GenericContainer.java
+++ b/core/src/main/java/org/testcontainers/containers/GenericContainer.java
@@ -77,6 +77,7 @@
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
+import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
@@ -118,7 +119,7 @@ public class GenericContainer>
* Default settings
*/
@NonNull
- private List exposedPorts = new ArrayList<>();
+ private LinkedHashSet exposedPorts = new LinkedHashSet<>();
@NonNull
private List portBindings = new ArrayList<>();
@@ -256,6 +257,16 @@ public void setImage(Future image) {
this.image = new RemoteDockerImage(image);
}
+ @Override
+ public List getExposedPorts() {
+ return new ArrayList<>(exposedPorts);
+ }
+
+ @Override
+ public void setExposedPorts(List exposedPorts) {
+ this.exposedPorts = new LinkedHashSet<>(exposedPorts);
+ }
+
/**
* @see #dependsOn(Iterable)
*/
@@ -671,8 +682,9 @@ protected void containerIsStopped(InspectContainerResponse containerInfo) {
@Deprecated
protected Integer getLivenessCheckPort() {
// legacy implementation for backwards compatibility
- if (exposedPorts.size() > 0) {
- return getMappedPort(exposedPorts.get(0));
+ Iterator exposedPortsIterator = exposedPorts.iterator();
+ if (exposedPortsIterator.hasNext()) {
+ return getMappedPort(exposedPortsIterator.next());
} else if (portBindings.size() > 0) {
return Integer.valueOf(PortBinding.parse(portBindings.get(0)).getBinding().getHostPortSpec());
} else {
diff --git a/core/src/test/java/org/testcontainers/junit/GenericContainerRuleTest.java b/core/src/test/java/org/testcontainers/junit/GenericContainerRuleTest.java
index 1f4a3ff121d..b450244a84d 100644
--- a/core/src/test/java/org/testcontainers/junit/GenericContainerRuleTest.java
+++ b/core/src/test/java/org/testcontainers/junit/GenericContainerRuleTest.java
@@ -379,6 +379,15 @@ public void addExposedPortAfterWithExposedPortsTest() {
assertTrue("addExposedPort should be exposed", redis.getExposedPorts().contains(8987));
}
+ @Test
+ public void addingExposedPortTwiceShouldNotFail() {
+ redis.addExposedPort(8987);
+ redis.addExposedPort(8987);
+ assertThat("Both ports should be exposed", redis.getExposedPorts().size(), equalTo(2)); // 2 ports = de-duplicated port 8897 and original port 6379
+ assertTrue("withExposedPort should be exposed", redis.getExposedPorts().contains(REDIS_PORT));
+ assertTrue("addExposedPort should be exposed", redis.getExposedPorts().contains(8987));
+ }
+
@Test
public void sharedMemorySetTest() {
try (GenericContainer containerWithSharedMemory = new GenericContainer()
From 8c7c769cdfd3848457e0a70de8518f08ad7053b4 Mon Sep 17 00:00:00 2001
From: Richard North
Date: Sat, 16 May 2020 20:43:00 +0100
Subject: [PATCH 0104/4341] Dynamic CI jobs for examples (#2677)
---
.../{ci-dind.yml => ci-docker-wormhole.yml} | 2 +-
.github/workflows/ci-examples.yml | 73 +++++++++++++++++++
.github/workflows/ci.yml | 27 -------
examples/build.gradle | 5 ++
examples/settings.gradle | 36 +++++++++
gradle/ci-support.gradle | 6 +-
settings.gradle | 38 +++++-----
7 files changed, 137 insertions(+), 50 deletions(-)
rename .github/workflows/{ci-dind.yml => ci-docker-wormhole.yml} (96%)
create mode 100644 .github/workflows/ci-examples.yml
diff --git a/.github/workflows/ci-dind.yml b/.github/workflows/ci-docker-wormhole.yml
similarity index 96%
rename from .github/workflows/ci-dind.yml
rename to .github/workflows/ci-docker-wormhole.yml
index 15bd5ec76ee..3c6da54dc1f 100644
--- a/.github/workflows/ci-dind.yml
+++ b/.github/workflows/ci-docker-wormhole.yml
@@ -1,4 +1,4 @@
-name: in-container
+name: CI-Docker-Wormhole
on:
pull_request: {}
diff --git a/.github/workflows/ci-examples.yml b/.github/workflows/ci-examples.yml
new file mode 100644
index 00000000000..bec794dc167
--- /dev/null
+++ b/.github/workflows/ci-examples.yml
@@ -0,0 +1,73 @@
+name: CI-Examples
+
+on:
+ pull_request: {}
+ push: { branches: [ master ] }
+
+env:
+ AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
+ AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
+
+jobs:
+ find_gradle_jobs:
+ runs-on: ubuntu-18.04
+ outputs:
+ matrix: ${{ steps.set-matrix.outputs.matrix }}
+ steps:
+ - uses: actions/checkout@v2
+ - uses: actions/setup-java@v1
+ with:
+ java-version: '1.8'
+ - name: Cache Gradle Home files
+ uses: actions/cache@v1
+ with:
+ path: ~/.gradle/caches
+ key: ${{ runner.os }}-gradle-home-testmatrix-examples-${{ hashFiles('**/*.gradle') }}
+ restore-keys: |
+ ${{ runner.os }}-gradle-home-testmatrix-examples-
+ ${{ runner.os }}-gradle-home-
+ - id: set-matrix
+ working-directory: ./examples/
+ env:
+ # Since we override the tests executor,
+ # we should not push empty results to the cache
+ READ_ONLY_REMOTE_GRADLE_CACHE: true
+ run: |
+ TASKS=$(./gradlew --no-daemon --parallel -q testMatrix)
+ echo $TASKS
+ echo "::set-output name=matrix::{\"gradle_args\":$TASKS}"
+ check:
+ needs: find_gradle_jobs
+ strategy:
+ fail-fast: false
+ matrix: ${{ fromJson(needs.find_gradle_jobs.outputs.matrix) }}
+ runs-on: ubuntu-18.04
+ steps:
+ - uses: actions/checkout@v2
+ - uses: actions/setup-java@v1
+ with:
+ java-version: '1.8'
+ - name: Cache Gradle Home files
+ uses: actions/cache@v1
+ with:
+ path: ~/.gradle/caches
+ key: ${{ runner.os }}-gradle-home-examples-${{matrix.gradle_args}}_check-${{ hashFiles('**/*.gradle') }}
+ restore-keys: |
+ ${{ runner.os }}-gradle-home-examples-${{matrix.gradle_args}}_check-
+ ${{ runner.os }}-gradle-home-examples-${{matrix.gradle_args}}_check-
+ ${{ runner.os }}-gradle-home-examples-
+ - name: Clear existing docker image cache
+ run: docker image prune -af
+ - name: Build and test Examples with Gradle (${{matrix.gradle_args}})
+ working-directory: ./examples/
+ run: |
+ ./gradlew --no-daemon --continue --scan --info ${{matrix.gradle_args}}
+ - name: Aggregate Examples test reports with ciMate
+ if: always()
+ env:
+ CIMATE_PROJECT_ID: 2348n4vl
+ CIMATE_CI_KEY: "Examples / ${{ runner.os }} / ${{matrix.gradle_args}}"
+ run: |
+ wget -q https://get.cimate.io/release/linux/cimate
+ chmod +x cimate
+ ./cimate "**/TEST-*.xml"
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index a6baaf7e92d..90e64dde133 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -69,30 +69,3 @@ jobs:
wget -q https://get.cimate.io/release/linux/cimate
chmod +x cimate
./cimate "**/TEST-*.xml"
- examples:
- runs-on: ubuntu-18.04
- steps:
- - uses: actions/checkout@v2
- - uses: actions/setup-java@v1
- with:
- java-version: '1.8'
- - name: Cache Gradle Home files
- uses: actions/cache@v1
- with:
- path: ~/.gradle/caches
- key: ${{ runner.os }}-gradle-home-examples-${{ hashFiles('**/*.gradle*') }}
- restore-keys: |
- ${{ runner.os }}-gradle-home-examples-
- - name: Build and test Examples with Gradle
- working-directory: ./examples/
- run: |
- ./gradlew --no-daemon --scan --info check
- - name: Aggregate test reports with ciMate
- if: always()
- env:
- CIMATE_PROJECT_ID: 2348n4vl
- CIMATE_CI_KEY: examples
- run: |
- wget -q https://get.cimate.io/release/linux/cimate
- chmod +x cimate
- ./cimate "**/TEST-*.xml"
diff --git a/examples/build.gradle b/examples/build.gradle
index b2ecf1b0be3..25b7c1fcf29 100644
--- a/examples/build.gradle
+++ b/examples/build.gradle
@@ -1 +1,6 @@
// empty build.gradle for dependabot
+apply from: "$rootDir/../gradle/ci-support.gradle"
+
+subprojects {
+ apply plugin:"java"
+}
diff --git a/examples/settings.gradle b/examples/settings.gradle
index ef47a61f807..25da14a0931 100644
--- a/examples/settings.gradle
+++ b/examples/settings.gradle
@@ -1,3 +1,18 @@
+buildscript {
+ repositories {
+ maven {
+ url "https://plugins.gradle.org/m2/"
+ }
+ }
+ dependencies {
+ classpath "gradle.plugin.ch.myniva.gradle:s3-build-cache:0.10.0"
+ classpath "com.gradle.enterprise:com.gradle.enterprise.gradle.plugin:3.2.1"
+ }
+}
+
+apply plugin: 'ch.myniva.s3-build-cache'
+apply plugin: 'com.gradle.enterprise'
+
rootProject.name = 'testcontainers-examples'
includeBuild '..'
@@ -15,3 +30,24 @@ include 'spring-boot'
include 'cucumber'
include 'spring-boot-kotlin-redis'
include 'spock'
+
+ext.isMasterBuild = false ||
+ (System.getenv("GITHUB_REF") == "refs/heads/master") ||
+ (System.getenv("BUILD_SOURCEBRANCHNAME") == "master")
+
+buildCache {
+ local {
+ enabled = !isMasterBuild
+ }
+
+ remote(ch.myniva.gradle.caching.s3.AwsS3BuildCache) {
+ endpoint = 'fra1.digitaloceanspaces.com'
+ region = 'fra1'
+ bucket = 'testcontainers'
+ path = 'cache'
+ push = isMasterBuild && !System.getenv("READ_ONLY_REMOTE_GRADLE_CACHE")
+ headers = [
+ 'x-amz-acl': 'public-read'
+ ]
+ }
+}
diff --git a/gradle/ci-support.gradle b/gradle/ci-support.gradle
index 7c3408068b3..e83c936f2f3 100644
--- a/gradle/ci-support.gradle
+++ b/gradle/ci-support.gradle
@@ -28,9 +28,9 @@ gradle.taskGraph.whenReady {
subproject.tasks.withType(Test).all {
testExecuter([execute: { spec, processor -> }, stopNow:{}] as org.gradle.api.internal.tasks.testing.TestExecuter)
}
- subproject.tasks.findByName("shadowJar").enabled = false
- subproject.tasks.findByName("javadoc").enabled = false
- subproject.tasks.findByName("delombok").enabled = false
+ subproject.tasks.findByName("shadowJar")?.enabled = false
+ subproject.tasks.findByName("javadoc")?.enabled = false
+ subproject.tasks.findByName("delombok")?.enabled = false
subproject.tasks.findByName("japicmp")?.enabled = false
}
}
diff --git a/settings.gradle b/settings.gradle
index 150d79f89fe..2ea21599ceb 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -13,6 +13,25 @@ buildscript {
apply plugin: 'ch.myniva.s3-build-cache'
apply plugin: 'com.gradle.enterprise'
+rootProject.name = 'testcontainers-java'
+
+include "bom"
+
+include "testcontainers"
+project(':testcontainers').projectDir = "$rootDir/core" as File
+
+file('modules').eachDir { dir ->
+ include dir.name
+ project(":${dir.name}").projectDir = dir
+}
+
+include ':docs:examples:junit4:generic'
+include ':docs:examples:junit4:redis'
+include ':docs:examples:junit5:redis'
+include ':docs:examples:spock:redis'
+
+include 'test-support'
+
ext.isMasterBuild = false ||
(System.getenv("GITHUB_REF") == "refs/heads/master") ||
(System.getenv("BUILD_SOURCEBRANCHNAME") == "master")
@@ -34,25 +53,6 @@ buildCache {
}
}
-rootProject.name = 'testcontainers-java'
-
-include "bom"
-
-include "testcontainers"
-project(':testcontainers').projectDir = "$rootDir/core" as File
-
-file('modules').eachDir { dir ->
- include dir.name
- project(":${dir.name}").projectDir = dir
-}
-
-include ':docs:examples:junit4:generic'
-include ':docs:examples:junit4:redis'
-include ':docs:examples:junit5:redis'
-include ':docs:examples:spock:redis'
-
-include 'test-support'
-
gradleEnterprise {
buildScan {
termsOfServiceUrl = 'https://gradle.com/terms-of-service'
From bf233cd62b610491f9007c7aa94e087298f0109b Mon Sep 17 00:00:00 2001
From: "dependabot-preview[bot]"
<27856297+dependabot-preview[bot]@users.noreply.github.com>
Date: Sat, 16 May 2020 21:49:03 +0100
Subject: [PATCH 0105/4341] Bump testcontainers from 1.14.1 to 1.14.2 in /core
(#2751)
---
core/build.gradle | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/core/build.gradle b/core/build.gradle
index 39495e59dce..48bbf57d7e9 100644
--- a/core/build.gradle
+++ b/core/build.gradle
@@ -104,7 +104,7 @@ if (!org.gradle.internal.os.OperatingSystem.current().isWindows()) {
}
dependencies {
- baseline 'org.testcontainers:testcontainers:1.14.1', {
+ baseline 'org.testcontainers:testcontainers:1.14.2', {
exclude group: "*", module: "*"
}
From 1e0625cea385f8c1e1864a365a471ac7dcdd86a2 Mon Sep 17 00:00:00 2001
From: "dependabot-preview[bot]"
<27856297+dependabot-preview[bot]@users.noreply.github.com>
Date: Sat, 16 May 2020 21:49:27 +0100
Subject: [PATCH 0106/4341] Bump guava from 28.2-jre to 29.0-jre in
/modules/jdbc-test (#2754)
---
modules/jdbc-test/build.gradle | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/modules/jdbc-test/build.gradle b/modules/jdbc-test/build.gradle
index 8b36f126b86..df9c26fcd72 100644
--- a/modules/jdbc-test/build.gradle
+++ b/modules/jdbc-test/build.gradle
@@ -2,7 +2,7 @@ dependencies {
compile project(':jdbc')
compile project(':test-support')
- compile 'com.google.guava:guava:28.2-jre'
+ compile 'com.google.guava:guava:29.0-jre'
compile 'org.apache.commons:commons-lang3:3.10'
compile 'com.zaxxer:HikariCP-java6:2.3.13'
compile 'commons-dbutils:commons-dbutils:1.7'
From e465f5d836922a1b3f5853a65a57d349574f62e3 Mon Sep 17 00:00:00 2001
From: "dependabot-preview[bot]"
<27856297+dependabot-preview[bot]@users.noreply.github.com>
Date: Sat, 16 May 2020 21:49:45 +0100
Subject: [PATCH 0107/4341] Bump mssql-jdbc from 8.2.2.jre8 to
8.3.0.jre8-preview in /modules/mssqlserver (#2755)
---
modules/mssqlserver/build.gradle | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/modules/mssqlserver/build.gradle b/modules/mssqlserver/build.gradle
index 5d72209b27e..8cdfa35dee1 100644
--- a/modules/mssqlserver/build.gradle
+++ b/modules/mssqlserver/build.gradle
@@ -10,7 +10,7 @@ dependencies {
compileOnly 'io.r2dbc:r2dbc-mssql:0.8.2.RELEASE'
testCompile project(':jdbc-test')
- testCompile 'com.microsoft.sqlserver:mssql-jdbc:8.2.2.jre8'
+ testCompile 'com.microsoft.sqlserver:mssql-jdbc:8.3.0.jre8-preview'
testCompile project(':r2dbc')
testCompile 'io.r2dbc:r2dbc-mssql:0.8.1.RELEASE'
From 421f67bff6b5d814ec4b92c7c9b6086e00e4c886 Mon Sep 17 00:00:00 2001
From: "dependabot-preview[bot]"
<27856297+dependabot-preview[bot]@users.noreply.github.com>
Date: Sat, 16 May 2020 21:50:25 +0100
Subject: [PATCH 0108/4341] Bump tomcat-jdbc from 9.0.33 to 9.0.35 in
/modules/jdbc (#2744)
---
modules/jdbc/build.gradle | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/modules/jdbc/build.gradle b/modules/jdbc/build.gradle
index aa21939c769..1cfdeab73b2 100644
--- a/modules/jdbc/build.gradle
+++ b/modules/jdbc/build.gradle
@@ -6,7 +6,7 @@ dependencies {
testCompile 'commons-dbutils:commons-dbutils:1.7'
testCompile 'org.vibur:vibur-dbcp:25.0'
- testCompile 'org.apache.tomcat:tomcat-jdbc:9.0.33'
+ testCompile 'org.apache.tomcat:tomcat-jdbc:9.0.35'
testCompile 'com.zaxxer:HikariCP-java6:2.3.13'
testCompile 'com.googlecode.junit-toolbox:junit-toolbox:2.4'
}
From 6b6feeb39baf0328628925821bbb40a90e7dafbd Mon Sep 17 00:00:00 2001
From: "dependabot-preview[bot]"
<27856297+dependabot-preview[bot]@users.noreply.github.com>
Date: Sat, 16 May 2020 21:51:05 +0100
Subject: [PATCH 0109/4341] Bump tomcat-jdbc from 9.0.33 to 9.0.35 in
/modules/jdbc-test (#2752)
---
modules/jdbc-test/build.gradle | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/modules/jdbc-test/build.gradle b/modules/jdbc-test/build.gradle
index df9c26fcd72..eb3e4ed222d 100644
--- a/modules/jdbc-test/build.gradle
+++ b/modules/jdbc-test/build.gradle
@@ -15,7 +15,7 @@ dependencies {
}
compile 'commons-dbutils:commons-dbutils:1.7'
- compile 'org.apache.tomcat:tomcat-jdbc:9.0.33'
+ compile 'org.apache.tomcat:tomcat-jdbc:9.0.35'
compile 'org.vibur:vibur-dbcp:25.0'
compile 'mysql:mysql-connector-java:8.0.19'
}
From 2a9b875fcad74251abad8c7b874714ad17e9082e Mon Sep 17 00:00:00 2001
From: "dependabot-preview[bot]"
<27856297+dependabot-preview[bot]@users.noreply.github.com>
Date: Sat, 16 May 2020 21:51:19 +0100
Subject: [PATCH 0110/4341] Bump mysql-connector-java from 8.0.19 to 8.0.20 in
/modules/jdbc-test (#2750)
---
modules/jdbc-test/build.gradle | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/modules/jdbc-test/build.gradle b/modules/jdbc-test/build.gradle
index eb3e4ed222d..23564279332 100644
--- a/modules/jdbc-test/build.gradle
+++ b/modules/jdbc-test/build.gradle
@@ -17,5 +17,5 @@ dependencies {
compile 'commons-dbutils:commons-dbutils:1.7'
compile 'org.apache.tomcat:tomcat-jdbc:9.0.35'
compile 'org.vibur:vibur-dbcp:25.0'
- compile 'mysql:mysql-connector-java:8.0.19'
+ compile 'mysql:mysql-connector-java:8.0.20'
}
From 3bdd665048b3a7f13d6c2acf75f687a4f076f50a Mon Sep 17 00:00:00 2001
From: Richard North
Date: Sun, 17 May 2020 06:45:03 +0100
Subject: [PATCH 0111/4341] Add gradle.properties to examples to enable caching
---
examples/gradle.properties | 2 ++
1 file changed, 2 insertions(+)
create mode 100644 examples/gradle.properties
diff --git a/examples/gradle.properties b/examples/gradle.properties
new file mode 100644
index 00000000000..dad41a4425a
--- /dev/null
+++ b/examples/gradle.properties
@@ -0,0 +1,2 @@
+org.gradle.parallel=false
+org.gradle.caching=true
From 4450294c6cd2a01233f1baa2ba9723c5c1c2ef54 Mon Sep 17 00:00:00 2001
From: "dependabot-preview[bot]"
<27856297+dependabot-preview[bot]@users.noreply.github.com>
Date: Sun, 17 May 2020 07:17:43 +0100
Subject: [PATCH 0112/4341] Bump aws-java-sdk-s3 from 1.11.782 to 1.11.784 in
/modules/localstack (#2747)
---
modules/localstack/build.gradle | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/modules/localstack/build.gradle b/modules/localstack/build.gradle
index 3f88f41c176..67b9d6e79f8 100644
--- a/modules/localstack/build.gradle
+++ b/modules/localstack/build.gradle
@@ -3,7 +3,7 @@ description = "Testcontainers :: Localstack"
dependencies {
compile project(':testcontainers')
- compileOnly 'com.amazonaws:aws-java-sdk-s3:1.11.782'
+ compileOnly 'com.amazonaws:aws-java-sdk-s3:1.11.784'
testCompile 'com.amazonaws:aws-java-sdk-s3:1.11.782'
testCompile 'com.amazonaws:aws-java-sdk-sqs:1.11.782'
testCompile 'com.amazonaws:aws-java-sdk-logs:1.11.782'
From a1a8c4c212587692fcf64dd9cd0b8336a7aff4ea Mon Sep 17 00:00:00 2001
From: "dependabot-preview[bot]"
<27856297+dependabot-preview[bot]@users.noreply.github.com>
Date: Sun, 17 May 2020 07:35:37 +0100
Subject: [PATCH 0113/4341] Bump aws-java-sdk-sqs from 1.11.782 to 1.11.784 in
/modules/localstack (#2746)
---
modules/localstack/build.gradle | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/modules/localstack/build.gradle b/modules/localstack/build.gradle
index 67b9d6e79f8..9b4133c6d4d 100644
--- a/modules/localstack/build.gradle
+++ b/modules/localstack/build.gradle
@@ -5,7 +5,7 @@ dependencies {
compileOnly 'com.amazonaws:aws-java-sdk-s3:1.11.784'
testCompile 'com.amazonaws:aws-java-sdk-s3:1.11.782'
- testCompile 'com.amazonaws:aws-java-sdk-sqs:1.11.782'
+ testCompile 'com.amazonaws:aws-java-sdk-sqs:1.11.784'
testCompile 'com.amazonaws:aws-java-sdk-logs:1.11.782'
testCompile 'software.amazon.awssdk:s3:2.13.16'
}
From 0fafaa909e5b2f434b5846dfc8719d0460cac779 Mon Sep 17 00:00:00 2001
From: "dependabot-preview[bot]"
<27856297+dependabot-preview[bot]@users.noreply.github.com>
Date: Sun, 17 May 2020 07:35:45 +0100
Subject: [PATCH 0114/4341] Bump solr-solrj from 8.3.0 to 8.5.1 in /examples
(#2749)
---
examples/solr-container/build.gradle | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/examples/solr-container/build.gradle b/examples/solr-container/build.gradle
index 62ed7d1153a..7e9b7a8c71f 100644
--- a/examples/solr-container/build.gradle
+++ b/examples/solr-container/build.gradle
@@ -10,7 +10,7 @@ dependencies {
compileOnly "org.projectlombok:lombok:1.18.10"
annotationProcessor "org.projectlombok:lombok:1.18.10"
- implementation 'org.apache.solr:solr-solrj:8.3.0'
+ implementation 'org.apache.solr:solr-solrj:8.5.1'
testImplementation 'org.testcontainers:testcontainers'
testImplementation 'org.testcontainers:solr'
From f88eb3f4f28b5b74bdb725e143a9db89c72afbfb Mon Sep 17 00:00:00 2001
From: "dependabot-preview[bot]"
<27856297+dependabot-preview[bot]@users.noreply.github.com>
Date: Sun, 17 May 2020 07:35:56 +0100
Subject: [PATCH 0115/4341] Bump org.springframework.boot from 2.2.7.RELEASE to
2.3.0.RELEASE in /examples (#2753)
---
examples/selenium-container/build.gradle | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/examples/selenium-container/build.gradle b/examples/selenium-container/build.gradle
index 04888a55c65..49e015f1af3 100644
--- a/examples/selenium-container/build.gradle
+++ b/examples/selenium-container/build.gradle
@@ -1,6 +1,6 @@
plugins {
id 'java'
- id 'org.springframework.boot' version '2.2.7.RELEASE'
+ id 'org.springframework.boot' version '2.3.0.RELEASE'
}
apply plugin: 'io.spring.dependency-management'
From eb30647d19ceb87c0303e40341a4dd6dd28f9c81 Mon Sep 17 00:00:00 2001
From: "dependabot-preview[bot]"
<27856297+dependabot-preview[bot]@users.noreply.github.com>
Date: Sun, 17 May 2020 07:36:08 +0100
Subject: [PATCH 0116/4341] Bump s3 from 2.13.16 to 2.13.18 in
/modules/localstack (#2748)
---
modules/localstack/build.gradle | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/modules/localstack/build.gradle b/modules/localstack/build.gradle
index 9b4133c6d4d..482b977792d 100644
--- a/modules/localstack/build.gradle
+++ b/modules/localstack/build.gradle
@@ -7,5 +7,5 @@ dependencies {
testCompile 'com.amazonaws:aws-java-sdk-s3:1.11.782'
testCompile 'com.amazonaws:aws-java-sdk-sqs:1.11.784'
testCompile 'com.amazonaws:aws-java-sdk-logs:1.11.782'
- testCompile 'software.amazon.awssdk:s3:2.13.16'
+ testCompile 'software.amazon.awssdk:s3:2.13.18'
}
From 206c5f65482475e14e9fc1eba5edd7d20ae25aea Mon Sep 17 00:00:00 2001
From: "Roman S.A"
Date: Thu, 21 May 2020 18:36:24 +0300
Subject: [PATCH 0117/4341] Added additional url params in
JdbcDatabaseContainer (#1802) (#1874)
---
.../containers/ClickHouseContainer.java | 4 +
.../containers/CockroachContainer.java | 4 +-
.../cockroachdb/SimpleCockroachDBTest.java | 20 +++++
.../containers/Db2Container.java | 4 +-
.../junit/db2/SimpleDb2Test.java | 15 ++++
.../containers/JdbcDatabaseContainer.java | 23 +++++
.../containers/MariaDBContainer.java | 4 +-
.../junit/mariadb/SimpleMariaDBTest.java | 20 +++++
.../containers/MSSQLServerContainer.java | 3 +-
.../mssqlserver/SimpleMSSQLServerTest.java | 16 ++++
.../containers/MySQLContainer.java | 6 +-
.../junit/mysql/SimpleMySQLTest.java | 83 ++++++++++++++++++-
.../containers/OracleContainer.java | 5 ++
.../containers/PostgreSQLContainer.java | 24 ++----
.../PostgreSQLConnectionURLTest.java | 2 +-
.../postgresql/SimplePostgreSQLTest.java | 15 ++++
16 files changed, 222 insertions(+), 26 deletions(-)
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 4d4ea2d11a9..10c0e1835c2 100644
--- a/modules/clickhouse/src/main/java/org/testcontainers/containers/ClickHouseContainer.java
+++ b/modules/clickhouse/src/main/java/org/testcontainers/containers/ClickHouseContainer.java
@@ -66,4 +66,8 @@ public String getTestQueryString() {
return TEST_QUERY;
}
+ @Override
+ public ClickHouseContainer withUrlParam(String paramName, String paramValue) {
+ throw new UnsupportedOperationException("The ClickHouse does not support this");
+ }
}
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 3768ca7a008..de64902c88a 100644
--- a/modules/cockroachdb/src/main/java/org/testcontainers/containers/CockroachContainer.java
+++ b/modules/cockroachdb/src/main/java/org/testcontainers/containers/CockroachContainer.java
@@ -43,7 +43,9 @@ public String getDriverClassName() {
@Override
public String getJdbcUrl() {
- return JDBC_URL_PREFIX + "://" + getHost() + ":" + getMappedPort(DB_PORT) + "/" + databaseName;
+ String additionalUrlParams = constructUrlParameters("?", "&");
+ return JDBC_URL_PREFIX + "://" + getHost() + ":" + getMappedPort(DB_PORT) +
+ "/" + databaseName + additionalUrlParams;
}
@Override
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 7c62b2f6bcf..14fe20222a3 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
@@ -9,6 +9,8 @@
import java.util.logging.Level;
import java.util.logging.LogManager;
+import static org.hamcrest.CoreMatchers.containsString;
+import static org.junit.Assert.assertThat;
import static org.rnorth.visibleassertions.VisibleAssertions.assertEquals;
public class SimpleCockroachDBTest extends AbstractContainerDatabaseTest {
@@ -42,4 +44,22 @@ public void testExplicitInitScript() throws SQLException {
assertEquals("Value from init script should equal real value", "hello world", firstColumnValue);
}
}
+
+ @Test
+ public void testWithAdditionalUrlParamInJdbcUrl() {
+ CockroachContainer cockroach = new CockroachContainer()
+ .withUrlParam("sslmode", "disable")
+ .withUrlParam("application_name", "cockroach");
+
+ try {
+ cockroach.start();
+ String jdbcUrl = cockroach.getJdbcUrl();
+ assertThat(jdbcUrl, containsString("?"));
+ assertThat(jdbcUrl, containsString("&"));
+ assertThat(jdbcUrl, containsString("sslmode=disable"));
+ assertThat(jdbcUrl, containsString("application_name=cockroach"));
+ } finally {
+ cockroach.stop();
+ }
+ }
}
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 b1472b21c6c..05edcb2c3ed 100644
--- a/modules/db2/src/main/java/org/testcontainers/containers/Db2Container.java
+++ b/modules/db2/src/main/java/org/testcontainers/containers/Db2Container.java
@@ -73,7 +73,9 @@ public String getDriverClassName() {
@Override
public String getJdbcUrl() {
- return "jdbc:db2://" + getHost() + ":" + getMappedPort(DB2_PORT) + "/" + databaseName;
+ String additionalUrlParams = constructUrlParameters(":", ";", ";");
+ return "jdbc:db2://" + getHost() + ":" + getMappedPort(DB2_PORT) +
+ "/" + databaseName + additionalUrlParams;
}
@Override
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 08f427cf12b..6cc7535f785 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
@@ -7,6 +7,8 @@
import java.sql.ResultSet;
import java.sql.SQLException;
+import static org.hamcrest.CoreMatchers.containsString;
+import static org.junit.Assert.assertThat;
import static org.rnorth.visibleassertions.VisibleAssertions.assertEquals;
public class SimpleDb2Test extends AbstractContainerDatabaseTest {
@@ -24,4 +26,17 @@ public void testSimple() throws SQLException {
assertEquals("A basic SELECT query succeeds", 1, resultSetInt);
}
}
+
+ @Test
+ public void testWithAdditionalUrlParamInJdbcUrl() {
+ try (Db2Container db2 = new Db2Container()
+ .withUrlParam("sslConnection", "false")
+ .acceptLicense()) {
+
+ db2.start();
+
+ String jdbcUrl = db2.getJdbcUrl();
+ assertThat(jdbcUrl, containsString(":sslConnection=false;"));
+ }
+ }
}
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 36a6461aa74..6c265bc6943 100644
--- a/modules/jdbc/src/main/java/org/testcontainers/containers/JdbcDatabaseContainer.java
+++ b/modules/jdbc/src/main/java/org/testcontainers/containers/JdbcDatabaseContainer.java
@@ -2,6 +2,7 @@
import com.github.dockerjava.api.command.InspectContainerResponse;
import lombok.NonNull;
+import org.apache.commons.lang.StringUtils;
import org.jetbrains.annotations.NotNull;
import org.testcontainers.containers.traits.LinkableContainer;
import org.testcontainers.delegate.DatabaseDelegate;
@@ -17,6 +18,8 @@
import java.util.Properties;
import java.util.concurrent.Future;
+import static java.util.stream.Collectors.joining;
+
/**
* Base class for containers that expose a JDBC connection
*
@@ -28,6 +31,7 @@ public abstract class JdbcDatabaseContainer parameters = new HashMap<>();
+ protected Map urlParameters = new HashMap<>();
private int startupTimeoutSeconds = 120;
private int connectTimeoutSeconds = 120;
@@ -82,7 +86,11 @@ public SELF withPassword(String password) {
public SELF withDatabaseName(String dbName) {
throw new UnsupportedOperationException();
+ }
+ public SELF withUrlParam(String paramName, String paramValue) {
+ urlParameters.put(paramName, paramValue);
+ return self();
}
/**
@@ -223,6 +231,21 @@ protected String constructUrlForConnection(String queryString) {
return getJdbcUrl() + queryString;
}
+ protected String constructUrlParameters(String startCharacter, String delimiter) {
+ return constructUrlParameters(startCharacter, delimiter, StringUtils.EMPTY);
+ }
+
+ protected String constructUrlParameters(String startCharacter, String delimiter, String endCharacter) {
+ String urlParameters = "";
+ if (!this.urlParameters.isEmpty()) {
+ String additionalParameters = this.urlParameters.entrySet().stream()
+ .map(Object::toString)
+ .collect(joining(delimiter));
+ urlParameters = startCharacter + additionalParameters + endCharacter;
+ }
+ return urlParameters;
+ }
+
protected void optionallyMapResourceParameterAsVolume(@NotNull String paramName, @NotNull String pathNameInContainer, @NotNull String defaultResource) {
String resourceName = parameters.getOrDefault(paramName, defaultResource);
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 1b4cb3344e4..04d745a9efe 100644
--- a/modules/mariadb/src/main/java/org/testcontainers/containers/MariaDBContainer.java
+++ b/modules/mariadb/src/main/java/org/testcontainers/containers/MariaDBContainer.java
@@ -60,7 +60,9 @@ public String getDriverClassName() {
@Override
public String getJdbcUrl() {
- return "jdbc:mariadb://" + getHost() + ":" + getMappedPort(MARIADB_PORT) + "/" + databaseName;
+ String additionalUrlParams = constructUrlParameters("?", "&");
+ return "jdbc:mariadb://" + getHost() + ":" + getMappedPort(MARIADB_PORT) +
+ "/" + databaseName + additionalUrlParams;
}
@Override
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 646fbb40947..af503ce424b 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
@@ -8,6 +8,8 @@
import java.sql.ResultSet;
import java.sql.SQLException;
+import static org.hamcrest.CoreMatchers.containsString;
+import static org.junit.Assert.assertThat;
import static org.junit.Assume.assumeFalse;
import static org.rnorth.visibleassertions.VisibleAssertions.assertEquals;
import static org.rnorth.visibleassertions.VisibleAssertions.assertTrue;
@@ -68,4 +70,22 @@ public void testMariaDBWithCommandOverride() throws SQLException {
assertEquals("Auto increment increment should be overriden by command line", "10", result);
}
}
+
+ @Test
+ public void testWithAdditionalUrlParamInJdbcUrl() {
+ MariaDBContainer mariaDBContainer = (MariaDBContainer) new MariaDBContainer()
+ .withUrlParam("connectTimeout", "40000")
+ .withUrlParam("rewriteBatchedStatements", "true");
+
+ try {
+ mariaDBContainer.start();
+ String jdbcUrl = mariaDBContainer.getJdbcUrl();
+ assertThat(jdbcUrl, containsString("?"));
+ assertThat(jdbcUrl, containsString("&"));
+ assertThat(jdbcUrl, containsString("rewriteBatchedStatements=true"));
+ assertThat(jdbcUrl, containsString("connectTimeout=40000"));
+ } finally {
+ mariaDBContainer.stop();
+ }
+ }
}
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 631228aeef2..b500e6fddf0 100644
--- a/modules/mssqlserver/src/main/java/org/testcontainers/containers/MSSQLServerContainer.java
+++ b/modules/mssqlserver/src/main/java/org/testcontainers/containers/MSSQLServerContainer.java
@@ -62,7 +62,8 @@ public String getDriverClassName() {
@Override
public String getJdbcUrl() {
- return "jdbc:sqlserver://" + getHost() + ":" + getMappedPort(MS_SQL_SERVER_PORT);
+ String additionalUrlParams = constructUrlParameters(";", ";");
+ return "jdbc:sqlserver://" + getHost() + ":" + getMappedPort(MS_SQL_SERVER_PORT) + additionalUrlParams;
}
@Override
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 c1699d2473a..71e12a6d864 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
@@ -9,6 +9,8 @@
import java.sql.SQLException;
import java.sql.Statement;
+import static org.hamcrest.CoreMatchers.containsString;
+import static org.junit.Assert.assertThat;
import static org.rnorth.visibleassertions.VisibleAssertions.assertEquals;
public class SimpleMSSQLServerTest extends AbstractContainerDatabaseTest {
@@ -24,6 +26,20 @@ public void testSimple() throws SQLException {
}
}
+ @Test
+ public void testWithAdditionalUrlParamInJdbcUrl() {
+ try (MSSQLServerContainer> mssqlServer = new MSSQLServerContainer<>()
+ .withUrlParam("integratedSecurity", "false")
+ .withUrlParam("applicationName", "MyApp")) {
+
+ mssqlServer.start();
+
+ String jdbcUrl = mssqlServer.getJdbcUrl();
+ assertThat(jdbcUrl, containsString(";integratedSecurity=false;applicationName=MyApp"));
+ }
+ }
+
+
@Test
public void testSetupDatabase() throws SQLException {
try (MSSQLServerContainer> mssqlServer = new MSSQLServerContainer<>()) {
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 79d29234b99..1ef574cbd5e 100644
--- a/modules/mysql/src/main/java/org/testcontainers/containers/MySQLContainer.java
+++ b/modules/mysql/src/main/java/org/testcontainers/containers/MySQLContainer.java
@@ -5,6 +5,8 @@
import java.util.HashSet;
import java.util.Set;
+import static java.util.stream.Collectors.joining;
+
/**
* @author richardnorth
*/
@@ -70,7 +72,9 @@ public String getDriverClassName() {
@Override
public String getJdbcUrl() {
- return "jdbc:mysql://" + getHost() + ":" + getMappedPort(MYSQL_PORT) + "/" + databaseName;
+ String additionalUrlParams = constructUrlParameters("?", "&");
+ return "jdbc:mysql://" + getHost() + ":" + getMappedPort(MYSQL_PORT) +
+ "/" + databaseName + additionalUrlParams;
}
@Override
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 ee6c3ab6993..6d6f8d26453 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
@@ -9,9 +9,17 @@
import org.testcontainers.containers.output.Slf4jLogConsumer;
import org.testcontainers.db.AbstractContainerDatabaseTest;
+import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
-
+import java.sql.Statement;
+import java.time.LocalDateTime;
+import java.time.ZoneId;
+import java.time.ZonedDateTime;
+import java.time.temporal.ChronoUnit;
+
+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;
@@ -142,4 +150,77 @@ public void testEmptyPasswordWithRootUser() throws SQLException {
assertEquals("A basic SELECT query succeeds", 1, resultSetInt);
}
}
+
+ @Test
+ public void testWithAdditionalUrlParamTimeZone() throws SQLException {
+ MySQLContainer mysql = (MySQLContainer) new MySQLContainer()
+ .withUrlParam("serverTimezone", "Europe/Zurich")
+ .withEnv("TZ", "Europe/Zurich")
+ .withLogConsumer(new Slf4jLogConsumer(logger));
+ mysql.start();
+
+ try(Connection connection = mysql.createConnection("")) {
+ Statement statement = connection.createStatement();
+ statement.execute("SELECT NOW();");
+ try (ResultSet resultSet = statement.getResultSet()) {
+ resultSet.next();
+
+ // checking that the time_zone MySQL is Europe/Zurich
+ LocalDateTime localDateTime = resultSet.getObject(1, LocalDateTime.class);
+ ZonedDateTime actualDateTime = localDateTime.atZone(ZoneId.of("Europe/Zurich"))
+ .truncatedTo(ChronoUnit.MINUTES);
+ ZonedDateTime expectedDateTime = ZonedDateTime.now(ZoneId.of("Europe/Zurich"))
+ .truncatedTo(ChronoUnit.MINUTES);
+
+ String message = String.format("MySQL time zone is not Europe/Zurich. MySQL date:%s, current date:%s",
+ actualDateTime, expectedDateTime);
+ assertTrue(message, actualDateTime.equals(expectedDateTime));
+ }
+ } finally {
+ mysql.stop();
+ }
+ }
+
+ @Test
+ public void testWithAdditionalUrlParamMultiQueries() throws SQLException {
+ MySQLContainer mysql = (MySQLContainer) new MySQLContainer()
+ .withUrlParam("allowMultiQueries", "true")
+ .withLogConsumer(new Slf4jLogConsumer(logger));
+ mysql.start();
+
+ try(Connection connection = mysql.createConnection("")) {
+ Statement statement = connection.createStatement();
+ String multiQuery = "DROP TABLE IF EXISTS bar; " +
+ "CREATE TABLE bar (foo VARCHAR(20)); " +
+ "INSERT INTO bar (foo) VALUES ('hello world');";
+ statement.execute(multiQuery);
+ statement.execute("SELECT foo FROM bar;");
+ try(ResultSet resultSet = statement.getResultSet()) {
+ resultSet.next();
+ String firstColumnValue = resultSet.getString(1);
+ assertEquals("Value from bar should equal real value", "hello world", firstColumnValue);
+ }
+ } finally {
+ mysql.stop();
+ }
+ }
+
+ @Test
+ public void testWithAdditionalUrlParamInJdbcUrl() {
+ MySQLContainer mysql = (MySQLContainer) new MySQLContainer()
+ .withUrlParam("allowMultiQueries", "true")
+ .withUrlParam("rewriteBatchedStatements", "true")
+ .withLogConsumer(new Slf4jLogConsumer(logger));
+
+ try {
+ mysql.start();
+ String jdbcUrl = mysql.getJdbcUrl();
+ assertThat(jdbcUrl, containsString("?"));
+ assertThat(jdbcUrl, containsString("&"));
+ assertThat(jdbcUrl, containsString("rewriteBatchedStatements=true"));
+ assertThat(jdbcUrl, containsString("allowMultiQueries=true"));
+ } finally {
+ mysql.stop();
+ }
+ }
}
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 60603a7e222..d263a141d4f 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
@@ -89,6 +89,11 @@ public OracleContainer withPassword(String password) {
return self();
}
+ @Override
+ public OracleContainer withUrlParam(String paramName, String paramValue) {
+ throw new UnsupportedOperationException("The OracleDb does not support this");
+ }
+
@SuppressWarnings("SameReturnValue")
public String getSid() {
return "xe";
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 8634f9d70fa..6ba7390878e 100644
--- a/modules/postgresql/src/main/java/org/testcontainers/containers/PostgreSQLContainer.java
+++ b/modules/postgresql/src/main/java/org/testcontainers/containers/PostgreSQLContainer.java
@@ -55,6 +55,8 @@ protected Set getLivenessCheckPorts() {
@Override
protected void configure() {
+ // Disable Postgres driver use of java.util.logging to reduce noise at startup time
+ withUrlParam("loggerLevel", "OFF");
addEnv("POSTGRES_DB", databaseName);
addEnv("POSTGRES_USER", username);
addEnv("POSTGRES_PASSWORD", password);
@@ -67,25 +69,9 @@ public String getDriverClassName() {
@Override
public String getJdbcUrl() {
- // Disable Postgres driver use of java.util.logging to reduce noise at startup time
- return format("jdbc:postgresql://%s:%d/%s?loggerLevel=OFF", getHost(), getMappedPort(POSTGRESQL_PORT), databaseName);
- }
-
- @Override
- protected String constructUrlForConnection(String queryString) {
- String baseUrl = getJdbcUrl();
-
- if ("".equals(queryString)) {
- return baseUrl;
- }
-
- if (!queryString.startsWith("?")) {
- throw new IllegalArgumentException("The '?' character must be included");
- }
-
- return baseUrl.contains("?")
- ? baseUrl + QUERY_PARAM_SEPARATOR + queryString.substring(1)
- : baseUrl + queryString;
+ String additionalUrlParams = constructUrlParameters("?", "&");
+ return "jdbc:postgresql://" + getContainerIpAddress() + ":" + getMappedPort(POSTGRESQL_PORT)
+ + "/" + databaseName + additionalUrlParams;
}
@Override
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 05f6ea204a8..c0ba7e40d44 100644
--- a/modules/postgresql/src/test/java/org/testcontainers/containers/PostgreSQLConnectionURLTest.java
+++ b/modules/postgresql/src/test/java/org/testcontainers/containers/PostgreSQLConnectionURLTest.java
@@ -15,7 +15,7 @@ public void shouldCorrectlyAppendQueryString() {
String connectionUrl = postgres.constructUrlForConnection("?stringtype=unspecified&stringtype=unspecified");
String queryString = connectionUrl.substring(connectionUrl.indexOf('?'));
- assertTrue("Query String contains expected params", queryString.contains("&stringtype=unspecified&stringtype=unspecified"));
+ assertTrue("Query String contains expected params", queryString.contains("?stringtype=unspecified&stringtype=unspecified"));
assertEquals("Query String starts with '?'", 0, queryString.indexOf('?'));
assertFalse("Query String does not contain extra '?'", queryString.substring(1).contains("?"));
}
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 9c97f51e64e..36ece03b604 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
@@ -9,6 +9,8 @@
import java.util.logging.Level;
import java.util.logging.LogManager;
+import static org.hamcrest.CoreMatchers.containsString;
+import static org.junit.Assert.assertThat;
import static org.rnorth.visibleassertions.VisibleAssertions.assertEquals;
import static org.rnorth.visibleassertions.VisibleAssertions.assertNotEquals;
@@ -63,4 +65,17 @@ public void testExplicitInitScript() throws SQLException {
assertEquals("Value from init script should equal real value", "hello world", firstColumnValue);
}
}
+
+ @Test
+ public void testWithAdditionalUrlParamInJdbcUrl() {
+ try (PostgreSQLContainer postgres = new PostgreSQLContainer<>()
+ .withUrlParam("charSet", "UNICODE")) {
+
+ postgres.start();
+ String jdbcUrl = postgres.getJdbcUrl();
+ assertThat(jdbcUrl, containsString("?"));
+ assertThat(jdbcUrl, containsString("&"));
+ assertThat(jdbcUrl, containsString("charSet=UNICODE"));
+ }
+ }
}
From c0fc42ff60bdf639ce28ab6dc3d97117548f1e0a Mon Sep 17 00:00:00 2001
From: vcvitaly
Date: Thu, 21 May 2020 20:02:23 +0300
Subject: [PATCH 0118/4341] Add docs for startup strategy information/examples
(#1157) (#2565)
* Add startup strategy information/examples to mkdocs #1157
* Update docs/examples/junit4/generic/src/test/java/org/testcontainers/containers/startupcheck/StartupCheckStrategyTest.java
Co-authored-by: Sergei Egorov
Co-authored-by: Richard North
---
docs/examples/junit4/generic/build.gradle | 1 +
.../StartupCheckStrategyTest.java | 90 +++++++++++++++++++
docs/features/startup_and_waits.md | 49 ++++++++++
3 files changed, 140 insertions(+)
create mode 100644 docs/examples/junit4/generic/src/test/java/org/testcontainers/containers/startupcheck/StartupCheckStrategyTest.java
diff --git a/docs/examples/junit4/generic/build.gradle b/docs/examples/junit4/generic/build.gradle
index 97902d5d9ca..5ce878c7ba2 100644
--- a/docs/examples/junit4/generic/build.gradle
+++ b/docs/examples/junit4/generic/build.gradle
@@ -5,4 +5,5 @@ dependencies {
testCompile project(":testcontainers")
testCompile project(":selenium")
testCompile "org.seleniumhq.selenium:selenium-api:3.141.59"
+ testCompile 'org.assertj:assertj-core:3.15.0'
}
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
new file mode 100644
index 00000000000..5ab32919bb2
--- /dev/null
+++ b/docs/examples/junit4/generic/src/test/java/org/testcontainers/containers/startupcheck/StartupCheckStrategyTest.java
@@ -0,0 +1,90 @@
+package org.testcontainers.containers.startupcheck;
+
+import java.time.Duration;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
+import lombok.SneakyThrows;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Suite;
+import org.testcontainers.containers.GenericContainer;
+import org.testcontainers.containers.output.WaitingConsumer;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.testcontainers.containers.output.OutputFrame.OutputType.STDOUT;
+import static org.testcontainers.containers.startupcheck.StartupCheckStrategyTest.IndefiniteOneShotStrategyTest;
+import static org.testcontainers.containers.startupcheck.StartupCheckStrategyTest.MinimumDurationStrategyTest;
+import static org.testcontainers.containers.startupcheck.StartupCheckStrategyTest.OneShotStrategyTest;
+
+@RunWith(Suite.class)
+@Suite.SuiteClasses({OneShotStrategyTest.class, IndefiniteOneShotStrategyTest.class, MinimumDurationStrategyTest.class})
+public class StartupCheckStrategyTest {
+
+ private static final String HELLO_TESTCONTAINERS = "Hello Testcontainers!";
+
+ private static void waitForHello(GenericContainer container) throws TimeoutException {
+ WaitingConsumer consumer = new WaitingConsumer();
+ container.followOutput(consumer, STDOUT);
+
+ consumer.waitUntil(frame ->
+ frame.getUtf8String().contains(HELLO_TESTCONTAINERS), 30, TimeUnit.SECONDS);
+ }
+
+ public static class OneShotStrategyTest {
+ @Rule
+ // withOneShotStrategy {
+ public GenericContainer bboxWithOneShot = new GenericContainer("busybox:1.31.1")
+ .withCommand(String.format("echo %s", HELLO_TESTCONTAINERS))
+ .withStartupCheckStrategy(
+ new OneShotStartupCheckStrategy().withTimeout(Duration.ofSeconds(3))
+ );
+ // }
+
+ @SneakyThrows
+ @Test
+ public void testCommandIsExecuted() {
+ waitForHello(bboxWithOneShot);
+
+ assertThat(bboxWithOneShot.isRunning()).isFalse();
+ }
+ }
+
+ public static class IndefiniteOneShotStrategyTest {
+ @Rule
+ // withIndefiniteOneShotStrategy {
+ public GenericContainer bboxWithIndefiniteOneShot = new GenericContainer("busybox:1.31.1")
+ .withCommand("sh", "-c", String.format("sleep 5 && echo \"%s\"", HELLO_TESTCONTAINERS))
+ .withStartupCheckStrategy(
+ new IndefiniteWaitOneShotStartupCheckStrategy()
+ );
+ // }
+
+ @SneakyThrows
+ @Test
+ public void testCommandIsExecuted() {
+ waitForHello(bboxWithIndefiniteOneShot);
+
+ assertThat(bboxWithIndefiniteOneShot.isRunning()).isFalse();
+ }
+ }
+
+ public static class MinimumDurationStrategyTest {
+ @Rule
+ // withMinimumDurationStrategy {
+ public GenericContainer bboxWithMinimumDuration = new GenericContainer("busybox:1.31.1")
+ .withCommand("sh", "-c", String.format("sleep 5 && echo \"%s\"", HELLO_TESTCONTAINERS))
+ .withStartupCheckStrategy(
+ new MinimumDurationRunningStartupCheckStrategy(Duration.ofSeconds(5))
+ );
+ // }
+
+ @SneakyThrows
+ @Test
+ public void testCommandIsExecuted() {
+ waitForHello(bboxWithMinimumDuration);
+
+ assertThat(bboxWithMinimumDuration.isRunning()).isTrue();
+ }
+ }
+}
diff --git a/docs/features/startup_and_waits.md b/docs/features/startup_and_waits.md
index e1d30457e5c..3cbec97af0d 100644
--- a/docs/features/startup_and_waits.md
+++ b/docs/features/startup_and_waits.md
@@ -74,3 +74,52 @@ If none of these options meet your requirements, you can create your own subclas
appropriate wait mechanism in `waitUntilReady()`.
The `GenericContainer.waitingFor()` method accepts any valid [`WaitStrategy`](http://static.javadoc.io/org.testcontainers/testcontainers/{{ latest_version }}/org/testcontainers/containers/wait/strategy/WaitStrategy.html).
+
+## Startup check Strategies
+
+Ordinarily Testcontainers will check that the container has reached the running state and has not exited.
+In order to do that inspect is executed against the container and state parameter is extracted.
+
+All logic is implemented in [`StartupCheckStrategy`](http://static.javadoc.io/org.testcontainers/testcontainers/{{ latest_version }}/org/testcontainers/containers/startupcheck/StartupCheckStrategy.html) child classes.
+
+### Running startup strategy example
+
+This is the strategy used by default. Testcontainers just checks if container is running.
+
+Implemented in [`IsRunningStartupCheckStrategy`](http://static.javadoc.io/org.testcontainers/testcontainers/{{ latest_version }}/org/testcontainers/containers/startupcheck/IsRunningStartupCheckStrategy.html) class.
+
+### One shot startup strategy example
+
+This strategy is intended for use with containers that only run briefly and exit of their own accord. As such, success is deemed to be when
+the container has stopped with exit code 0.
+
+
+[Using one shot startup strategy](../examples/junit4/generic/src/test/java/org/testcontainers/containers/startupcheck/StartupCheckStrategyTest.java) inside_block:withOneShotStrategy
+
+
+### Indefinite one shot startup strategy example
+
+Variant of one shot strategy that does not impose a timeout. Intended for situation such as when a long running task forms part of
+ container startup.
+
+It has to be assumed that the container will stop of its own accord, either with a success or failure exit code.
+
+
+[Using indefinite one shot startup strategy](../examples/junit4/generic/src/test/java/org/testcontainers/containers/startupcheck/StartupCheckStrategyTest.java) inside_block:withIndefiniteOneShotStrategy
+
+
+### Minimum duration startup strategy example
+
+Checks that the container is running and has been running for a defined minimum period of time.
+
+
+[Using minimum duration strategy](../examples/junit4/generic/src/test/java/org/testcontainers/containers/startupcheck/StartupCheckStrategyTest.java) inside_block:withMinimumDurationStrategy
+
+
+### Other startup strategies
+
+If none of these options meet your requirements, you can create your own subclass of
+[`StartupCheckStrategy`](http://static.javadoc.io/org.testcontainers/testcontainers/{{ latest_version }}/org/testcontainers/containers
+/startupcheck/StartupCheckStrategy.html) with an appropriate startup check mechanism in `waitUntilStartupSuccessful()`.
+Or you can leave it as is and just implement the `checkStartupState(DockerClient dockerClient, String containerId)` if you still want to check state
+ periodically.
From 0385030aa4307c7041a0150edbbd2159f9060e16 Mon Sep 17 00:00:00 2001
From: Richard North
Date: Thu, 21 May 2020 19:25:02 +0100
Subject: [PATCH 0119/4341] Revert "Added additional url params in
JdbcDatabaseContainer (#1802)" (#2775)
---
.../containers/ClickHouseContainer.java | 4 -
.../containers/CockroachContainer.java | 4 +-
.../cockroachdb/SimpleCockroachDBTest.java | 20 -----
.../containers/Db2Container.java | 4 +-
.../junit/db2/SimpleDb2Test.java | 15 ----
.../containers/JdbcDatabaseContainer.java | 23 -----
.../containers/MariaDBContainer.java | 4 +-
.../junit/mariadb/SimpleMariaDBTest.java | 20 -----
.../containers/MSSQLServerContainer.java | 3 +-
.../mssqlserver/SimpleMSSQLServerTest.java | 16 ----
.../containers/MySQLContainer.java | 6 +-
.../junit/mysql/SimpleMySQLTest.java | 83 +------------------
.../containers/OracleContainer.java | 5 --
.../containers/PostgreSQLContainer.java | 24 ++++--
.../PostgreSQLConnectionURLTest.java | 2 +-
.../postgresql/SimplePostgreSQLTest.java | 15 ----
16 files changed, 26 insertions(+), 222 deletions(-)
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 10c0e1835c2..4d4ea2d11a9 100644
--- a/modules/clickhouse/src/main/java/org/testcontainers/containers/ClickHouseContainer.java
+++ b/modules/clickhouse/src/main/java/org/testcontainers/containers/ClickHouseContainer.java
@@ -66,8 +66,4 @@ public String getTestQueryString() {
return TEST_QUERY;
}
- @Override
- public ClickHouseContainer withUrlParam(String paramName, String paramValue) {
- throw new UnsupportedOperationException("The ClickHouse does not support this");
- }
}
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..3768ca7a008 100644
--- a/modules/cockroachdb/src/main/java/org/testcontainers/containers/CockroachContainer.java
+++ b/modules/cockroachdb/src/main/java/org/testcontainers/containers/CockroachContainer.java
@@ -43,9 +43,7 @@ public String getDriverClassName() {
@Override
public String getJdbcUrl() {
- String additionalUrlParams = constructUrlParameters("?", "&");
- return JDBC_URL_PREFIX + "://" + getHost() + ":" + getMappedPort(DB_PORT) +
- "/" + databaseName + additionalUrlParams;
+ return JDBC_URL_PREFIX + "://" + getHost() + ":" + getMappedPort(DB_PORT) + "/" + databaseName;
}
@Override
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..7c62b2f6bcf 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
@@ -9,8 +9,6 @@
import java.util.logging.Level;
import java.util.logging.LogManager;
-import static org.hamcrest.CoreMatchers.containsString;
-import static org.junit.Assert.assertThat;
import static org.rnorth.visibleassertions.VisibleAssertions.assertEquals;
public class SimpleCockroachDBTest extends AbstractContainerDatabaseTest {
@@ -44,22 +42,4 @@ public void testExplicitInitScript() throws SQLException {
assertEquals("Value from init script should equal real value", "hello world", firstColumnValue);
}
}
-
- @Test
- public void testWithAdditionalUrlParamInJdbcUrl() {
- CockroachContainer cockroach = new CockroachContainer()
- .withUrlParam("sslmode", "disable")
- .withUrlParam("application_name", "cockroach");
-
- try {
- cockroach.start();
- String jdbcUrl = cockroach.getJdbcUrl();
- assertThat(jdbcUrl, containsString("?"));
- assertThat(jdbcUrl, containsString("&"));
- assertThat(jdbcUrl, containsString("sslmode=disable"));
- assertThat(jdbcUrl, containsString("application_name=cockroach"));
- } finally {
- cockroach.stop();
- }
- }
}
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..b1472b21c6c 100644
--- a/modules/db2/src/main/java/org/testcontainers/containers/Db2Container.java
+++ b/modules/db2/src/main/java/org/testcontainers/containers/Db2Container.java
@@ -73,9 +73,7 @@ public String getDriverClassName() {
@Override
public String getJdbcUrl() {
- String additionalUrlParams = constructUrlParameters(":", ";", ";");
- return "jdbc:db2://" + getHost() + ":" + getMappedPort(DB2_PORT) +
- "/" + databaseName + additionalUrlParams;
+ return "jdbc:db2://" + getHost() + ":" + getMappedPort(DB2_PORT) + "/" + databaseName;
}
@Override
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..08f427cf12b 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
@@ -7,8 +7,6 @@
import java.sql.ResultSet;
import java.sql.SQLException;
-import static org.hamcrest.CoreMatchers.containsString;
-import static org.junit.Assert.assertThat;
import static org.rnorth.visibleassertions.VisibleAssertions.assertEquals;
public class SimpleDb2Test extends AbstractContainerDatabaseTest {
@@ -26,17 +24,4 @@ public void testSimple() throws SQLException {
assertEquals("A basic SELECT query succeeds", 1, resultSetInt);
}
}
-
- @Test
- public void testWithAdditionalUrlParamInJdbcUrl() {
- try (Db2Container db2 = new Db2Container()
- .withUrlParam("sslConnection", "false")
- .acceptLicense()) {
-
- db2.start();
-
- String jdbcUrl = db2.getJdbcUrl();
- assertThat(jdbcUrl, containsString(":sslConnection=false;"));
- }
- }
}
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 6c265bc6943..36a6461aa74 100644
--- a/modules/jdbc/src/main/java/org/testcontainers/containers/JdbcDatabaseContainer.java
+++ b/modules/jdbc/src/main/java/org/testcontainers/containers/JdbcDatabaseContainer.java
@@ -2,7 +2,6 @@
import com.github.dockerjava.api.command.InspectContainerResponse;
import lombok.NonNull;
-import org.apache.commons.lang.StringUtils;
import org.jetbrains.annotations.NotNull;
import org.testcontainers.containers.traits.LinkableContainer;
import org.testcontainers.delegate.DatabaseDelegate;
@@ -18,8 +17,6 @@
import java.util.Properties;
import java.util.concurrent.Future;
-import static java.util.stream.Collectors.joining;
-
/**
* Base class for containers that expose a JDBC connection
*
@@ -31,7 +28,6 @@ public abstract class JdbcDatabaseContainer parameters = new HashMap<>();
- protected Map urlParameters = new HashMap<>();
private int startupTimeoutSeconds = 120;
private int connectTimeoutSeconds = 120;
@@ -86,11 +82,7 @@ public SELF withPassword(String password) {
public SELF withDatabaseName(String dbName) {
throw new UnsupportedOperationException();
- }
- public SELF withUrlParam(String paramName, String paramValue) {
- urlParameters.put(paramName, paramValue);
- return self();
}
/**
@@ -231,21 +223,6 @@ protected String constructUrlForConnection(String queryString) {
return getJdbcUrl() + queryString;
}
- protected String constructUrlParameters(String startCharacter, String delimiter) {
- return constructUrlParameters(startCharacter, delimiter, StringUtils.EMPTY);
- }
-
- protected String constructUrlParameters(String startCharacter, String delimiter, String endCharacter) {
- String urlParameters = "";
- if (!this.urlParameters.isEmpty()) {
- String additionalParameters = this.urlParameters.entrySet().stream()
- .map(Object::toString)
- .collect(joining(delimiter));
- urlParameters = startCharacter + additionalParameters + endCharacter;
- }
- return urlParameters;
- }
-
protected void optionallyMapResourceParameterAsVolume(@NotNull String paramName, @NotNull String pathNameInContainer, @NotNull String defaultResource) {
String resourceName = parameters.getOrDefault(paramName, defaultResource);
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..1b4cb3344e4 100644
--- a/modules/mariadb/src/main/java/org/testcontainers/containers/MariaDBContainer.java
+++ b/modules/mariadb/src/main/java/org/testcontainers/containers/MariaDBContainer.java
@@ -60,9 +60,7 @@ public String getDriverClassName() {
@Override
public String getJdbcUrl() {
- String additionalUrlParams = constructUrlParameters("?", "&");
- return "jdbc:mariadb://" + getHost() + ":" + getMappedPort(MARIADB_PORT) +
- "/" + databaseName + additionalUrlParams;
+ return "jdbc:mariadb://" + getHost() + ":" + getMappedPort(MARIADB_PORT) + "/" + databaseName;
}
@Override
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..646fbb40947 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
@@ -8,8 +8,6 @@
import java.sql.ResultSet;
import java.sql.SQLException;
-import static org.hamcrest.CoreMatchers.containsString;
-import static org.junit.Assert.assertThat;
import static org.junit.Assume.assumeFalse;
import static org.rnorth.visibleassertions.VisibleAssertions.assertEquals;
import static org.rnorth.visibleassertions.VisibleAssertions.assertTrue;
@@ -70,22 +68,4 @@ public void testMariaDBWithCommandOverride() throws SQLException {
assertEquals("Auto increment increment should be overriden by command line", "10", result);
}
}
-
- @Test
- public void testWithAdditionalUrlParamInJdbcUrl() {
- MariaDBContainer mariaDBContainer = (MariaDBContainer) new MariaDBContainer()
- .withUrlParam("connectTimeout", "40000")
- .withUrlParam("rewriteBatchedStatements", "true");
-
- try {
- mariaDBContainer.start();
- String jdbcUrl = mariaDBContainer.getJdbcUrl();
- assertThat(jdbcUrl, containsString("?"));
- assertThat(jdbcUrl, containsString("&"));
- assertThat(jdbcUrl, containsString("rewriteBatchedStatements=true"));
- assertThat(jdbcUrl, containsString("connectTimeout=40000"));
- } finally {
- mariaDBContainer.stop();
- }
- }
}
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 b500e6fddf0..631228aeef2 100644
--- a/modules/mssqlserver/src/main/java/org/testcontainers/containers/MSSQLServerContainer.java
+++ b/modules/mssqlserver/src/main/java/org/testcontainers/containers/MSSQLServerContainer.java
@@ -62,8 +62,7 @@ public String getDriverClassName() {
@Override
public String getJdbcUrl() {
- String additionalUrlParams = constructUrlParameters(";", ";");
- return "jdbc:sqlserver://" + getHost() + ":" + getMappedPort(MS_SQL_SERVER_PORT) + additionalUrlParams;
+ return "jdbc:sqlserver://" + getHost() + ":" + getMappedPort(MS_SQL_SERVER_PORT);
}
@Override
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..c1699d2473a 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
@@ -9,8 +9,6 @@
import java.sql.SQLException;
import java.sql.Statement;
-import static org.hamcrest.CoreMatchers.containsString;
-import static org.junit.Assert.assertThat;
import static org.rnorth.visibleassertions.VisibleAssertions.assertEquals;
public class SimpleMSSQLServerTest extends AbstractContainerDatabaseTest {
@@ -26,20 +24,6 @@ public void testSimple() throws SQLException {
}
}
- @Test
- public void testWithAdditionalUrlParamInJdbcUrl() {
- try (MSSQLServerContainer> mssqlServer = new MSSQLServerContainer<>()
- .withUrlParam("integratedSecurity", "false")
- .withUrlParam("applicationName", "MyApp")) {
-
- mssqlServer.start();
-
- String jdbcUrl = mssqlServer.getJdbcUrl();
- assertThat(jdbcUrl, containsString(";integratedSecurity=false;applicationName=MyApp"));
- }
- }
-
-
@Test
public void testSetupDatabase() throws SQLException {
try (MSSQLServerContainer> mssqlServer = new MSSQLServerContainer<>()) {
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..79d29234b99 100644
--- a/modules/mysql/src/main/java/org/testcontainers/containers/MySQLContainer.java
+++ b/modules/mysql/src/main/java/org/testcontainers/containers/MySQLContainer.java
@@ -5,8 +5,6 @@
import java.util.HashSet;
import java.util.Set;
-import static java.util.stream.Collectors.joining;
-
/**
* @author richardnorth
*/
@@ -72,9 +70,7 @@ public String getDriverClassName() {
@Override
public String getJdbcUrl() {
- String additionalUrlParams = constructUrlParameters("?", "&");
- return "jdbc:mysql://" + getHost() + ":" + getMappedPort(MYSQL_PORT) +
- "/" + databaseName + additionalUrlParams;
+ return "jdbc:mysql://" + getHost() + ":" + getMappedPort(MYSQL_PORT) + "/" + databaseName;
}
@Override
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..ee6c3ab6993 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
@@ -9,17 +9,9 @@
import org.testcontainers.containers.output.Slf4jLogConsumer;
import org.testcontainers.db.AbstractContainerDatabaseTest;
-import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
-import java.sql.Statement;
-import java.time.LocalDateTime;
-import java.time.ZoneId;
-import java.time.ZonedDateTime;
-import java.time.temporal.ChronoUnit;
-
-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;
@@ -150,77 +142,4 @@ public void testEmptyPasswordWithRootUser() throws SQLException {
assertEquals("A basic SELECT query succeeds", 1, resultSetInt);
}
}
-
- @Test
- public void testWithAdditionalUrlParamTimeZone() throws SQLException {
- MySQLContainer mysql = (MySQLContainer) new MySQLContainer()
- .withUrlParam("serverTimezone", "Europe/Zurich")
- .withEnv("TZ", "Europe/Zurich")
- .withLogConsumer(new Slf4jLogConsumer(logger));
- mysql.start();
-
- try(Connection connection = mysql.createConnection("")) {
- Statement statement = connection.createStatement();
- statement.execute("SELECT NOW();");
- try (ResultSet resultSet = statement.getResultSet()) {
- resultSet.next();
-
- // checking that the time_zone MySQL is Europe/Zurich
- LocalDateTime localDateTime = resultSet.getObject(1, LocalDateTime.class);
- ZonedDateTime actualDateTime = localDateTime.atZone(ZoneId.of("Europe/Zurich"))
- .truncatedTo(ChronoUnit.MINUTES);
- ZonedDateTime expectedDateTime = ZonedDateTime.now(ZoneId.of("Europe/Zurich"))
- .truncatedTo(ChronoUnit.MINUTES);
-
- String message = String.format("MySQL time zone is not Europe/Zurich. MySQL date:%s, current date:%s",
- actualDateTime, expectedDateTime);
- assertTrue(message, actualDateTime.equals(expectedDateTime));
- }
- } finally {
- mysql.stop();
- }
- }
-
- @Test
- public void testWithAdditionalUrlParamMultiQueries() throws SQLException {
- MySQLContainer mysql = (MySQLContainer) new MySQLContainer()
- .withUrlParam("allowMultiQueries", "true")
- .withLogConsumer(new Slf4jLogConsumer(logger));
- mysql.start();
-
- try(Connection connection = mysql.createConnection("")) {
- Statement statement = connection.createStatement();
- String multiQuery = "DROP TABLE IF EXISTS bar; " +
- "CREATE TABLE bar (foo VARCHAR(20)); " +
- "INSERT INTO bar (foo) VALUES ('hello world');";
- statement.execute(multiQuery);
- statement.execute("SELECT foo FROM bar;");
- try(ResultSet resultSet = statement.getResultSet()) {
- resultSet.next();
- String firstColumnValue = resultSet.getString(1);
- assertEquals("Value from bar should equal real value", "hello world", firstColumnValue);
- }
- } finally {
- mysql.stop();
- }
- }
-
- @Test
- public void testWithAdditionalUrlParamInJdbcUrl() {
- MySQLContainer mysql = (MySQLContainer) new MySQLContainer()
- .withUrlParam("allowMultiQueries", "true")
- .withUrlParam("rewriteBatchedStatements", "true")
- .withLogConsumer(new Slf4jLogConsumer(logger));
-
- try {
- mysql.start();
- String jdbcUrl = mysql.getJdbcUrl();
- assertThat(jdbcUrl, containsString("?"));
- assertThat(jdbcUrl, containsString("&"));
- assertThat(jdbcUrl, containsString("rewriteBatchedStatements=true"));
- assertThat(jdbcUrl, containsString("allowMultiQueries=true"));
- } finally {
- mysql.stop();
- }
- }
}
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..60603a7e222 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
@@ -89,11 +89,6 @@ public OracleContainer withPassword(String password) {
return self();
}
- @Override
- public OracleContainer withUrlParam(String paramName, String paramValue) {
- throw new UnsupportedOperationException("The OracleDb does not support this");
- }
-
@SuppressWarnings("SameReturnValue")
public String getSid() {
return "xe";
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 6ba7390878e..8634f9d70fa 100644
--- a/modules/postgresql/src/main/java/org/testcontainers/containers/PostgreSQLContainer.java
+++ b/modules/postgresql/src/main/java/org/testcontainers/containers/PostgreSQLContainer.java
@@ -55,8 +55,6 @@ protected Set getLivenessCheckPorts() {
@Override
protected void configure() {
- // Disable Postgres driver use of java.util.logging to reduce noise at startup time
- withUrlParam("loggerLevel", "OFF");
addEnv("POSTGRES_DB", databaseName);
addEnv("POSTGRES_USER", username);
addEnv("POSTGRES_PASSWORD", password);
@@ -69,9 +67,25 @@ public String getDriverClassName() {
@Override
public String getJdbcUrl() {
- String additionalUrlParams = constructUrlParameters("?", "&");
- return "jdbc:postgresql://" + getContainerIpAddress() + ":" + getMappedPort(POSTGRESQL_PORT)
- + "/" + databaseName + additionalUrlParams;
+ // Disable Postgres driver use of java.util.logging to reduce noise at startup time
+ return format("jdbc:postgresql://%s:%d/%s?loggerLevel=OFF", getHost(), getMappedPort(POSTGRESQL_PORT), databaseName);
+ }
+
+ @Override
+ protected String constructUrlForConnection(String queryString) {
+ String baseUrl = getJdbcUrl();
+
+ if ("".equals(queryString)) {
+ return baseUrl;
+ }
+
+ if (!queryString.startsWith("?")) {
+ throw new IllegalArgumentException("The '?' character must be included");
+ }
+
+ return baseUrl.contains("?")
+ ? baseUrl + QUERY_PARAM_SEPARATOR + queryString.substring(1)
+ : baseUrl + queryString;
}
@Override
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..05f6ea204a8 100644
--- a/modules/postgresql/src/test/java/org/testcontainers/containers/PostgreSQLConnectionURLTest.java
+++ b/modules/postgresql/src/test/java/org/testcontainers/containers/PostgreSQLConnectionURLTest.java
@@ -15,7 +15,7 @@ public void shouldCorrectlyAppendQueryString() {
String connectionUrl = postgres.constructUrlForConnection("?stringtype=unspecified&stringtype=unspecified");
String queryString = connectionUrl.substring(connectionUrl.indexOf('?'));
- assertTrue("Query String contains expected params", queryString.contains("?stringtype=unspecified&stringtype=unspecified"));
+ assertTrue("Query String contains expected params", queryString.contains("&stringtype=unspecified&stringtype=unspecified"));
assertEquals("Query String starts with '?'", 0, queryString.indexOf('?'));
assertFalse("Query String does not contain extra '?'", queryString.substring(1).contains("?"));
}
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..9c97f51e64e 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
@@ -9,8 +9,6 @@
import java.util.logging.Level;
import java.util.logging.LogManager;
-import static org.hamcrest.CoreMatchers.containsString;
-import static org.junit.Assert.assertThat;
import static org.rnorth.visibleassertions.VisibleAssertions.assertEquals;
import static org.rnorth.visibleassertions.VisibleAssertions.assertNotEquals;
@@ -65,17 +63,4 @@ public void testExplicitInitScript() throws SQLException {
assertEquals("Value from init script should equal real value", "hello world", firstColumnValue);
}
}
-
- @Test
- public void testWithAdditionalUrlParamInJdbcUrl() {
- try (PostgreSQLContainer postgres = new PostgreSQLContainer<>()
- .withUrlParam("charSet", "UNICODE")) {
-
- postgres.start();
- String jdbcUrl = postgres.getJdbcUrl();
- assertThat(jdbcUrl, containsString("?"));
- assertThat(jdbcUrl, containsString("&"));
- assertThat(jdbcUrl, containsString("charSet=UNICODE"));
- }
- }
}
From 4ba01a655353dd22c8384a8d00dfc53749666109 Mon Sep 17 00:00:00 2001
From: Richard North
Date: Thu, 21 May 2020 19:26:30 +0100
Subject: [PATCH 0120/4341] Revert "Add docs for startup strategy
information/examples (#1157)" (#2776)
---
docs/examples/junit4/generic/build.gradle | 1 -
.../StartupCheckStrategyTest.java | 90 -------------------
docs/features/startup_and_waits.md | 49 ----------
3 files changed, 140 deletions(-)
delete mode 100644 docs/examples/junit4/generic/src/test/java/org/testcontainers/containers/startupcheck/StartupCheckStrategyTest.java
diff --git a/docs/examples/junit4/generic/build.gradle b/docs/examples/junit4/generic/build.gradle
index 5ce878c7ba2..97902d5d9ca 100644
--- a/docs/examples/junit4/generic/build.gradle
+++ b/docs/examples/junit4/generic/build.gradle
@@ -5,5 +5,4 @@ dependencies {
testCompile project(":testcontainers")
testCompile project(":selenium")
testCompile "org.seleniumhq.selenium:selenium-api:3.141.59"
- testCompile 'org.assertj:assertj-core:3.15.0'
}
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
deleted file mode 100644
index 5ab32919bb2..00000000000
--- a/docs/examples/junit4/generic/src/test/java/org/testcontainers/containers/startupcheck/StartupCheckStrategyTest.java
+++ /dev/null
@@ -1,90 +0,0 @@
-package org.testcontainers.containers.startupcheck;
-
-import java.time.Duration;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.TimeoutException;
-import lombok.SneakyThrows;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.Suite;
-import org.testcontainers.containers.GenericContainer;
-import org.testcontainers.containers.output.WaitingConsumer;
-
-import static org.assertj.core.api.Assertions.assertThat;
-import static org.testcontainers.containers.output.OutputFrame.OutputType.STDOUT;
-import static org.testcontainers.containers.startupcheck.StartupCheckStrategyTest.IndefiniteOneShotStrategyTest;
-import static org.testcontainers.containers.startupcheck.StartupCheckStrategyTest.MinimumDurationStrategyTest;
-import static org.testcontainers.containers.startupcheck.StartupCheckStrategyTest.OneShotStrategyTest;
-
-@RunWith(Suite.class)
-@Suite.SuiteClasses({OneShotStrategyTest.class, IndefiniteOneShotStrategyTest.class, MinimumDurationStrategyTest.class})
-public class StartupCheckStrategyTest {
-
- private static final String HELLO_TESTCONTAINERS = "Hello Testcontainers!";
-
- private static void waitForHello(GenericContainer container) throws TimeoutException {
- WaitingConsumer consumer = new WaitingConsumer();
- container.followOutput(consumer, STDOUT);
-
- consumer.waitUntil(frame ->
- frame.getUtf8String().contains(HELLO_TESTCONTAINERS), 30, TimeUnit.SECONDS);
- }
-
- public static class OneShotStrategyTest {
- @Rule
- // withOneShotStrategy {
- public GenericContainer bboxWithOneShot = new GenericContainer("busybox:1.31.1")
- .withCommand(String.format("echo %s", HELLO_TESTCONTAINERS))
- .withStartupCheckStrategy(
- new OneShotStartupCheckStrategy().withTimeout(Duration.ofSeconds(3))
- );
- // }
-
- @SneakyThrows
- @Test
- public void testCommandIsExecuted() {
- waitForHello(bboxWithOneShot);
-
- assertThat(bboxWithOneShot.isRunning()).isFalse();
- }
- }
-
- public static class IndefiniteOneShotStrategyTest {
- @Rule
- // withIndefiniteOneShotStrategy {
- public GenericContainer bboxWithIndefiniteOneShot = new GenericContainer("busybox:1.31.1")
- .withCommand("sh", "-c", String.format("sleep 5 && echo \"%s\"", HELLO_TESTCONTAINERS))
- .withStartupCheckStrategy(
- new IndefiniteWaitOneShotStartupCheckStrategy()
- );
- // }
-
- @SneakyThrows
- @Test
- public void testCommandIsExecuted() {
- waitForHello(bboxWithIndefiniteOneShot);
-
- assertThat(bboxWithIndefiniteOneShot.isRunning()).isFalse();
- }
- }
-
- public static class MinimumDurationStrategyTest {
- @Rule
- // withMinimumDurationStrategy {
- public GenericContainer bboxWithMinimumDuration = new GenericContainer("busybox:1.31.1")
- .withCommand("sh", "-c", String.format("sleep 5 && echo \"%s\"", HELLO_TESTCONTAINERS))
- .withStartupCheckStrategy(
- new MinimumDurationRunningStartupCheckStrategy(Duration.ofSeconds(5))
- );
- // }
-
- @SneakyThrows
- @Test
- public void testCommandIsExecuted() {
- waitForHello(bboxWithMinimumDuration);
-
- assertThat(bboxWithMinimumDuration.isRunning()).isTrue();
- }
- }
-}
diff --git a/docs/features/startup_and_waits.md b/docs/features/startup_and_waits.md
index 3cbec97af0d..e1d30457e5c 100644
--- a/docs/features/startup_and_waits.md
+++ b/docs/features/startup_and_waits.md
@@ -74,52 +74,3 @@ If none of these options meet your requirements, you can create your own subclas
appropriate wait mechanism in `waitUntilReady()`.
The `GenericContainer.waitingFor()` method accepts any valid [`WaitStrategy`](http://static.javadoc.io/org.testcontainers/testcontainers/{{ latest_version }}/org/testcontainers/containers/wait/strategy/WaitStrategy.html).
-
-## Startup check Strategies
-
-Ordinarily Testcontainers will check that the container has reached the running state and has not exited.
-In order to do that inspect is executed against the container and state parameter is extracted.
-
-All logic is implemented in [`StartupCheckStrategy`](http://static.javadoc.io/org.testcontainers/testcontainers/{{ latest_version }}/org/testcontainers/containers/startupcheck/StartupCheckStrategy.html) child classes.
-
-### Running startup strategy example
-
-This is the strategy used by default. Testcontainers just checks if container is running.
-
-Implemented in [`IsRunningStartupCheckStrategy`](http://static.javadoc.io/org.testcontainers/testcontainers/{{ latest_version }}/org/testcontainers/containers/startupcheck/IsRunningStartupCheckStrategy.html) class.
-
-### One shot startup strategy example
-
-This strategy is intended for use with containers that only run briefly and exit of their own accord. As such, success is deemed to be when
-the container has stopped with exit code 0.
-
-
-[Using one shot startup strategy](../examples/junit4/generic/src/test/java/org/testcontainers/containers/startupcheck/StartupCheckStrategyTest.java) inside_block:withOneShotStrategy
-
-
-### Indefinite one shot startup strategy example
-
-Variant of one shot strategy that does not impose a timeout. Intended for situation such as when a long running task forms part of
- container startup.
-
-It has to be assumed that the container will stop of its own accord, either with a success or failure exit code.
-
-
-[Using indefinite one shot startup strategy](../examples/junit4/generic/src/test/java/org/testcontainers/containers/startupcheck/StartupCheckStrategyTest.java) inside_block:withIndefiniteOneShotStrategy
-
-
-### Minimum duration startup strategy example
-
-Checks that the container is running and has been running for a defined minimum period of time.
-
-
-[Using minimum duration strategy](../examples/junit4/generic/src/test/java/org/testcontainers/containers/startupcheck/StartupCheckStrategyTest.java) inside_block:withMinimumDurationStrategy
-
-
-### Other startup strategies
-
-If none of these options meet your requirements, you can create your own subclass of
-[`StartupCheckStrategy`](http://static.javadoc.io/org.testcontainers/testcontainers/{{ latest_version }}/org/testcontainers/containers
-/startupcheck/StartupCheckStrategy.html) with an appropriate startup check mechanism in `waitUntilStartupSuccessful()`.
-Or you can leave it as is and just implement the `checkStartupState(DockerClient dockerClient, String containerId)` if you still want to check state
- periodically.
From 74a88ad6498b800b0e76d28ca41dc02369d870b9 Mon Sep 17 00:00:00 2001
From: Richard North
Date: Fri, 22 May 2020 09:36:20 +0100
Subject: [PATCH 0121/4341] Prevent Local gradle build cache collisions (#2778)
---
.github/workflows/ci-examples.yml | 3 ---
.github/workflows/ci.yml | 3 ---
2 files changed, 6 deletions(-)
diff --git a/.github/workflows/ci-examples.yml b/.github/workflows/ci-examples.yml
index bec794dc167..8dab14e831c 100644
--- a/.github/workflows/ci-examples.yml
+++ b/.github/workflows/ci-examples.yml
@@ -25,7 +25,6 @@ jobs:
key: ${{ runner.os }}-gradle-home-testmatrix-examples-${{ hashFiles('**/*.gradle') }}
restore-keys: |
${{ runner.os }}-gradle-home-testmatrix-examples-
- ${{ runner.os }}-gradle-home-
- id: set-matrix
working-directory: ./examples/
env:
@@ -54,8 +53,6 @@ jobs:
key: ${{ runner.os }}-gradle-home-examples-${{matrix.gradle_args}}_check-${{ hashFiles('**/*.gradle') }}
restore-keys: |
${{ runner.os }}-gradle-home-examples-${{matrix.gradle_args}}_check-
- ${{ runner.os }}-gradle-home-examples-${{matrix.gradle_args}}_check-
- ${{ runner.os }}-gradle-home-examples-
- name: Clear existing docker image cache
run: docker image prune -af
- name: Build and test Examples with Gradle (${{matrix.gradle_args}})
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 90e64dde133..6ea2319193d 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -25,7 +25,6 @@ jobs:
key: ${{ runner.os }}-gradle-home-testmatrix-${{ hashFiles('**/*.gradle') }}
restore-keys: |
${{ runner.os }}-gradle-home-testmatrix-
- ${{ runner.os }}-gradle-home-
- id: set-matrix
env:
# Since we override the tests executor,
@@ -53,8 +52,6 @@ jobs:
key: ${{ runner.os }}-gradle-home-${{matrix.gradle_args}}_check-${{ hashFiles('**/*.gradle') }}
restore-keys: |
${{ runner.os }}-gradle-home-${{matrix.gradle_args}}_check-
- ${{ runner.os }}-gradle-home-${{matrix.gradle_args}}_check-
- ${{ runner.os }}-gradle-home-
- name: Clear existing docker image cache
run: docker image prune -af
- name: Build and test with Gradle (${{matrix.gradle_args}})
From af077e91508cf7bbdb179053c479af7d4b068b83 Mon Sep 17 00:00:00 2001
From: Richard North
Date: Fri, 22 May 2020 10:08:02 +0100
Subject: [PATCH 0122/4341] Reinstate "Add docs for startup strategy
information/examples" (#2779)
---
docs/examples/junit4/generic/build.gradle | 1 +
.../StartupCheckStrategyTest.java | 90 +++++++++++++++++++
docs/features/startup_and_waits.md | 49 ++++++++++
3 files changed, 140 insertions(+)
create mode 100644 docs/examples/junit4/generic/src/test/java/org/testcontainers/containers/startupcheck/StartupCheckStrategyTest.java
diff --git a/docs/examples/junit4/generic/build.gradle b/docs/examples/junit4/generic/build.gradle
index 97902d5d9ca..5ce878c7ba2 100644
--- a/docs/examples/junit4/generic/build.gradle
+++ b/docs/examples/junit4/generic/build.gradle
@@ -5,4 +5,5 @@ dependencies {
testCompile project(":testcontainers")
testCompile project(":selenium")
testCompile "org.seleniumhq.selenium:selenium-api:3.141.59"
+ testCompile 'org.assertj:assertj-core:3.15.0'
}
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
new file mode 100644
index 00000000000..5ab32919bb2
--- /dev/null
+++ b/docs/examples/junit4/generic/src/test/java/org/testcontainers/containers/startupcheck/StartupCheckStrategyTest.java
@@ -0,0 +1,90 @@
+package org.testcontainers.containers.startupcheck;
+
+import java.time.Duration;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
+import lombok.SneakyThrows;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Suite;
+import org.testcontainers.containers.GenericContainer;
+import org.testcontainers.containers.output.WaitingConsumer;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.testcontainers.containers.output.OutputFrame.OutputType.STDOUT;
+import static org.testcontainers.containers.startupcheck.StartupCheckStrategyTest.IndefiniteOneShotStrategyTest;
+import static org.testcontainers.containers.startupcheck.StartupCheckStrategyTest.MinimumDurationStrategyTest;
+import static org.testcontainers.containers.startupcheck.StartupCheckStrategyTest.OneShotStrategyTest;
+
+@RunWith(Suite.class)
+@Suite.SuiteClasses({OneShotStrategyTest.class, IndefiniteOneShotStrategyTest.class, MinimumDurationStrategyTest.class})
+public class StartupCheckStrategyTest {
+
+ private static final String HELLO_TESTCONTAINERS = "Hello Testcontainers!";
+
+ private static void waitForHello(GenericContainer container) throws TimeoutException {
+ WaitingConsumer consumer = new WaitingConsumer();
+ container.followOutput(consumer, STDOUT);
+
+ consumer.waitUntil(frame ->
+ frame.getUtf8String().contains(HELLO_TESTCONTAINERS), 30, TimeUnit.SECONDS);
+ }
+
+ public static class OneShotStrategyTest {
+ @Rule
+ // withOneShotStrategy {
+ public GenericContainer bboxWithOneShot = new GenericContainer("busybox:1.31.1")
+ .withCommand(String.format("echo %s", HELLO_TESTCONTAINERS))
+ .withStartupCheckStrategy(
+ new OneShotStartupCheckStrategy().withTimeout(Duration.ofSeconds(3))
+ );
+ // }
+
+ @SneakyThrows
+ @Test
+ public void testCommandIsExecuted() {
+ waitForHello(bboxWithOneShot);
+
+ assertThat(bboxWithOneShot.isRunning()).isFalse();
+ }
+ }
+
+ public static class IndefiniteOneShotStrategyTest {
+ @Rule
+ // withIndefiniteOneShotStrategy {
+ public GenericContainer bboxWithIndefiniteOneShot = new GenericContainer("busybox:1.31.1")
+ .withCommand("sh", "-c", String.format("sleep 5 && echo \"%s\"", HELLO_TESTCONTAINERS))
+ .withStartupCheckStrategy(
+ new IndefiniteWaitOneShotStartupCheckStrategy()
+ );
+ // }
+
+ @SneakyThrows
+ @Test
+ public void testCommandIsExecuted() {
+ waitForHello(bboxWithIndefiniteOneShot);
+
+ assertThat(bboxWithIndefiniteOneShot.isRunning()).isFalse();
+ }
+ }
+
+ public static class MinimumDurationStrategyTest {
+ @Rule
+ // withMinimumDurationStrategy {
+ public GenericContainer bboxWithMinimumDuration = new GenericContainer("busybox:1.31.1")
+ .withCommand("sh", "-c", String.format("sleep 5 && echo \"%s\"", HELLO_TESTCONTAINERS))
+ .withStartupCheckStrategy(
+ new MinimumDurationRunningStartupCheckStrategy(Duration.ofSeconds(5))
+ );
+ // }
+
+ @SneakyThrows
+ @Test
+ public void testCommandIsExecuted() {
+ waitForHello(bboxWithMinimumDuration);
+
+ assertThat(bboxWithMinimumDuration.isRunning()).isTrue();
+ }
+ }
+}
diff --git a/docs/features/startup_and_waits.md b/docs/features/startup_and_waits.md
index e1d30457e5c..3cbec97af0d 100644
--- a/docs/features/startup_and_waits.md
+++ b/docs/features/startup_and_waits.md
@@ -74,3 +74,52 @@ If none of these options meet your requirements, you can create your own subclas
appropriate wait mechanism in `waitUntilReady()`.
The `GenericContainer.waitingFor()` method accepts any valid [`WaitStrategy`](http://static.javadoc.io/org.testcontainers/testcontainers/{{ latest_version }}/org/testcontainers/containers/wait/strategy/WaitStrategy.html).
+
+## Startup check Strategies
+
+Ordinarily Testcontainers will check that the container has reached the running state and has not exited.
+In order to do that inspect is executed against the container and state parameter is extracted.
+
+All logic is implemented in [`StartupCheckStrategy`](http://static.javadoc.io/org.testcontainers/testcontainers/{{ latest_version }}/org/testcontainers/containers/startupcheck/StartupCheckStrategy.html) child classes.
+
+### Running startup strategy example
+
+This is the strategy used by default. Testcontainers just checks if container is running.
+
+Implemented in [`IsRunningStartupCheckStrategy`](http://static.javadoc.io/org.testcontainers/testcontainers/{{ latest_version }}/org/testcontainers/containers/startupcheck/IsRunningStartupCheckStrategy.html) class.
+
+### One shot startup strategy example
+
+This strategy is intended for use with containers that only run briefly and exit of their own accord. As such, success is deemed to be when
+the container has stopped with exit code 0.
+
+
+[Using one shot startup strategy](../examples/junit4/generic/src/test/java/org/testcontainers/containers/startupcheck/StartupCheckStrategyTest.java) inside_block:withOneShotStrategy
+
+
+### Indefinite one shot startup strategy example
+
+Variant of one shot strategy that does not impose a timeout. Intended for situation such as when a long running task forms part of
+ container startup.
+
+It has to be assumed that the container will stop of its own accord, either with a success or failure exit code.
+
+
+[Using indefinite one shot startup strategy](../examples/junit4/generic/src/test/java/org/testcontainers/containers/startupcheck/StartupCheckStrategyTest.java) inside_block:withIndefiniteOneShotStrategy
+
+
+### Minimum duration startup strategy example
+
+Checks that the container is running and has been running for a defined minimum period of time.
+
+
+[Using minimum duration strategy](../examples/junit4/generic/src/test/java/org/testcontainers/containers/startupcheck/StartupCheckStrategyTest.java) inside_block:withMinimumDurationStrategy
+
+
+### Other startup strategies
+
+If none of these options meet your requirements, you can create your own subclass of
+[`StartupCheckStrategy`](http://static.javadoc.io/org.testcontainers/testcontainers/{{ latest_version }}/org/testcontainers/containers
+/startupcheck/StartupCheckStrategy.html) with an appropriate startup check mechanism in `waitUntilStartupSuccessful()`.
+Or you can leave it as is and just implement the `checkStartupState(DockerClient dockerClient, String containerId)` if you still want to check state
+ periodically.
From a6e8be1066b837fa666ca492233b1f97cc62234f Mon Sep 17 00:00:00 2001
From: Richard North
Date: Fri, 22 May 2020 11:00:40 +0100
Subject: [PATCH 0123/4341] Fix flaky StartupCheckStrategyTest
---
.../startupcheck/StartupCheckStrategyTest.java | 9 +++++----
1 file changed, 5 insertions(+), 4 deletions(-)
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 5ab32919bb2..deef64bc59b 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
@@ -1,8 +1,5 @@
package org.testcontainers.containers.startupcheck;
-import java.time.Duration;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.TimeoutException;
import lombok.SneakyThrows;
import org.junit.Rule;
import org.junit.Test;
@@ -11,6 +8,10 @@
import org.testcontainers.containers.GenericContainer;
import org.testcontainers.containers.output.WaitingConsumer;
+import java.time.Duration;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
+
import static org.assertj.core.api.Assertions.assertThat;
import static org.testcontainers.containers.output.OutputFrame.OutputType.STDOUT;
import static org.testcontainers.containers.startupcheck.StartupCheckStrategyTest.IndefiniteOneShotStrategyTest;
@@ -75,7 +76,7 @@ public static class MinimumDurationStrategyTest {
public GenericContainer bboxWithMinimumDuration = new GenericContainer("busybox:1.31.1")
.withCommand("sh", "-c", String.format("sleep 5 && echo \"%s\"", HELLO_TESTCONTAINERS))
.withStartupCheckStrategy(
- new MinimumDurationRunningStartupCheckStrategy(Duration.ofSeconds(5))
+ new MinimumDurationRunningStartupCheckStrategy(Duration.ofSeconds(1))
);
// }
From f401b1c202bd05cb2cab78c2949f3ba15b7682b4 Mon Sep 17 00:00:00 2001
From: Richard North
Date: Fri, 22 May 2020 12:33:29 +0100
Subject: [PATCH 0124/4341] Reinstate #1874 "Added additional url params in
JdbcDatabaseContainer" (#2777)
---
.../containers/ClickHouseContainer.java | 4 +
.../containers/CockroachContainer.java | 4 +-
.../cockroachdb/SimpleCockroachDBTest.java | 20 +++++
.../containers/Db2Container.java | 4 +-
.../junit/db2/SimpleDb2Test.java | 15 ++++
.../containers/JdbcDatabaseContainer.java | 39 ++++++++-
.../containers/MariaDBContainer.java | 4 +-
.../junit/mariadb/SimpleMariaDBTest.java | 20 +++++
.../containers/MSSQLServerContainer.java | 3 +-
.../mssqlserver/SimpleMSSQLServerTest.java | 16 ++++
.../containers/MySQLContainer.java | 6 +-
.../junit/mysql/SimpleMySQLTest.java | 83 ++++++++++++++++++-
.../containers/OracleContainer.java | 5 ++
.../containers/PostgreSQLContainer.java | 24 ++----
.../PostgreSQLConnectionURLTest.java | 2 +-
.../postgresql/SimplePostgreSQLTest.java | 15 ++++
16 files changed, 237 insertions(+), 27 deletions(-)
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 4d4ea2d11a9..10c0e1835c2 100644
--- a/modules/clickhouse/src/main/java/org/testcontainers/containers/ClickHouseContainer.java
+++ b/modules/clickhouse/src/main/java/org/testcontainers/containers/ClickHouseContainer.java
@@ -66,4 +66,8 @@ public String getTestQueryString() {
return TEST_QUERY;
}
+ @Override
+ public ClickHouseContainer withUrlParam(String paramName, String paramValue) {
+ throw new UnsupportedOperationException("The ClickHouse does not support this");
+ }
}
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 3768ca7a008..de64902c88a 100644
--- a/modules/cockroachdb/src/main/java/org/testcontainers/containers/CockroachContainer.java
+++ b/modules/cockroachdb/src/main/java/org/testcontainers/containers/CockroachContainer.java
@@ -43,7 +43,9 @@ public String getDriverClassName() {
@Override
public String getJdbcUrl() {
- return JDBC_URL_PREFIX + "://" + getHost() + ":" + getMappedPort(DB_PORT) + "/" + databaseName;
+ String additionalUrlParams = constructUrlParameters("?", "&");
+ return JDBC_URL_PREFIX + "://" + getHost() + ":" + getMappedPort(DB_PORT) +
+ "/" + databaseName + additionalUrlParams;
}
@Override
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 7c62b2f6bcf..14fe20222a3 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
@@ -9,6 +9,8 @@
import java.util.logging.Level;
import java.util.logging.LogManager;
+import static org.hamcrest.CoreMatchers.containsString;
+import static org.junit.Assert.assertThat;
import static org.rnorth.visibleassertions.VisibleAssertions.assertEquals;
public class SimpleCockroachDBTest extends AbstractContainerDatabaseTest {
@@ -42,4 +44,22 @@ public void testExplicitInitScript() throws SQLException {
assertEquals("Value from init script should equal real value", "hello world", firstColumnValue);
}
}
+
+ @Test
+ public void testWithAdditionalUrlParamInJdbcUrl() {
+ CockroachContainer cockroach = new CockroachContainer()
+ .withUrlParam("sslmode", "disable")
+ .withUrlParam("application_name", "cockroach");
+
+ try {
+ cockroach.start();
+ String jdbcUrl = cockroach.getJdbcUrl();
+ assertThat(jdbcUrl, containsString("?"));
+ assertThat(jdbcUrl, containsString("&"));
+ assertThat(jdbcUrl, containsString("sslmode=disable"));
+ assertThat(jdbcUrl, containsString("application_name=cockroach"));
+ } finally {
+ cockroach.stop();
+ }
+ }
}
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 b1472b21c6c..05edcb2c3ed 100644
--- a/modules/db2/src/main/java/org/testcontainers/containers/Db2Container.java
+++ b/modules/db2/src/main/java/org/testcontainers/containers/Db2Container.java
@@ -73,7 +73,9 @@ public String getDriverClassName() {
@Override
public String getJdbcUrl() {
- return "jdbc:db2://" + getHost() + ":" + getMappedPort(DB2_PORT) + "/" + databaseName;
+ String additionalUrlParams = constructUrlParameters(":", ";", ";");
+ return "jdbc:db2://" + getHost() + ":" + getMappedPort(DB2_PORT) +
+ "/" + databaseName + additionalUrlParams;
}
@Override
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 08f427cf12b..6cc7535f785 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
@@ -7,6 +7,8 @@
import java.sql.ResultSet;
import java.sql.SQLException;
+import static org.hamcrest.CoreMatchers.containsString;
+import static org.junit.Assert.assertThat;
import static org.rnorth.visibleassertions.VisibleAssertions.assertEquals;
public class SimpleDb2Test extends AbstractContainerDatabaseTest {
@@ -24,4 +26,17 @@ public void testSimple() throws SQLException {
assertEquals("A basic SELECT query succeeds", 1, resultSetInt);
}
}
+
+ @Test
+ public void testWithAdditionalUrlParamInJdbcUrl() {
+ try (Db2Container db2 = new Db2Container()
+ .withUrlParam("sslConnection", "false")
+ .acceptLicense()) {
+
+ db2.start();
+
+ String jdbcUrl = db2.getJdbcUrl();
+ assertThat(jdbcUrl, containsString(":sslConnection=false;"));
+ }
+ }
}
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 36a6461aa74..62fe43e7932 100644
--- a/modules/jdbc/src/main/java/org/testcontainers/containers/JdbcDatabaseContainer.java
+++ b/modules/jdbc/src/main/java/org/testcontainers/containers/JdbcDatabaseContainer.java
@@ -2,6 +2,7 @@
import com.github.dockerjava.api.command.InspectContainerResponse;
import lombok.NonNull;
+import org.apache.commons.lang.StringUtils;
import org.jetbrains.annotations.NotNull;
import org.testcontainers.containers.traits.LinkableContainer;
import org.testcontainers.delegate.DatabaseDelegate;
@@ -17,6 +18,8 @@
import java.util.Properties;
import java.util.concurrent.Future;
+import static java.util.stream.Collectors.joining;
+
/**
* Base class for containers that expose a JDBC connection
*
@@ -28,10 +31,13 @@ public abstract class JdbcDatabaseContainer parameters = new HashMap<>();
+ protected Map urlParameters = new HashMap<>();
private int startupTimeoutSeconds = 120;
private int connectTimeoutSeconds = 120;
+ private static final String QUERY_PARAM_SEPARATOR = "&";
+
public JdbcDatabaseContainer(@NonNull final String dockerImageName) {
super(dockerImageName);
}
@@ -82,7 +88,11 @@ public SELF withPassword(String password) {
public SELF withDatabaseName(String dbName) {
throw new UnsupportedOperationException();
+ }
+ public SELF withUrlParam(String paramName, String paramValue) {
+ urlParameters.put(paramName, paramValue);
+ return self();
}
/**
@@ -220,7 +230,34 @@ public Connection createConnection(String queryString) throws SQLException, NoDr
* @return a full JDBC URL including queryString
*/
protected String constructUrlForConnection(String queryString) {
- return getJdbcUrl() + queryString;
+ String baseUrl = getJdbcUrl();
+
+ if ("".equals(queryString)) {
+ return baseUrl;
+ }
+
+ if (!queryString.startsWith("?")) {
+ throw new IllegalArgumentException("The '?' character must be included");
+ }
+
+ return baseUrl.contains("?")
+ ? baseUrl + QUERY_PARAM_SEPARATOR + queryString.substring(1)
+ : baseUrl + queryString;
+ }
+
+ protected String constructUrlParameters(String startCharacter, String delimiter) {
+ return constructUrlParameters(startCharacter, delimiter, StringUtils.EMPTY);
+ }
+
+ protected String constructUrlParameters(String startCharacter, String delimiter, String endCharacter) {
+ String urlParameters = "";
+ if (!this.urlParameters.isEmpty()) {
+ String additionalParameters = this.urlParameters.entrySet().stream()
+ .map(Object::toString)
+ .collect(joining(delimiter));
+ urlParameters = startCharacter + additionalParameters + endCharacter;
+ }
+ return urlParameters;
}
protected void optionallyMapResourceParameterAsVolume(@NotNull String paramName, @NotNull String pathNameInContainer, @NotNull String defaultResource) {
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 1b4cb3344e4..04d745a9efe 100644
--- a/modules/mariadb/src/main/java/org/testcontainers/containers/MariaDBContainer.java
+++ b/modules/mariadb/src/main/java/org/testcontainers/containers/MariaDBContainer.java
@@ -60,7 +60,9 @@ public String getDriverClassName() {
@Override
public String getJdbcUrl() {
- return "jdbc:mariadb://" + getHost() + ":" + getMappedPort(MARIADB_PORT) + "/" + databaseName;
+ String additionalUrlParams = constructUrlParameters("?", "&");
+ return "jdbc:mariadb://" + getHost() + ":" + getMappedPort(MARIADB_PORT) +
+ "/" + databaseName + additionalUrlParams;
}
@Override
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 646fbb40947..af503ce424b 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
@@ -8,6 +8,8 @@
import java.sql.ResultSet;
import java.sql.SQLException;
+import static org.hamcrest.CoreMatchers.containsString;
+import static org.junit.Assert.assertThat;
import static org.junit.Assume.assumeFalse;
import static org.rnorth.visibleassertions.VisibleAssertions.assertEquals;
import static org.rnorth.visibleassertions.VisibleAssertions.assertTrue;
@@ -68,4 +70,22 @@ public void testMariaDBWithCommandOverride() throws SQLException {
assertEquals("Auto increment increment should be overriden by command line", "10", result);
}
}
+
+ @Test
+ public void testWithAdditionalUrlParamInJdbcUrl() {
+ MariaDBContainer mariaDBContainer = (MariaDBContainer) new MariaDBContainer()
+ .withUrlParam("connectTimeout", "40000")
+ .withUrlParam("rewriteBatchedStatements", "true");
+
+ try {
+ mariaDBContainer.start();
+ String jdbcUrl = mariaDBContainer.getJdbcUrl();
+ assertThat(jdbcUrl, containsString("?"));
+ assertThat(jdbcUrl, containsString("&"));
+ assertThat(jdbcUrl, containsString("rewriteBatchedStatements=true"));
+ assertThat(jdbcUrl, containsString("connectTimeout=40000"));
+ } finally {
+ mariaDBContainer.stop();
+ }
+ }
}
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 631228aeef2..b500e6fddf0 100644
--- a/modules/mssqlserver/src/main/java/org/testcontainers/containers/MSSQLServerContainer.java
+++ b/modules/mssqlserver/src/main/java/org/testcontainers/containers/MSSQLServerContainer.java
@@ -62,7 +62,8 @@ public String getDriverClassName() {
@Override
public String getJdbcUrl() {
- return "jdbc:sqlserver://" + getHost() + ":" + getMappedPort(MS_SQL_SERVER_PORT);
+ String additionalUrlParams = constructUrlParameters(";", ";");
+ return "jdbc:sqlserver://" + getHost() + ":" + getMappedPort(MS_SQL_SERVER_PORT) + additionalUrlParams;
}
@Override
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 c1699d2473a..71e12a6d864 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
@@ -9,6 +9,8 @@
import java.sql.SQLException;
import java.sql.Statement;
+import static org.hamcrest.CoreMatchers.containsString;
+import static org.junit.Assert.assertThat;
import static org.rnorth.visibleassertions.VisibleAssertions.assertEquals;
public class SimpleMSSQLServerTest extends AbstractContainerDatabaseTest {
@@ -24,6 +26,20 @@ public void testSimple() throws SQLException {
}
}
+ @Test
+ public void testWithAdditionalUrlParamInJdbcUrl() {
+ try (MSSQLServerContainer> mssqlServer = new MSSQLServerContainer<>()
+ .withUrlParam("integratedSecurity", "false")
+ .withUrlParam("applicationName", "MyApp")) {
+
+ mssqlServer.start();
+
+ String jdbcUrl = mssqlServer.getJdbcUrl();
+ assertThat(jdbcUrl, containsString(";integratedSecurity=false;applicationName=MyApp"));
+ }
+ }
+
+
@Test
public void testSetupDatabase() throws SQLException {
try (MSSQLServerContainer> mssqlServer = new MSSQLServerContainer<>()) {
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 79d29234b99..1ef574cbd5e 100644
--- a/modules/mysql/src/main/java/org/testcontainers/containers/MySQLContainer.java
+++ b/modules/mysql/src/main/java/org/testcontainers/containers/MySQLContainer.java
@@ -5,6 +5,8 @@
import java.util.HashSet;
import java.util.Set;
+import static java.util.stream.Collectors.joining;
+
/**
* @author richardnorth
*/
@@ -70,7 +72,9 @@ public String getDriverClassName() {
@Override
public String getJdbcUrl() {
- return "jdbc:mysql://" + getHost() + ":" + getMappedPort(MYSQL_PORT) + "/" + databaseName;
+ String additionalUrlParams = constructUrlParameters("?", "&");
+ return "jdbc:mysql://" + getHost() + ":" + getMappedPort(MYSQL_PORT) +
+ "/" + databaseName + additionalUrlParams;
}
@Override
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 ee6c3ab6993..6d6f8d26453 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
@@ -9,9 +9,17 @@
import org.testcontainers.containers.output.Slf4jLogConsumer;
import org.testcontainers.db.AbstractContainerDatabaseTest;
+import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
-
+import java.sql.Statement;
+import java.time.LocalDateTime;
+import java.time.ZoneId;
+import java.time.ZonedDateTime;
+import java.time.temporal.ChronoUnit;
+
+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;
@@ -142,4 +150,77 @@ public void testEmptyPasswordWithRootUser() throws SQLException {
assertEquals("A basic SELECT query succeeds", 1, resultSetInt);
}
}
+
+ @Test
+ public void testWithAdditionalUrlParamTimeZone() throws SQLException {
+ MySQLContainer mysql = (MySQLContainer) new MySQLContainer()
+ .withUrlParam("serverTimezone", "Europe/Zurich")
+ .withEnv("TZ", "Europe/Zurich")
+ .withLogConsumer(new Slf4jLogConsumer(logger));
+ mysql.start();
+
+ try(Connection connection = mysql.createConnection("")) {
+ Statement statement = connection.createStatement();
+ statement.execute("SELECT NOW();");
+ try (ResultSet resultSet = statement.getResultSet()) {
+ resultSet.next();
+
+ // checking that the time_zone MySQL is Europe/Zurich
+ LocalDateTime localDateTime = resultSet.getObject(1, LocalDateTime.class);
+ ZonedDateTime actualDateTime = localDateTime.atZone(ZoneId.of("Europe/Zurich"))
+ .truncatedTo(ChronoUnit.MINUTES);
+ ZonedDateTime expectedDateTime = ZonedDateTime.now(ZoneId.of("Europe/Zurich"))
+ .truncatedTo(ChronoUnit.MINUTES);
+
+ String message = String.format("MySQL time zone is not Europe/Zurich. MySQL date:%s, current date:%s",
+ actualDateTime, expectedDateTime);
+ assertTrue(message, actualDateTime.equals(expectedDateTime));
+ }
+ } finally {
+ mysql.stop();
+ }
+ }
+
+ @Test
+ public void testWithAdditionalUrlParamMultiQueries() throws SQLException {
+ MySQLContainer mysql = (MySQLContainer) new MySQLContainer()
+ .withUrlParam("allowMultiQueries", "true")
+ .withLogConsumer(new Slf4jLogConsumer(logger));
+ mysql.start();
+
+ try(Connection connection = mysql.createConnection("")) {
+ Statement statement = connection.createStatement();
+ String multiQuery = "DROP TABLE IF EXISTS bar; " +
+ "CREATE TABLE bar (foo VARCHAR(20)); " +
+ "INSERT INTO bar (foo) VALUES ('hello world');";
+ statement.execute(multiQuery);
+ statement.execute("SELECT foo FROM bar;");
+ try(ResultSet resultSet = statement.getResultSet()) {
+ resultSet.next();
+ String firstColumnValue = resultSet.getString(1);
+ assertEquals("Value from bar should equal real value", "hello world", firstColumnValue);
+ }
+ } finally {
+ mysql.stop();
+ }
+ }
+
+ @Test
+ public void testWithAdditionalUrlParamInJdbcUrl() {
+ MySQLContainer mysql = (MySQLContainer) new MySQLContainer()
+ .withUrlParam("allowMultiQueries", "true")
+ .withUrlParam("rewriteBatchedStatements", "true")
+ .withLogConsumer(new Slf4jLogConsumer(logger));
+
+ try {
+ mysql.start();
+ String jdbcUrl = mysql.getJdbcUrl();
+ assertThat(jdbcUrl, containsString("?"));
+ assertThat(jdbcUrl, containsString("&"));
+ assertThat(jdbcUrl, containsString("rewriteBatchedStatements=true"));
+ assertThat(jdbcUrl, containsString("allowMultiQueries=true"));
+ } finally {
+ mysql.stop();
+ }
+ }
}
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 60603a7e222..d263a141d4f 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
@@ -89,6 +89,11 @@ public OracleContainer withPassword(String password) {
return self();
}
+ @Override
+ public OracleContainer withUrlParam(String paramName, String paramValue) {
+ throw new UnsupportedOperationException("The OracleDb does not support this");
+ }
+
@SuppressWarnings("SameReturnValue")
public String getSid() {
return "xe";
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 8634f9d70fa..6ba7390878e 100644
--- a/modules/postgresql/src/main/java/org/testcontainers/containers/PostgreSQLContainer.java
+++ b/modules/postgresql/src/main/java/org/testcontainers/containers/PostgreSQLContainer.java
@@ -55,6 +55,8 @@ protected Set getLivenessCheckPorts() {
@Override
protected void configure() {
+ // Disable Postgres driver use of java.util.logging to reduce noise at startup time
+ withUrlParam("loggerLevel", "OFF");
addEnv("POSTGRES_DB", databaseName);
addEnv("POSTGRES_USER", username);
addEnv("POSTGRES_PASSWORD", password);
@@ -67,25 +69,9 @@ public String getDriverClassName() {
@Override
public String getJdbcUrl() {
- // Disable Postgres driver use of java.util.logging to reduce noise at startup time
- return format("jdbc:postgresql://%s:%d/%s?loggerLevel=OFF", getHost(), getMappedPort(POSTGRESQL_PORT), databaseName);
- }
-
- @Override
- protected String constructUrlForConnection(String queryString) {
- String baseUrl = getJdbcUrl();
-
- if ("".equals(queryString)) {
- return baseUrl;
- }
-
- if (!queryString.startsWith("?")) {
- throw new IllegalArgumentException("The '?' character must be included");
- }
-
- return baseUrl.contains("?")
- ? baseUrl + QUERY_PARAM_SEPARATOR + queryString.substring(1)
- : baseUrl + queryString;
+ String additionalUrlParams = constructUrlParameters("?", "&");
+ return "jdbc:postgresql://" + getContainerIpAddress() + ":" + getMappedPort(POSTGRESQL_PORT)
+ + "/" + databaseName + additionalUrlParams;
}
@Override
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 05f6ea204a8..c0ba7e40d44 100644
--- a/modules/postgresql/src/test/java/org/testcontainers/containers/PostgreSQLConnectionURLTest.java
+++ b/modules/postgresql/src/test/java/org/testcontainers/containers/PostgreSQLConnectionURLTest.java
@@ -15,7 +15,7 @@ public void shouldCorrectlyAppendQueryString() {
String connectionUrl = postgres.constructUrlForConnection("?stringtype=unspecified&stringtype=unspecified");
String queryString = connectionUrl.substring(connectionUrl.indexOf('?'));
- assertTrue("Query String contains expected params", queryString.contains("&stringtype=unspecified&stringtype=unspecified"));
+ assertTrue("Query String contains expected params", queryString.contains("?stringtype=unspecified&stringtype=unspecified"));
assertEquals("Query String starts with '?'", 0, queryString.indexOf('?'));
assertFalse("Query String does not contain extra '?'", queryString.substring(1).contains("?"));
}
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 9c97f51e64e..36ece03b604 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
@@ -9,6 +9,8 @@
import java.util.logging.Level;
import java.util.logging.LogManager;
+import static org.hamcrest.CoreMatchers.containsString;
+import static org.junit.Assert.assertThat;
import static org.rnorth.visibleassertions.VisibleAssertions.assertEquals;
import static org.rnorth.visibleassertions.VisibleAssertions.assertNotEquals;
@@ -63,4 +65,17 @@ public void testExplicitInitScript() throws SQLException {
assertEquals("Value from init script should equal real value", "hello world", firstColumnValue);
}
}
+
+ @Test
+ public void testWithAdditionalUrlParamInJdbcUrl() {
+ try (PostgreSQLContainer postgres = new PostgreSQLContainer<>()
+ .withUrlParam("charSet", "UNICODE")) {
+
+ postgres.start();
+ String jdbcUrl = postgres.getJdbcUrl();
+ assertThat(jdbcUrl, containsString("?"));
+ assertThat(jdbcUrl, containsString("&"));
+ assertThat(jdbcUrl, containsString("charSet=UNICODE"));
+ }
+ }
}
From 289fb50f06d1ee99c036858b8b0889e96c1396a8 Mon Sep 17 00:00:00 2001
From: AElMehdi
Date: Fri, 22 May 2020 13:34:35 +0200
Subject: [PATCH 0125/4341] Update version #2757 (#2758)
---
mkdocs.yml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/mkdocs.yml b/mkdocs.yml
index 48b63c59631..c28e0827f7c 100644
--- a/mkdocs.yml
+++ b/mkdocs.yml
@@ -90,4 +90,4 @@ nav:
- contributing.md
- contributing_docs.md
extra:
- latest_version: 1.14.1
+ latest_version: 1.14.2
From 647d1fe9f5766e5aeaa8a238e553976eeaf16bbb Mon Sep 17 00:00:00 2001
From: "dependabot-preview[bot]"
<27856297+dependabot-preview[bot]@users.noreply.github.com>
Date: Sat, 23 May 2020 13:14:35 +0100
Subject: [PATCH 0126/4341] Bump influxdb-java from 2.18 to 2.19 in
/modules/influxdb (#2784)
---
modules/influxdb/build.gradle | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/modules/influxdb/build.gradle b/modules/influxdb/build.gradle
index 02af2e924a9..2deacd3a149 100644
--- a/modules/influxdb/build.gradle
+++ b/modules/influxdb/build.gradle
@@ -3,6 +3,6 @@ description = "Testcontainers :: InfluxDB"
dependencies {
compile project(':testcontainers')
- compileOnly 'org.influxdb:influxdb-java:2.18'
- testCompile 'org.influxdb:influxdb-java:2.17'
+ compileOnly 'org.influxdb:influxdb-java:2.19'
+ testCompile 'org.influxdb:influxdb-java:2.19'
}
From 066a1bdf4219cd0ea5e31abcdf07faab5e9c1eee Mon Sep 17 00:00:00 2001
From: "dependabot-preview[bot]"
<27856297+dependabot-preview[bot]@users.noreply.github.com>
Date: Sat, 23 May 2020 13:14:48 +0100
Subject: [PATCH 0127/4341] Bump pulsar-client from 2.5.1 to 2.5.2 in
/modules/pulsar (#2787)
---
modules/pulsar/build.gradle | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/modules/pulsar/build.gradle b/modules/pulsar/build.gradle
index 74626006ba0..4082197b8ea 100644
--- a/modules/pulsar/build.gradle
+++ b/modules/pulsar/build.gradle
@@ -3,6 +3,6 @@ description = "Testcontainers :: Pulsar"
dependencies {
compile project(':testcontainers')
- testCompile group: 'org.apache.pulsar', name: 'pulsar-client', version: '2.5.1'
+ testCompile group: 'org.apache.pulsar', name: 'pulsar-client', version: '2.5.2'
testCompile group: 'org.assertj', name: 'assertj-core', version: '3.16.1'
}
From b3cd937da000bf92f0428cbb2ba2e92c2d95fa93 Mon Sep 17 00:00:00 2001
From: "dependabot-preview[bot]"
<27856297+dependabot-preview[bot]@users.noreply.github.com>
Date: Sat, 23 May 2020 13:14:57 +0100
Subject: [PATCH 0128/4341] Bump aws-java-sdk-sqs from 1.11.784 to 1.11.789 in
/modules/localstack (#2785)
---
modules/localstack/build.gradle | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/modules/localstack/build.gradle b/modules/localstack/build.gradle
index 482b977792d..ce921607844 100644
--- a/modules/localstack/build.gradle
+++ b/modules/localstack/build.gradle
@@ -5,7 +5,7 @@ dependencies {
compileOnly 'com.amazonaws:aws-java-sdk-s3:1.11.784'
testCompile 'com.amazonaws:aws-java-sdk-s3:1.11.782'
- testCompile 'com.amazonaws:aws-java-sdk-sqs:1.11.784'
+ testCompile 'com.amazonaws:aws-java-sdk-sqs:1.11.789'
testCompile 'com.amazonaws:aws-java-sdk-logs:1.11.782'
testCompile 'software.amazon.awssdk:s3:2.13.18'
}
From fe2102a99ce323a1fa00913104954264bda44a86 Mon Sep 17 00:00:00 2001
From: Richard North
Date: Thu, 28 May 2020 22:08:35 +0100
Subject: [PATCH 0129/4341] Move away from using quay.io for default images
(#2805)
---
.../utility/TestcontainersConfiguration.java | 21 ++++++++++++++-----
docs/features/configuration.md | 8 +++----
2 files changed, 19 insertions(+), 10 deletions(-)
diff --git a/core/src/main/java/org/testcontainers/utility/TestcontainersConfiguration.java b/core/src/main/java/org/testcontainers/utility/TestcontainersConfiguration.java
index 64ee03efb06..44691cfb6fb 100644
--- a/core/src/main/java/org/testcontainers/utility/TestcontainersConfiguration.java
+++ b/core/src/main/java/org/testcontainers/utility/TestcontainersConfiguration.java
@@ -1,11 +1,22 @@
package org.testcontainers.utility;
import com.google.common.annotations.VisibleForTesting;
-import lombok.*;
+import lombok.AccessLevel;
+import lombok.Data;
+import lombok.Getter;
+import lombok.NonNull;
+import lombok.RequiredArgsConstructor;
+import lombok.SneakyThrows;
+import lombok.Synchronized;
import lombok.extern.slf4j.Slf4j;
import org.testcontainers.UnstableAPI;
-import java.io.*;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Objects;
@@ -56,7 +67,7 @@ public String getSocatContainerImage() {
}
public String getVncRecordedContainerImage() {
- return (String) properties.getOrDefault("vncrecorder.container.image", "quay.io/testcontainers/vnc-recorder:1.1.0");
+ return (String) properties.getOrDefault("vncrecorder.container.image", "testcontainersofficial/vnc-recorder:1.1.0");
}
public String getDockerComposeContainerImage() {
@@ -72,11 +83,11 @@ public boolean isRyukPrivileged() {
}
public String getRyukImage() {
- return (String) properties.getOrDefault("ryuk.container.image", "quay.io/testcontainers/ryuk:0.2.3");
+ return (String) properties.getOrDefault("ryuk.container.image", "testcontainersofficial/ryuk:0.3.0");
}
public String getSSHdImage() {
- return (String) properties.getOrDefault("sshd.container.image", "quay.io/testcontainers/sshd:1.0.0");
+ return (String) properties.getOrDefault("sshd.container.image", "testcontainersofficial/sshd:1.0.0");
}
public Integer getRyukTimeout() {
diff --git a/docs/features/configuration.md b/docs/features/configuration.md
index ad039528b5d..f0172b3c978 100644
--- a/docs/features/configuration.md
+++ b/docs/features/configuration.md
@@ -32,7 +32,7 @@ Some companies disallow the usage of Docker Hub, but you can override `*.image`
> **tinyimage.container.image = alpine:3.5**
> Used by Testcontainers' core
-> **vncrecorder.container.image = quay.io/testcontainers/vnc-recorder:1.1.0**
+> **vncrecorder.container.image = testcontainersofficial/vnc-recorder:1.1.0**
> Used by VNC recorder in Testcontainers' Seleniun integration
> **ambassador.container.image = richnorth/ambassador:latest**
@@ -49,13 +49,11 @@ Another possibility is to set up a registry mirror in your environment so that a
For more information, see the [official Docker documentation about "Registry as a pull through cache"](https://docs.docker.com/registry/recipes/mirror/).
!!!tip
- Registry mirror currently only works for Docker images with image name that has no registry specified (for example, for Docker image `mariadb:10.3.6`, it works, for Docker image `quay.io/testcontainers/ryuk:0.2.3`, not).
- Workaround is to to configure the affected Docker image in `.testcontainers.properties`.
- For example: `ryuk.container.image = testcontainers/ryuk:0.2.3` or `ryuk.container.image = /testcontainers/ryuk:0.2.3`
+ Registry mirror currently only works for Docker images with image name that has no registry specified (for example, for Docker image `mariadb:10.3.6`, it works, for Docker image `quay.io/something/else`, not).
## Customizing Ryuk resource reaper
-> **ryuk.container.image = quay.io/testcontainers/ryuk:0.2.3**
+> **ryuk.container.image = testcontainersofficial/ryuk:0.3.0**
> The resource reaper is responsible for container removal and automatic cleanup of dead containers at JVM shutdown
> **ryuk.container.privileged = false**
From 3a2462cbeb5fee3cafcd885eeb10f2514f6d096b Mon Sep 17 00:00:00 2001
From: Richard North
Date: Thu, 28 May 2020 23:13:46 +0100
Subject: [PATCH 0130/4341] Ensure that ParsedDockerfile supports platform args
(#2780)
---
.../images/ParsedDockerfile.java | 4 ++--
.../images/ParsedDockerfileTest.java | 18 ++++++++++++++++++
2 files changed, 20 insertions(+), 2 deletions(-)
diff --git a/core/src/main/java/org/testcontainers/images/ParsedDockerfile.java b/core/src/main/java/org/testcontainers/images/ParsedDockerfile.java
index 1ad43813757..d4574d17c34 100644
--- a/core/src/main/java/org/testcontainers/images/ParsedDockerfile.java
+++ b/core/src/main/java/org/testcontainers/images/ParsedDockerfile.java
@@ -21,7 +21,7 @@
@Slf4j
public class ParsedDockerfile {
- private static final Pattern FROM_LINE_PATTERN = Pattern.compile("FROM ([^\\s]+).*");
+ private static final Pattern FROM_LINE_PATTERN = Pattern.compile("FROM (?--[^\\s]+\\s)*(?[^\\s]+).*", Pattern.CASE_INSENSITIVE);
private final Path dockerFilePath;
@@ -57,7 +57,7 @@ private void parse(List lines) {
dependencyImageNames = lines.stream()
.map(FROM_LINE_PATTERN::matcher)
.filter(Matcher::matches)
- .map(matcher -> matcher.group(1))
+ .map(matcher -> matcher.group("image"))
.collect(Collectors.toSet());
if (!dependencyImageNames.isEmpty()) {
diff --git a/core/src/test/java/org/testcontainers/images/ParsedDockerfileTest.java b/core/src/test/java/org/testcontainers/images/ParsedDockerfileTest.java
index e2b97f9fab7..52a22c83b00 100644
--- a/core/src/test/java/org/testcontainers/images/ParsedDockerfileTest.java
+++ b/core/src/test/java/org/testcontainers/images/ParsedDockerfileTest.java
@@ -16,6 +16,12 @@ public void doesSimpleParsing() {
assertEquals("extracts a single image name", Sets.newHashSet("someimage"), parsedDockerfile.getDependencyImageNames());
}
+ @Test
+ public void isCaseInsensitive() {
+ final ParsedDockerfile parsedDockerfile = new ParsedDockerfile(asList("from someimage", "RUN something"));
+ assertEquals("extracts a single image name", Sets.newHashSet("someimage"), parsedDockerfile.getDependencyImageNames());
+ }
+
@Test
public void handlesTags() {
final ParsedDockerfile parsedDockerfile = new ParsedDockerfile(asList("FROM someimage:tag", "RUN something"));
@@ -40,6 +46,18 @@ public void ignoringBuildStageNames() {
assertEquals("ignores build stage names and allows multiple images to be extracted", Sets.newHashSet("someimage", "nextimage"), parsedDockerfile.getDependencyImageNames());
}
+ @Test
+ public void ignoringPlatformArgs() {
+ final ParsedDockerfile parsedDockerfile = new ParsedDockerfile(asList("FROM --platform=linux/amd64 someimage", "RUN something"));
+ assertEquals("ignores platform args", Sets.newHashSet("someimage"), parsedDockerfile.getDependencyImageNames());
+ }
+
+ @Test
+ public void ignoringExtraPlatformArgs() {
+ final ParsedDockerfile parsedDockerfile = new ParsedDockerfile(asList("FROM --platform=linux/amd64 --somethingelse=value someimage", "RUN something"));
+ assertEquals("ignores platform args", Sets.newHashSet("someimage"), parsedDockerfile.getDependencyImageNames());
+ }
+
@Test
public void handlesGracefullyIfNoFromLine() {
final ParsedDockerfile parsedDockerfile = new ParsedDockerfile(asList("RUN something", "# is this even a valid Dockerfile?"));
From 77a662c19d524ce3d714df79bf3994368252c109 Mon Sep 17 00:00:00 2001
From: "dependabot-preview[bot]"
<27856297+dependabot-preview[bot]@users.noreply.github.com>
Date: Thu, 28 May 2020 23:16:57 +0100
Subject: [PATCH 0131/4341] Bump aws-java-sdk-logs from 1.11.782 to 1.11.789 in
/modules/localstack (#2788)
Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>
Co-authored-by: Richard North
---
modules/localstack/build.gradle | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/modules/localstack/build.gradle b/modules/localstack/build.gradle
index ce921607844..2ad0552bdb3 100644
--- a/modules/localstack/build.gradle
+++ b/modules/localstack/build.gradle
@@ -6,6 +6,6 @@ dependencies {
compileOnly 'com.amazonaws:aws-java-sdk-s3:1.11.784'
testCompile 'com.amazonaws:aws-java-sdk-s3:1.11.782'
testCompile 'com.amazonaws:aws-java-sdk-sqs:1.11.789'
- testCompile 'com.amazonaws:aws-java-sdk-logs:1.11.782'
+ testCompile 'com.amazonaws:aws-java-sdk-logs:1.11.789'
testCompile 'software.amazon.awssdk:s3:2.13.18'
}
From f2109fc33a760242942cc869b7914e88336fe5f7 Mon Sep 17 00:00:00 2001
From: "dependabot-preview[bot]"
<27856297+dependabot-preview[bot]@users.noreply.github.com>
Date: Thu, 28 May 2020 23:17:32 +0100
Subject: [PATCH 0132/4341] Bump s3 from 2.13.18 to 2.13.23 in
/modules/localstack (#2786)
Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>
Co-authored-by: Richard North
---
modules/localstack/build.gradle | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/modules/localstack/build.gradle b/modules/localstack/build.gradle
index 2ad0552bdb3..857b752ec1e 100644
--- a/modules/localstack/build.gradle
+++ b/modules/localstack/build.gradle
@@ -7,5 +7,5 @@ dependencies {
testCompile 'com.amazonaws:aws-java-sdk-s3:1.11.782'
testCompile 'com.amazonaws:aws-java-sdk-sqs:1.11.789'
testCompile 'com.amazonaws:aws-java-sdk-logs:1.11.789'
- testCompile 'software.amazon.awssdk:s3:2.13.18'
+ testCompile 'software.amazon.awssdk:s3:2.13.23'
}
From 71b9bcefafbe77ec462eeca2444ca3786ce205b0 Mon Sep 17 00:00:00 2001
From: Richard North
Date: Fri, 29 May 2020 10:05:18 +0100
Subject: [PATCH 0133/4341] Always clean Azure pipelines builds
---
azure-pipelines.yml | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/azure-pipelines.yml b/azure-pipelines.yml
index 5780a01bb83..185240ae7eb 100644
--- a/azure-pipelines.yml
+++ b/azure-pipelines.yml
@@ -14,7 +14,7 @@ jobs:
gradleWrapperFile: 'gradlew'
jdkVersionOption: '1.11'
options: "--no-daemon --continue"
- tasks: "testcontainers:test --tests GenericContainerRuleTest"
+ tasks: "clean testcontainers:test --tests GenericContainerRuleTest"
publishJUnitResults: true
testResultsFiles: '**/TEST-*.xml'
- script: wget -q https://get.cimate.io/release/linux/cimate && chmod +x cimate && ./cimate "**/TEST-*.xml"
@@ -31,6 +31,6 @@ jobs:
gradleWrapperFile: 'gradlew'
jdkVersionOption: '1.11'
options: '--no-daemon --continue'
- tasks: 'check'
+ tasks: 'clean check'
publishJUnitResults: true
testResultsFiles: '**/TEST-*.xml'
From 785bdf567f2e771de5613bbeeda419f33b4bdecf Mon Sep 17 00:00:00 2001
From: Richard North
Date: Fri, 29 May 2020 10:36:03 +0100
Subject: [PATCH 0134/4341] Temporarily disable use of build cache
---
azure-pipelines.yml | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/azure-pipelines.yml b/azure-pipelines.yml
index 185240ae7eb..1e3715bec7c 100644
--- a/azure-pipelines.yml
+++ b/azure-pipelines.yml
@@ -13,7 +13,7 @@ jobs:
inputs:
gradleWrapperFile: 'gradlew'
jdkVersionOption: '1.11'
- options: "--no-daemon --continue"
+ options: "--no-daemon --continue --no-build-cache"
tasks: "clean testcontainers:test --tests GenericContainerRuleTest"
publishJUnitResults: true
testResultsFiles: '**/TEST-*.xml'
@@ -30,7 +30,7 @@ jobs:
inputs:
gradleWrapperFile: 'gradlew'
jdkVersionOption: '1.11'
- options: '--no-daemon --continue'
+ options: '--no-daemon --continue --no-build-cache'
tasks: 'clean check'
publishJUnitResults: true
testResultsFiles: '**/TEST-*.xml'
From 892d84db66b8e99b140aecd863111cb0b0527e5d Mon Sep 17 00:00:00 2001
From: Richard North
Date: Fri, 29 May 2020 11:39:20 +0100
Subject: [PATCH 0135/4341] Re-enable build cache
---
azure-pipelines.yml | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/azure-pipelines.yml b/azure-pipelines.yml
index 1e3715bec7c..185240ae7eb 100644
--- a/azure-pipelines.yml
+++ b/azure-pipelines.yml
@@ -13,7 +13,7 @@ jobs:
inputs:
gradleWrapperFile: 'gradlew'
jdkVersionOption: '1.11'
- options: "--no-daemon --continue --no-build-cache"
+ options: "--no-daemon --continue"
tasks: "clean testcontainers:test --tests GenericContainerRuleTest"
publishJUnitResults: true
testResultsFiles: '**/TEST-*.xml'
@@ -30,7 +30,7 @@ jobs:
inputs:
gradleWrapperFile: 'gradlew'
jdkVersionOption: '1.11'
- options: '--no-daemon --continue --no-build-cache'
+ options: '--no-daemon --continue'
tasks: 'clean check'
publishJUnitResults: true
testResultsFiles: '**/TEST-*.xml'
From 6ac18b2b882f4c1a8b5d550d9ca79de339ce0265 Mon Sep 17 00:00:00 2001
From: Sergei Egorov
Date: Fri, 29 May 2020 12:43:11 +0200
Subject: [PATCH 0136/4341] Add default labels to images created with
`ImageFromDockerfile` (#2809)
---
.../images/builder/ImageFromDockerfile.java | 6 +++++
.../builder/ImageFromDockerfileTest.java | 27 +++++++++++++++++++
2 files changed, 33 insertions(+)
create mode 100644 core/src/test/java/org/testcontainers/images/builder/ImageFromDockerfileTest.java
diff --git a/core/src/main/java/org/testcontainers/images/builder/ImageFromDockerfile.java b/core/src/main/java/org/testcontainers/images/builder/ImageFromDockerfile.java
index 11a7e2f4cb6..638db2e351d 100644
--- a/core/src/main/java/org/testcontainers/images/builder/ImageFromDockerfile.java
+++ b/core/src/main/java/org/testcontainers/images/builder/ImageFromDockerfile.java
@@ -107,6 +107,12 @@ public void onNext(BuildResponseItem item) {
BuildImageCmd buildImageCmd = dockerClient.buildImageCmd(in);
configure(buildImageCmd);
+ Map labels = new HashMap<>();
+ if (buildImageCmd.getLabels() != null) {
+ labels.putAll(buildImageCmd.getLabels());
+ }
+ labels.putAll(DockerClientFactory.DEFAULT_LABELS);
+ buildImageCmd.withLabels(labels);
prePullDependencyImages(dependencyImageNames);
diff --git a/core/src/test/java/org/testcontainers/images/builder/ImageFromDockerfileTest.java b/core/src/test/java/org/testcontainers/images/builder/ImageFromDockerfileTest.java
new file mode 100644
index 00000000000..93ec5cb5cd1
--- /dev/null
+++ b/core/src/test/java/org/testcontainers/images/builder/ImageFromDockerfileTest.java
@@ -0,0 +1,27 @@
+package org.testcontainers.images.builder;
+
+import com.github.dockerjava.api.DockerClient;
+import com.github.dockerjava.api.command.InspectImageResponse;
+import org.junit.Test;
+import org.testcontainers.DockerClientFactory;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+public class ImageFromDockerfileTest {
+
+ @Test
+ public void shouldAddDefaultLabels() {
+ ImageFromDockerfile image = new ImageFromDockerfile()
+ .withDockerfileFromBuilder(it -> it.from("scratch"));
+
+ String imageId = image.resolve();
+
+ DockerClient dockerClient = DockerClientFactory.instance().client();
+
+ InspectImageResponse inspectImageResponse = dockerClient.inspectImageCmd(imageId).exec();
+
+ assertThat(inspectImageResponse.getConfig().getLabels())
+ .containsAllEntriesOf(DockerClientFactory.DEFAULT_LABELS);
+ }
+
+}
From 6e1f8a03699076a54e79e037f7ad34b06202f2f2 Mon Sep 17 00:00:00 2001
From: Sergei Egorov
Date: Fri, 29 May 2020 12:43:27 +0200
Subject: [PATCH 0137/4341] Record and dump Ryuk's logs on timeout (#2810)
---
.../utility/ResourceReaper.java | 20 ++++++++++++++++++-
1 file changed, 19 insertions(+), 1 deletion(-)
diff --git a/core/src/main/java/org/testcontainers/utility/ResourceReaper.java b/core/src/main/java/org/testcontainers/utility/ResourceReaper.java
index f74905e60ef..2f668d80426 100644
--- a/core/src/main/java/org/testcontainers/utility/ResourceReaper.java
+++ b/core/src/main/java/org/testcontainers/utility/ResourceReaper.java
@@ -1,10 +1,12 @@
package org.testcontainers.utility;
import com.github.dockerjava.api.DockerClient;
+import com.github.dockerjava.api.async.ResultCallback;
import com.github.dockerjava.api.command.InspectContainerResponse;
import com.github.dockerjava.api.exception.NotFoundException;
import com.github.dockerjava.api.model.Bind;
import com.github.dockerjava.api.model.ExposedPort;
+import com.github.dockerjava.api.model.Frame;
import com.github.dockerjava.api.model.HostConfig;
import com.github.dockerjava.api.model.Network;
import com.github.dockerjava.api.model.Ports;
@@ -28,6 +30,7 @@
import java.io.UnsupportedEncodingException;
import java.net.Socket;
import java.net.URLEncoder;
+import java.nio.charset.StandardCharsets;
import java.util.AbstractMap.SimpleEntry;
import java.util.ArrayList;
import java.util.Collections;
@@ -93,6 +96,20 @@ public static String start(String hostIpAddress, DockerClient client) {
client.startContainerCmd(ryukContainerId).exec();
+ StringBuilder ryukLog = new StringBuilder();
+
+ client.logContainerCmd(ryukContainerId)
+ .withSince(0)
+ .withFollowStream(true)
+ .withStdOut(true)
+ .withStdErr(true)
+ .exec(new ResultCallback.Adapter () {
+ @Override
+ public void onNext(Frame frame) {
+ ryukLog.append(new String(frame.getPayload(), StandardCharsets.UTF_8));
+ }
+ });
+
InspectContainerResponse inspectedContainer = client.inspectContainerCmd(ryukContainerId).exec();
Integer ryukPort = inspectedContainer.getNetworkSettings().getPorts().getBindings().values().stream()
@@ -155,7 +172,8 @@ public static String start(String hostIpAddress, DockerClient client) {
// We need to wait before we can start any containers to make sure that we delete them
if (!ryukScheduledLatch.await(TestcontainersConfiguration.getInstance().getRyukTimeout(), TimeUnit.SECONDS)) {
- throw new IllegalStateException("Can not connect to Ryuk");
+ log.error("Timeout out waiting for Ryuk. Ryuk's log:\n{}", ryukLog);
+ throw new IllegalStateException(String.format("Can not connect to Ryuk at %s:%s", hostIpAddress, ryukPort));
}
return ryukContainerId;
From 835ac71d8ddcf206146af08b2e4efc56532d878f Mon Sep 17 00:00:00 2001
From: Michael Nitschinger
Date: Fri, 29 May 2020 14:56:07 +0200
Subject: [PATCH 0138/4341] =?UTF-8?q?couchbase:=20wait=20until=20query=20e?=
=?UTF-8?q?ngine=20knows=20about=20bucket=20before=20creating=E2=80=A6=20(?=
=?UTF-8?q?#2662)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
The motivation for this change is that in slow environments, it could be that the
query engine is not aware of the just created bucket yet and so the create primary
index will take longer than the 10s read timeout for the subsequent http request.
As a result, this is just another precaution to minimize the chances that in
slow environments the create primary index call times out with a read timeout.
---
.../couchbase/CouchbaseContainer.java | 45 ++++++++++++-------
1 file changed, 30 insertions(+), 15 deletions(-)
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 33f87359a92..92b35da3361 100644
--- a/modules/couchbase/src/main/java/org/testcontainers/couchbase/CouchbaseContainer.java
+++ b/modules/couchbase/src/main/java/org/testcontainers/couchbase/CouchbaseContainer.java
@@ -19,12 +19,14 @@
import com.fasterxml.jackson.databind.ObjectMapper;
import com.github.dockerjava.api.command.InspectContainerResponse;
import com.github.dockerjava.api.model.ContainerNetwork;
+import lombok.Cleanup;
import okhttp3.Credentials;
import okhttp3.FormBody;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;
+import org.rnorth.ducttape.unreliables.Unreliables;
import org.testcontainers.containers.GenericContainer;
import org.testcontainers.containers.wait.strategy.HttpWaitStrategy;
import org.testcontainers.containers.wait.strategy.WaitAllStrategy;
@@ -36,6 +38,7 @@
import java.util.List;
import java.util.Optional;
import java.util.Set;
+import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
/**
@@ -224,7 +227,7 @@ private void waitUntilNodeIsOnline() {
private void renameNode() {
logger().debug("Renaming Couchbase Node from localhost to {}", getHost());
- Response response = doHttpRequest(MGMT_PORT, "/node/controller/rename", "POST", new FormBody.Builder()
+ @Cleanup Response response = doHttpRequest(MGMT_PORT, "/node/controller/rename", "POST", new FormBody.Builder()
.add("hostname", getInternalIpAddress())
.build(), false
);
@@ -248,7 +251,7 @@ private void initializeServices() {
}
}).collect(Collectors.joining(","));
- Response response = doHttpRequest(MGMT_PORT, "/node/controller/setupServices", "POST", new FormBody.Builder()
+ @Cleanup Response response = doHttpRequest(MGMT_PORT, "/node/controller/setupServices", "POST", new FormBody.Builder()
.add("services", services)
.build(), false
);
@@ -264,7 +267,7 @@ private void initializeServices() {
private void configureAdminUser() {
logger().debug("Configuring couchbase admin user with username: \"{}\"", username);
- Response response = doHttpRequest(MGMT_PORT, "/settings/web", "POST", new FormBody.Builder()
+ @Cleanup Response response = doHttpRequest(MGMT_PORT, "/settings/web", "POST", new FormBody.Builder()
.add("username", username)
.add("password", password)
.add("port", Integer.toString(MGMT_PORT))
@@ -305,7 +308,7 @@ private void configureExternalPorts() {
builder.add("ftsSSL", Integer.toString(getMappedPort(SEARCH_SSL_PORT)));
}
- final Response response = doHttpRequest(
+ @Cleanup Response response = doHttpRequest(
MGMT_PORT,
"/node/controller/setupAlternateAddresses/external",
"PUT",
@@ -322,7 +325,7 @@ private void configureExternalPorts() {
private void configureIndexer() {
logger().debug("Configuring the indexer service");
- Response response = doHttpRequest(MGMT_PORT, "/settings/indexes", "POST", new FormBody.Builder()
+ @Cleanup Response response = doHttpRequest(MGMT_PORT, "/settings/indexes", "POST", new FormBody.Builder()
.add("storageMode", "memory_optimized")
.build(), true
);
@@ -339,7 +342,7 @@ private void createBuckets() {
for (BucketDefinition bucket : buckets) {
logger().debug("Creating bucket \"" + bucket.getName() + "\"");
- Response response = doHttpRequest(MGMT_PORT, "/pools/default/buckets", "POST", new FormBody.Builder()
+ @Cleanup Response response = doHttpRequest(MGMT_PORT, "/pools/default/buckets", "POST", new FormBody.Builder()
.add("name", bucket.getName())
.add("ramQuotaMB", Integer.toString(bucket.getQuota()))
.build(), true);
@@ -353,9 +356,27 @@ private void createBuckets() {
.forStatusCode(200)
.waitUntilReady(this);
+ if (enabledServices.contains(CouchbaseService.QUERY)) {
+ // If the query service is enabled, make sure that we only proceed if the query engine also
+ // knows about the bucket in its metadata configuration.
+ Unreliables.retryUntilTrue(1, TimeUnit.MINUTES, () -> {
+ @Cleanup Response queryResponse = doHttpRequest(QUERY_PORT, "/query/service", "POST", new FormBody.Builder()
+ .add("statement", "SELECT COUNT(*) > 0 as present FROM system:keyspaces WHERE name = \"" + bucket.getName() + "\"")
+ .build(), true);
+
+ String body = queryResponse.body() != null ? queryResponse.body().string() : null;
+ checkSuccessfulResponse(queryResponse, "Could not poll query service state for bucket: " + bucket.getName());
+
+ return Optional.of(MAPPER.readTree(body))
+ .map(n -> n.at("/results/0/present"))
+ .map(JsonNode::asBoolean)
+ .orElse(false);
+ });
+ }
+
if (bucket.hasPrimaryIndex()) {
if (enabledServices.contains(CouchbaseService.QUERY)) {
- Response queryResponse = doHttpRequest(QUERY_PORT, "/query/service", "POST", new FormBody.Builder()
+ @Cleanup Response queryResponse = doHttpRequest(QUERY_PORT, "/query/service", "POST", new FormBody.Builder()
.add("statement", "CREATE PRIMARY INDEX on `" + bucket.getName() + "`")
.build(), true);
@@ -384,14 +405,8 @@ private String getInternalIpAddress() {
* @param message the message that should be part of the exception of not successful.
*/
private void checkSuccessfulResponse(final Response response, final String message) {
- try {
- if (!response.isSuccessful()) {
- throw new IllegalStateException(message + ": " + response.toString());
- }
- } finally {
- if (response.body() != null) {
- response.body().close();
- }
+ if (!response.isSuccessful()) {
+ throw new IllegalStateException(message + ": " + response.toString());
}
}
From 48534069037e17147208e65c3c7d3d03e3c83a47 Mon Sep 17 00:00:00 2001
From: Michael Nitschinger
Date: Fri, 29 May 2020 15:02:06 +0200
Subject: [PATCH 0139/4341] Bump Couchbase Server Image Version (#2804)
6.5.1 got released in april 2020 and brings bugfixes and
enhancements. Let's make sure users pick that up by default.
---
.../java/org/testcontainers/couchbase/CouchbaseContainer.java | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
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 92b35da3361..ee4b3212cac 100644
--- a/modules/couchbase/src/main/java/org/testcontainers/couchbase/CouchbaseContainer.java
+++ b/modules/couchbase/src/main/java/org/testcontainers/couchbase/CouchbaseContainer.java
@@ -71,7 +71,7 @@ public class CouchbaseContainer extends GenericContainer {
private static final String DOCKER_IMAGE_NAME = "couchbase/server";
- private static final String VERSION = "6.5.0";
+ private static final String VERSION = "6.5.1";
private static final ObjectMapper MAPPER = new ObjectMapper();
From c8edde492d76899abe3a4abd2faeef7d23b6801c Mon Sep 17 00:00:00 2001
From: Richard North
Date: Fri, 29 May 2020 15:49:51 +0100
Subject: [PATCH 0140/4341] Update mkdocs.yml
---
mkdocs.yml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/mkdocs.yml b/mkdocs.yml
index c28e0827f7c..795a2bdb4e2 100644
--- a/mkdocs.yml
+++ b/mkdocs.yml
@@ -90,4 +90,4 @@ nav:
- contributing.md
- contributing_docs.md
extra:
- latest_version: 1.14.2
+ latest_version: 1.14.3
From ee37dfce15f1be44e93123362c791466716bcffe Mon Sep 17 00:00:00 2001
From: "dependabot-preview[bot]"
<27856297+dependabot-preview[bot]@users.noreply.github.com>
Date: Sat, 30 May 2020 15:48:17 +0100
Subject: [PATCH 0141/4341] Bump aws-java-sdk-logs from 1.11.789 to 1.11.792 in
/modules/localstack (#2822)
Bumps [aws-java-sdk-logs](https://github.com/aws/aws-sdk-java) from 1.11.789 to 1.11.792.
- [Release notes](https://github.com/aws/aws-sdk-java/releases)
- [Changelog](https://github.com/aws/aws-sdk-java/blob/master/CHANGELOG.md)
- [Commits](https://github.com/aws/aws-sdk-java/compare/1.11.789...1.11.792)
Signed-off-by: dependabot-preview[bot]
Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>
---
modules/localstack/build.gradle | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/modules/localstack/build.gradle b/modules/localstack/build.gradle
index 857b752ec1e..a6a73430c17 100644
--- a/modules/localstack/build.gradle
+++ b/modules/localstack/build.gradle
@@ -6,6 +6,6 @@ dependencies {
compileOnly 'com.amazonaws:aws-java-sdk-s3:1.11.784'
testCompile 'com.amazonaws:aws-java-sdk-s3:1.11.782'
testCompile 'com.amazonaws:aws-java-sdk-sqs:1.11.789'
- testCompile 'com.amazonaws:aws-java-sdk-logs:1.11.789'
+ testCompile 'com.amazonaws:aws-java-sdk-logs:1.11.792'
testCompile 'software.amazon.awssdk:s3:2.13.23'
}
From 904337623fd75653e580faefce57dab854148b33 Mon Sep 17 00:00:00 2001
From: "dependabot-preview[bot]"
<27856297+dependabot-preview[bot]@users.noreply.github.com>
Date: Sat, 30 May 2020 15:48:51 +0100
Subject: [PATCH 0142/4341] Bump aws-java-sdk-sqs from 1.11.789 to 1.11.792 in
/modules/localstack (#2820)
Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>
Co-authored-by: Richard North
---
modules/localstack/build.gradle | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/modules/localstack/build.gradle b/modules/localstack/build.gradle
index a6a73430c17..f3e093a49b8 100644
--- a/modules/localstack/build.gradle
+++ b/modules/localstack/build.gradle
@@ -5,7 +5,7 @@ dependencies {
compileOnly 'com.amazonaws:aws-java-sdk-s3:1.11.784'
testCompile 'com.amazonaws:aws-java-sdk-s3:1.11.782'
- testCompile 'com.amazonaws:aws-java-sdk-sqs:1.11.789'
+ testCompile 'com.amazonaws:aws-java-sdk-sqs:1.11.792'
testCompile 'com.amazonaws:aws-java-sdk-logs:1.11.792'
testCompile 'software.amazon.awssdk:s3:2.13.23'
}
From 0a6e4159005db2b350041017422b175782ca7246 Mon Sep 17 00:00:00 2001
From: "dependabot-preview[bot]"
<27856297+dependabot-preview[bot]@users.noreply.github.com>
Date: Sat, 30 May 2020 15:57:42 +0100
Subject: [PATCH 0143/4341] Bump solr-solrj from 8.5.1 to 8.5.2 in /examples
(#2819)
Bumps solr-solrj from 8.5.1 to 8.5.2.
Signed-off-by: dependabot-preview[bot]
Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>
---
examples/solr-container/build.gradle | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/examples/solr-container/build.gradle b/examples/solr-container/build.gradle
index 7e9b7a8c71f..5845753cb08 100644
--- a/examples/solr-container/build.gradle
+++ b/examples/solr-container/build.gradle
@@ -10,7 +10,7 @@ dependencies {
compileOnly "org.projectlombok:lombok:1.18.10"
annotationProcessor "org.projectlombok:lombok:1.18.10"
- implementation 'org.apache.solr:solr-solrj:8.5.1'
+ implementation 'org.apache.solr:solr-solrj:8.5.2'
testImplementation 'org.testcontainers:testcontainers'
testImplementation 'org.testcontainers:solr'
From 46f085d0fe54a3a55ca5f80410911c73b98c4ea3 Mon Sep 17 00:00:00 2001
From: "dependabot-preview[bot]"
<27856297+dependabot-preview[bot]@users.noreply.github.com>
Date: Sat, 30 May 2020 15:57:51 +0100
Subject: [PATCH 0144/4341] Bump mssql-jdbc from 8.3.0.jre8-preview to
8.3.1.jre8-preview in /modules/mssqlserver (#2823)
Bumps [mssql-jdbc](https://github.com/Microsoft/mssql-jdbc) from 8.3.0.jre8-preview to 8.3.1.jre8-preview.
- [Release notes](https://github.com/Microsoft/mssql-jdbc/releases)
- [Changelog](https://github.com/microsoft/mssql-jdbc/blob/dev/CHANGELOG.md)
- [Commits](https://github.com/Microsoft/mssql-jdbc/commits)
Signed-off-by: dependabot-preview[bot]
Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>
---
modules/mssqlserver/build.gradle | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/modules/mssqlserver/build.gradle b/modules/mssqlserver/build.gradle
index 8cdfa35dee1..bfb9777ddfa 100644
--- a/modules/mssqlserver/build.gradle
+++ b/modules/mssqlserver/build.gradle
@@ -10,12 +10,12 @@ dependencies {
compileOnly 'io.r2dbc:r2dbc-mssql:0.8.2.RELEASE'
testCompile project(':jdbc-test')
- testCompile 'com.microsoft.sqlserver:mssql-jdbc:8.3.0.jre8-preview'
+ testCompile 'com.microsoft.sqlserver:mssql-jdbc:8.3.1.jre8-preview'
testCompile project(':r2dbc')
testCompile 'io.r2dbc:r2dbc-mssql:0.8.1.RELEASE'
// MSSQL's wait strategy requires the JDBC driver
testCompile testFixtures(project(':r2dbc'))
- testCompile 'com.microsoft.sqlserver:mssql-jdbc:8.3.0.jre8-preview'
+ testCompile 'com.microsoft.sqlserver:mssql-jdbc:8.3.1.jre8-preview'
}
From 289188be6d58c20b042fa7016453fe39875b6e28 Mon Sep 17 00:00:00 2001
From: "dependabot-preview[bot]"
<27856297+dependabot-preview[bot]@users.noreply.github.com>
Date: Sat, 30 May 2020 15:58:02 +0100
Subject: [PATCH 0145/4341] Bump r2dbc-postgresql from 0.8.2.RELEASE to
0.8.3.RELEASE in /modules/postgresql (#2824)
Bumps [r2dbc-postgresql](https://github.com/r2dbc/r2dbc-postgresql) from 0.8.2.RELEASE to 0.8.3.RELEASE.
- [Release notes](https://github.com/r2dbc/r2dbc-postgresql/releases)
- [Changelog](https://github.com/r2dbc/r2dbc-postgresql/blob/v0.8.3.RELEASE/CHANGELOG)
- [Commits](https://github.com/r2dbc/r2dbc-postgresql/compare/v0.8.2.RELEASE...v0.8.3.RELEASE)
Signed-off-by: dependabot-preview[bot]
Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>
---
modules/postgresql/build.gradle | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/modules/postgresql/build.gradle b/modules/postgresql/build.gradle
index 380a3f86a80..1d808b1555d 100644
--- a/modules/postgresql/build.gradle
+++ b/modules/postgresql/build.gradle
@@ -7,12 +7,12 @@ dependencies {
compile project(':jdbc')
compileOnly project(':r2dbc')
- compileOnly 'io.r2dbc:r2dbc-postgresql:0.8.2.RELEASE'
+ compileOnly 'io.r2dbc:r2dbc-postgresql:0.8.3.RELEASE'
testCompile project(':jdbc-test')
testCompile project(':test-support')
testCompile 'org.postgresql:postgresql:42.2.12'
testCompile testFixtures(project(':r2dbc'))
- testCompile 'io.r2dbc:r2dbc-postgresql:0.8.1.RELEASE'
+ testCompile 'io.r2dbc:r2dbc-postgresql:0.8.3.RELEASE'
}
From f6e48a49963be968b4662cfe8493c219daf82d29 Mon Sep 17 00:00:00 2001
From: "dependabot-preview[bot]"
<27856297+dependabot-preview[bot]@users.noreply.github.com>
Date: Sat, 30 May 2020 15:59:17 +0100
Subject: [PATCH 0146/4341] Bump aws-java-sdk-s3 from 1.11.784 to 1.11.792 in
/modules/localstack (#2817)
Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>
Co-authored-by: Richard North
---
modules/localstack/build.gradle | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/modules/localstack/build.gradle b/modules/localstack/build.gradle
index f3e093a49b8..f35d38c3530 100644
--- a/modules/localstack/build.gradle
+++ b/modules/localstack/build.gradle
@@ -3,8 +3,8 @@ description = "Testcontainers :: Localstack"
dependencies {
compile project(':testcontainers')
- compileOnly 'com.amazonaws:aws-java-sdk-s3:1.11.784'
- testCompile 'com.amazonaws:aws-java-sdk-s3:1.11.782'
+ compileOnly 'com.amazonaws:aws-java-sdk-s3:1.11.792'
+ testCompile 'com.amazonaws:aws-java-sdk-s3:1.11.792'
testCompile 'com.amazonaws:aws-java-sdk-sqs:1.11.792'
testCompile 'com.amazonaws:aws-java-sdk-logs:1.11.792'
testCompile 'software.amazon.awssdk:s3:2.13.23'
From 9a4a4a971eed573f77629ec025aeea10cb9114c8 Mon Sep 17 00:00:00 2001
From: "dependabot-preview[bot]"
<27856297+dependabot-preview[bot]@users.noreply.github.com>
Date: Sat, 30 May 2020 16:10:06 +0100
Subject: [PATCH 0147/4341] Bump r2dbc-mssql from 0.8.2.RELEASE to
0.8.3.RELEASE in /modules/mssqlserver (#2821)
Bumps [r2dbc-mssql](https://github.com/r2dbc/r2dbc-mssql) from 0.8.2.RELEASE to 0.8.3.RELEASE.
- [Release notes](https://github.com/r2dbc/r2dbc-mssql/releases)
- [Changelog](https://github.com/r2dbc/r2dbc-mssql/blob/v0.8.3.RELEASE/CHANGELOG)
- [Commits](https://github.com/r2dbc/r2dbc-mssql/compare/v0.8.2.RELEASE...v0.8.3.RELEASE)
Signed-off-by: dependabot-preview[bot]
Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>
Co-authored-by: Richard North
---
modules/mssqlserver/build.gradle | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/modules/mssqlserver/build.gradle b/modules/mssqlserver/build.gradle
index bfb9777ddfa..d9e01fe3a57 100644
--- a/modules/mssqlserver/build.gradle
+++ b/modules/mssqlserver/build.gradle
@@ -7,13 +7,13 @@ dependencies {
compile project(':jdbc')
compileOnly project(':r2dbc')
- compileOnly 'io.r2dbc:r2dbc-mssql:0.8.2.RELEASE'
+ compileOnly 'io.r2dbc:r2dbc-mssql:0.8.3.RELEASE'
testCompile project(':jdbc-test')
testCompile 'com.microsoft.sqlserver:mssql-jdbc:8.3.1.jre8-preview'
testCompile project(':r2dbc')
- testCompile 'io.r2dbc:r2dbc-mssql:0.8.1.RELEASE'
+ testCompile 'io.r2dbc:r2dbc-mssql:0.8.3.RELEASE'
// MSSQL's wait strategy requires the JDBC driver
testCompile testFixtures(project(':r2dbc'))
From a5b4f2c6f8d9ee778389358040464fa1ca6f156e Mon Sep 17 00:00:00 2001
From: "dependabot-preview[bot]"
<27856297+dependabot-preview[bot]@users.noreply.github.com>
Date: Sat, 30 May 2020 16:18:07 +0100
Subject: [PATCH 0148/4341] Bump testcontainers from 1.14.2 to 1.14.3 in /core
(#2818)
Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>
Co-authored-by: Richard North
---
core/build.gradle | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/core/build.gradle b/core/build.gradle
index 48bbf57d7e9..efe90a8b68d 100644
--- a/core/build.gradle
+++ b/core/build.gradle
@@ -104,7 +104,7 @@ if (!org.gradle.internal.os.OperatingSystem.current().isWindows()) {
}
dependencies {
- baseline 'org.testcontainers:testcontainers:1.14.2', {
+ baseline 'org.testcontainers:testcontainers:1.14.3', {
exclude group: "*", module: "*"
}
From 0eb2dea4298088e35c59f7bf947812d807f9006e Mon Sep 17 00:00:00 2001
From: Joseph Petersen
Date: Mon, 1 Jun 2020 19:22:27 +0200
Subject: [PATCH 0149/4341] Switch to latest v5 release of release-drafter
(#2815)
Co-authored-by: Kevin Wittek
---
.github/workflows/release-drafter.yml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/.github/workflows/release-drafter.yml b/.github/workflows/release-drafter.yml
index 6f4e849bd5b..3123c3f6fac 100644
--- a/.github/workflows/release-drafter.yml
+++ b/.github/workflows/release-drafter.yml
@@ -9,6 +9,6 @@ jobs:
update_release_draft:
runs-on: ubuntu-latest
steps:
- - uses: release-drafter/release-drafter@v5.2.0
+ - uses: release-drafter/release-drafter@v5.9.0
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
From c3b85deb8a7bafac64bc47a01531522bfd7ba3b5 Mon Sep 17 00:00:00 2001
From: Erhun Baycelik
Date: Thu, 4 Jun 2020 15:51:05 +0300
Subject: [PATCH 0150/4341] [Documentation Update] Update Mysql and Postgres
tests example URLs (#2832)
Tests url was outdated.
---
docs/modules/databases/jdbc.md | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/docs/modules/databases/jdbc.md b/docs/modules/databases/jdbc.md
index 5f83d7fcdeb..21393455a9f 100644
--- a/docs/modules/databases/jdbc.md
+++ b/docs/modules/databases/jdbc.md
@@ -115,5 +115,5 @@ Note that if you use `@Rule`, you will be given an isolated container for each t
Examples/Tests:
- * [MySQL](https://github.com/testcontainers/testcontainers-java/blob/master/modules/jdbc-test/src/test/java/org/testcontainers/junit/SimpleMySQLTest.java)
- * [PostgreSQL](https://github.com/testcontainers/testcontainers-java/blob/master/modules/jdbc-test/src/test/java/org/testcontainers/junit/SimplePostgreSQLTest.java)
\ No newline at end of file
+ * [MySQL](https://github.com/testcontainers/testcontainers-java/blob/master/modules/mysql/src/test/java/org/testcontainers/junit/mysql/SimpleMySQLTest.java)
+ * [PostgreSQL](https://github.com/testcontainers/testcontainers-java/blob/master/modules/postgresql/src/test/java/org/testcontainers/junit/postgresql/SimplePostgreSQLTest.java)
From e94e13e67a9dadcc5e0fffb32d4827a25d176d89 Mon Sep 17 00:00:00 2001
From: Alexander Zapasnik
Date: Thu, 4 Jun 2020 23:19:00 +0300
Subject: [PATCH 0151/4341] Migrate default postgis image to use the new docker
hub repo (#2797)
Co-authored-by: Kevin Wittek
---
.../testcontainers/containers/PostgisContainerProvider.java | 4 ++--
.../testcontainers/jdbc/postgis/PostgisJDBCDriverTest.java | 2 +-
2 files changed, 3 insertions(+), 3 deletions(-)
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 83f15e3fd6f..54c87a84648 100644
--- a/modules/postgresql/src/main/java/org/testcontainers/containers/PostgisContainerProvider.java
+++ b/modules/postgresql/src/main/java/org/testcontainers/containers/PostgisContainerProvider.java
@@ -10,8 +10,8 @@
public class PostgisContainerProvider extends JdbcDatabaseContainerProvider {
private static final String NAME = "postgis";
- private static final String DEFAULT_TAG = "10";
- private static final String DEFAULT_IMAGE = "mdillon/postgis";
+ private static final String DEFAULT_TAG = "12-3.0";
+ private static final String DEFAULT_IMAGE = "postgis/postgis";
public static final String USER_PARAM = "user";
public static final String PASSWORD_PARAM = "password";
diff --git a/modules/postgresql/src/test/java/org/testcontainers/jdbc/postgis/PostgisJDBCDriverTest.java b/modules/postgresql/src/test/java/org/testcontainers/jdbc/postgis/PostgisJDBCDriverTest.java
index 551ba86e185..b1d01441016 100644
--- a/modules/postgresql/src/test/java/org/testcontainers/jdbc/postgis/PostgisJDBCDriverTest.java
+++ b/modules/postgresql/src/test/java/org/testcontainers/jdbc/postgis/PostgisJDBCDriverTest.java
@@ -16,7 +16,7 @@ public static Iterable data() {
return asList(
new Object[][]{
{"jdbc:tc:postgis://hostname/databasename?user=someuser&password=somepwd", EnumSet.of(Options.JDBCParams)},
- {"jdbc:tc:postgis:9.6://hostname/databasename?user=someuser&password=somepwd", EnumSet.of(Options.JDBCParams)},
+ {"jdbc:tc:postgis:9.6-2.5://hostname/databasename?user=someuser&password=somepwd", EnumSet.of(Options.JDBCParams)},
});
}
}
From 617cb73acb05d8f1fd8d2d626313d16fb8bff7ca Mon Sep 17 00:00:00 2001
From: SahilWadhwa
Date: Fri, 5 Jun 2020 20:11:48 +0530
Subject: [PATCH 0152/4341] Enable AWS KMS For LocalStack 0.10.8 (#2812)
Co-authored-by: Sahil
---
.../localstack/LocalStackContainer.java | 3 ++-
.../localstack/LocalstackContainerTest.java | 26 ++++++++++++++++---
2 files changed, 24 insertions(+), 5 deletions(-)
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 96cedb37726..72eb320c729 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
@@ -252,7 +252,8 @@ public enum Service {
STEPFUNCTIONS("stepfunctions", 4585),
CLOUDWATCHLOGS("logs", 4586),
STS("sts", 4592),
- IAM("iam", 4593);
+ IAM("iam", 4593),
+ KMS("kms", 4599);
String localStackName;
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 ee5945d0aff..d4e2f0c2864 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
@@ -1,6 +1,11 @@
package org.testcontainers.containers.localstack;
+import com.amazonaws.services.kms.AWSKMS;
+import com.amazonaws.services.kms.AWSKMSClientBuilder;
+import com.amazonaws.services.kms.model.CreateKeyRequest;
+import com.amazonaws.services.kms.model.CreateKeyResult;
+import com.amazonaws.services.kms.model.Tag;
import com.amazonaws.services.logs.AWSLogs;
import com.amazonaws.services.logs.AWSLogsClientBuilder;
import com.amazonaws.services.logs.model.CreateLogGroupRequest;
@@ -38,9 +43,7 @@
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.S3;
-import static org.testcontainers.containers.localstack.LocalStackContainer.Service.SQS;
-import static org.testcontainers.containers.localstack.LocalStackContainer.Service.CLOUDWATCHLOGS;
+import static org.testcontainers.containers.localstack.LocalStackContainer.Service.*;
/**
* Tests for Localstack Container, used both in bridge network (exposed to host) and docker network modes.
@@ -58,7 +61,7 @@ public static class WithoutNetwork {
// without_network {
@ClassRule
public static LocalStackContainer localstack = new LocalStackContainer()
- .withServices(S3, SQS, CLOUDWATCHLOGS);
+ .withServices(S3, SQS, CLOUDWATCHLOGS, KMS);
// }
@Test
@@ -135,6 +138,21 @@ public void cloudWatchLogsTestOverBridgeNetwork() {
assertEquals("One log group should be created", 1, groups.size());
assertEquals("Name of created log group is [foo]", "foo", groups.get(0).getLogGroupName());
}
+
+ @Test
+ public void kmsKeyCreationTest() {
+ AWSKMS awskms = AWSKMSClientBuilder.standard()
+ .withEndpointConfiguration(localstack.getEndpointConfiguration(KMS))
+ .withCredentials(localstack.getDefaultCredentialsProvider())
+ .build();
+
+ String desc = String.format("AWS CMK Description");
+ Tag createdByTag = new Tag().withTagKey("CreatedBy").withTagValue("StorageService");
+ CreateKeyRequest req = new CreateKeyRequest().withDescription(desc).withTags(createdByTag);
+ CreateKeyResult key = awskms.createKey(req);
+
+ assertEquals("AWS KMS Customer Managed Key should be created ", key.getKeyMetadata().getDescription(), desc);
+ }
}
public static class WithNetwork {
From ff73a5e355ce72097fd2d7f7e0bf3879f213a514 Mon Sep 17 00:00:00 2001
From: Sergei Egorov
Date: Fri, 5 Jun 2020 21:31:23 +0200
Subject: [PATCH 0153/4341] Clean up the deprecated methods (#2835)
* Clean up the deprecated methods
* fix the examples project
* add japicmp excludes
---
core/build.gradle | 44 +-
.../containers/AmbassadorContainer.java | 67 ---
.../testcontainers/containers/Container.java | 28 --
.../containers/GenericContainer.java | 110 +----
.../containers/traits/VncService.java | 22 -
.../containers/wait/HostPortWaitStrategy.java | 31 --
.../containers/wait/HttpWaitStrategy.java | 77 ----
.../wait/LogMessageWaitStrategy.java | 29 --
.../testcontainers/containers/wait/Wait.java | 67 ---
.../containers/wait/WaitAllStrategy.java | 41 --
.../containers/wait/WaitStrategy.java | 38 --
.../AuditLoggingDockerClient.java | 4 +-
.../AuthDelegatingDockerClientConfig.java | 7 +-
.../dockerclient/DockerClientConfigUtils.java | 11 +-
.../DockerClientProviderStrategy.java | 1 -
.../okhttp/NamedPipeSocketFactory.java | 134 ------
.../okhttp/OkHttpDockerCmdExecFactory.java | 162 -------
.../okhttp/OkHttpInvocationBuilder.java | 414 ------------------
.../transport/okhttp/OkHttpWebTarget.java | 113 -----
.../transport/okhttp/UnixSocketFactory.java | 92 ----
.../utility/ResourceReaper.java | 5 -
.../linkedcontainer/RedmineContainer.java | 2 +-
.../containers/ClickHouseContainer.java | 2 +-
.../containers/PostgreSQLContainer.java | 3 +-
.../containers/BrowserWebDriverContainer.java | 16 +-
25 files changed, 58 insertions(+), 1462 deletions(-)
delete mode 100644 core/src/main/java/org/testcontainers/containers/AmbassadorContainer.java
delete mode 100644 core/src/main/java/org/testcontainers/containers/traits/VncService.java
delete mode 100644 core/src/main/java/org/testcontainers/containers/wait/HostPortWaitStrategy.java
delete mode 100644 core/src/main/java/org/testcontainers/containers/wait/HttpWaitStrategy.java
delete mode 100644 core/src/main/java/org/testcontainers/containers/wait/LogMessageWaitStrategy.java
delete mode 100644 core/src/main/java/org/testcontainers/containers/wait/Wait.java
delete mode 100644 core/src/main/java/org/testcontainers/containers/wait/WaitAllStrategy.java
delete mode 100644 core/src/main/java/org/testcontainers/containers/wait/WaitStrategy.java
rename core/src/main/java/org/testcontainers/dockerclient/{auth => }/AuthDelegatingDockerClientConfig.java (90%)
delete mode 100644 core/src/main/java/org/testcontainers/dockerclient/transport/okhttp/NamedPipeSocketFactory.java
delete mode 100644 core/src/main/java/org/testcontainers/dockerclient/transport/okhttp/OkHttpDockerCmdExecFactory.java
delete mode 100644 core/src/main/java/org/testcontainers/dockerclient/transport/okhttp/OkHttpInvocationBuilder.java
delete mode 100644 core/src/main/java/org/testcontainers/dockerclient/transport/okhttp/OkHttpWebTarget.java
delete mode 100644 core/src/main/java/org/testcontainers/dockerclient/transport/okhttp/UnixSocketFactory.java
diff --git a/core/build.gradle b/core/build.gradle
index efe90a8b68d..5011d24d70c 100644
--- a/core/build.gradle
+++ b/core/build.gradle
@@ -89,9 +89,43 @@ task japicmp(type: me.champeau.gradle.japicmp.JapicmpTask) {
"org.testcontainers.shaded.*",
]
+ // TODO remove once 1.15.0 is released
+ classExcludes = [
+ "org.testcontainers.containers.AmbassadorContainer",
+ "org.testcontainers.containers.traits.VncService",
+ "org.testcontainers.containers.wait.HostPortWaitStrategy",
+ "org.testcontainers.containers.wait.HttpWaitStrategy",
+ "org.testcontainers.containers.wait.LogMessageWaitStrategy",
+ "org.testcontainers.containers.wait.Wait",
+ "org.testcontainers.containers.wait.WaitAllStrategy",
+ "org.testcontainers.containers.wait.WaitStrategy",
+ "org.testcontainers.dockerclient.AuditLoggingDockerClient",
+ "org.testcontainers.dockerclient.auth.AuthDelegatingDockerClientConfig",
+ "org.testcontainers.containers.GenericContainer\$AbstractWaitStrategy",
+ "org.testcontainers.dockerclient.transport.okhttp.NamedPipeSocketFactory",
+ "org.testcontainers.dockerclient.transport.okhttp.OkHttpDockerCmdExecFactory",
+ "org.testcontainers.dockerclient.transport.okhttp.UnixSocketFactory",
+ ]
+
methodExcludes = [
- // METHOD_NEW_DEFAULT
- "org.testcontainers.containers.ContainerState#getHost()"
+ "org.testcontainers.dockerclient.DockerClientConfigUtils#getDetectedDockerHostIp()",
+ "org.testcontainers.dockerclient.DockerClientConfigUtils#getDockerHostIpAddress(com.github.dockerjava.core.DockerClientConfig)",
+
+ "org.testcontainers.utility.ResourceReaper#start(java.lang.String, com.github.dockerjava.api.DockerClient, boolean)",
+
+ "org.testcontainers.containers.Container#fetchDockerDaemonInfo()",
+ "org.testcontainers.containers.Container#getDockerDaemonInfo()",
+
+ "org.testcontainers.containers.GenericContainer#fetchDockerDaemonInfo()",
+ "org.testcontainers.containers.GenericContainer#getDockerDaemonInfo()",
+
+ "org.testcontainers.containers.Container\$ExecResult#Container\$ExecResult(java.lang.String, java.lang.String)",
+ ]
+
+ fieldExcludes = [
+ "org.testcontainers.containers.GenericContainer#containerId",
+ "org.testcontainers.containers.GenericContainer#containerName",
+ "org.testcontainers.containers.GenericContainer#dockerDaemonInfo",
]
onlyBinaryIncompatibleModified = true
@@ -127,10 +161,6 @@ dependencies {
compile "net.java.dev.jna:jna-platform:5.5.0"
- shaded ('org.scala-sbt.ipcsocket:ipcsocket:1.0.1') {
- exclude(group: "net.java.dev.jna")
- }
-
shaded ('com.github.docker-java:docker-java-transport-okhttp:3.2.1') {
exclude(group: 'net.java.dev.jna')
exclude(group: 'com.google.code.findbug')
@@ -140,8 +170,6 @@ dependencies {
shaded "org.yaml:snakeyaml:1.25"
- shaded 'com.squareup.okhttp3:okhttp:3.14.8'
-
shaded 'org.glassfish.main.external:trilead-ssh2-repackaged:4.1.2'
shaded 'org.zeroturnaround:zt-exec:1.10', {
diff --git a/core/src/main/java/org/testcontainers/containers/AmbassadorContainer.java b/core/src/main/java/org/testcontainers/containers/AmbassadorContainer.java
deleted file mode 100644
index 0b86821d293..00000000000
--- a/core/src/main/java/org/testcontainers/containers/AmbassadorContainer.java
+++ /dev/null
@@ -1,67 +0,0 @@
-package org.testcontainers.containers;
-
-import com.github.dockerjava.api.exception.DockerException;
-import com.github.dockerjava.api.model.Container;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-import org.testcontainers.containers.traits.LinkableContainer;
-import org.testcontainers.utility.TestcontainersConfiguration;
-
-import java.util.List;
-
-import static java.util.Arrays.asList;
-
-/**
- * An ambassador container is used as a TCP proxy, enabling any TCP port of another linked container to be exposed
- * publicly, even if that container does not make the port public itself. The richnorth/ambassador:latest
- * container is used (based on HAProxy).
- *
- * @deprecated use {@link SocatContainer}
- */
-@EqualsAndHashCode(callSuper = false)
-@Data
-@Deprecated
-public class AmbassadorContainer> extends GenericContainer {
-
- private final String otherContainerName;
- private final String serviceName;
- private final int servicePort;
-
- public AmbassadorContainer(LinkableContainer otherContainer, String serviceName, int servicePort) {
- super(TestcontainersConfiguration.getInstance().getAmbassadorContainerImage());
-
- /*
- Use the unique 'identifierPrefix' (random compose project name) so that the ambassador can see
- the container it's supposed to be proxying.
- */
- this.otherContainerName = otherContainer.getContainerName();
- this.serviceName = serviceName;
- this.servicePort = servicePort;
-
- // Link
- addLink(otherContainer, serviceName);
-
- // Expose ambassador's port
- addExposedPort(servicePort);
-
- // Tell the proxy what to connect to within the docker network
- addEnv("SERVICE_NAME", serviceName);
- addEnv("SERVICE_PORT", String.format("%d", servicePort));
- }
-
- public boolean isServiceReady() {
- try {
- List allContainers = dockerClient.listContainersCmd().withShowAll(true).exec();
-
- for (Container container : allContainers) {
- if (asList(container.getNames()).contains("/" + otherContainerName) && !container.getStatus().contains("Exited")) {
- return true;
- }
- }
-
- } catch (DockerException e) {
- return false;
- }
- return false;
- }
-}
diff --git a/core/src/main/java/org/testcontainers/containers/Container.java b/core/src/main/java/org/testcontainers/containers/Container.java
index 631e2653ceb..9c1cb7f8034 100644
--- a/core/src/main/java/org/testcontainers/containers/Container.java
+++ b/core/src/main/java/org/testcontainers/containers/Container.java
@@ -2,7 +2,6 @@
import com.github.dockerjava.api.DockerClient;
import com.github.dockerjava.api.model.Bind;
-import com.github.dockerjava.api.model.Info;
import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.NonNull;
@@ -13,14 +12,9 @@
import org.testcontainers.containers.startupcheck.StartupCheckStrategy;
import org.testcontainers.containers.traits.LinkableContainer;
import org.testcontainers.containers.wait.strategy.WaitStrategy;
-import org.testcontainers.images.builder.Transferable;
import org.testcontainers.utility.LogUtils;
import org.testcontainers.utility.MountableFile;
-import org.testcontainers.utility.ThrowingFunction;
-import java.io.IOException;
-import java.io.InputStream;
-import java.nio.charset.Charset;
import java.time.Duration;
import java.util.List;
import java.util.Map;
@@ -48,14 +42,6 @@ class ExecResult {
int exitCode;
String stdout;
String stderr;
-
- /**
- * @deprecated should not be instantiated outside of the library, please migrate
- */
- @Deprecated
- public ExecResult(String stdout, String stderr) {
- this(-1, stdout, stderr);
- }
}
/**
@@ -413,13 +399,6 @@ default void followOutput(Consumer consumer, OutputFrame.OutputType
*/
SELF withLogConsumer(Consumer consumer);
- /**
- *
- * @deprecated please use {@code org.testcontainers.DockerClientFactory.instance().client().infoCmd().exec()}
- */
- @Deprecated
- Info fetchDockerDaemonInfo() throws IOException;
-
List getPortBindings();
List getExtraHosts();
@@ -447,13 +426,6 @@ default void followOutput(Consumer consumer, OutputFrame.OutputType
DockerClient getDockerClient();
- /**
- *
- * @deprecated please use {@code org.testcontainers.DockerClientFactory.instance().client().infoCmd().exec()}
- */
- @Deprecated
- Info getDockerDaemonInfo();
-
void setExposedPorts(List exposedPorts);
void setPortBindings(List portBindings);
diff --git a/core/src/main/java/org/testcontainers/containers/GenericContainer.java b/core/src/main/java/org/testcontainers/containers/GenericContainer.java
index d906c320bd5..072129de60c 100644
--- a/core/src/main/java/org/testcontainers/containers/GenericContainer.java
+++ b/core/src/main/java/org/testcontainers/containers/GenericContainer.java
@@ -44,8 +44,8 @@
import org.testcontainers.containers.startupcheck.MinimumDurationRunningStartupCheckStrategy;
import org.testcontainers.containers.startupcheck.StartupCheckStrategy;
import org.testcontainers.containers.traits.LinkableContainer;
-import org.testcontainers.containers.wait.Wait;
-import org.testcontainers.containers.wait.WaitStrategy;
+import org.testcontainers.containers.wait.strategy.Wait;
+import org.testcontainers.containers.wait.strategy.WaitStrategy;
import org.testcontainers.containers.wait.strategy.WaitStrategyTarget;
import org.testcontainers.images.ImagePullPolicy;
import org.testcontainers.images.RemoteDockerImage;
@@ -190,30 +190,13 @@ public class GenericContainer>
@Setter(AccessLevel.NONE)
protected DockerClient dockerClient = DockerClientFactory.lazyClient();
- /*
- * Info about the Docker server; lazily fetched.
- */
- @Setter(AccessLevel.NONE)
- protected Info dockerDaemonInfo = null;
-
/**
* Set during container startup
- * // TODO make it private
*
- * @deprecated use {@link ContainerState#getContainerId()}
*/
@Setter(AccessLevel.NONE)
- @Deprecated
- protected String containerId;
-
- /**
- * Set during container startup
- *
- * @deprecated use {@link GenericContainer#getContainerInfo()}
- */
- @Setter(AccessLevel.NONE)
- @Deprecated
- protected String containerName;
+ @VisibleForTesting
+ String containerId;
@Setter(AccessLevel.NONE)
private InspectContainerResponse containerInfo;
@@ -426,7 +409,6 @@ private void tryStart(Instant startedAt) {
// Tell subclasses that we're starting
containerInfo = dockerClient.inspectContainerCmd(containerId).exec();
- containerName = containerInfo.getName();
containerIsStarting(containerInfo, reused);
// Wait until the container has reached the desired running state
@@ -1322,18 +1304,6 @@ public SELF withLogConsumer(Consumer consumer) {
return self();
}
- /**
- * {@inheritDoc}
- */
- @Override
- public synchronized Info fetchDockerDaemonInfo() throws IOException {
-
- if (this.dockerDaemonInfo == null) {
- this.dockerDaemonInfo = this.dockerClient.infoCmd().exec();
- }
- return this.dockerDaemonInfo;
- }
-
/**
* {@inheritDoc}
*/
@@ -1403,74 +1373,8 @@ public int hashCode() {
return System.identityHashCode(this);
}
- /**
- * Convenience class with access to non-public members of GenericContainer.
- *
- * @deprecated use {@link org.testcontainers.containers.wait.strategy.AbstractWaitStrategy}
- */
- @Deprecated
- public static abstract class AbstractWaitStrategy extends org.testcontainers.containers.wait.strategy.AbstractWaitStrategy implements WaitStrategy {
- protected GenericContainer container;
-
- @NonNull
- protected Duration startupTimeout = Duration.ofSeconds(60);
-
- /**
- * Wait until the container has started.
- *
- * @param container the container for which to wait
- */
- @Override
- public void waitUntilReady(GenericContainer container) {
- this.container = container;
- waitUntilReady();
- }
-
- /**
- * Wait until {@link #container} has started.
- */
- protected abstract void waitUntilReady();
-
- /**
- * Set the duration of waiting time until container treated as started.
- *
- * @param startupTimeout timeout
- * @return this
- * @see WaitStrategy#waitUntilReady(GenericContainer)
- */
- public WaitStrategy withStartupTimeout(Duration startupTimeout) {
- this.startupTimeout = startupTimeout;
- return this;
- }
-
- /**
- * @return the container's logger
- */
- protected Logger logger() {
- return container.logger();
- }
-
- /**
- * @return the port on which to check if the container is ready
- * @deprecated see {@link AbstractWaitStrategy#getLivenessCheckPorts()}
- */
- @Deprecated
- protected Integer getLivenessCheckPort() {
- return container.getLivenessCheckPort();
- }
-
- /**
- * @return the ports on which to check if the container is ready
- */
- protected Set getLivenessCheckPorts() {
- return container.getLivenessCheckPorts();
- }
-
- /**
- * @return the rate limiter to use
- */
- protected RateLimiter getRateLimiter() {
- return DOCKER_CLIENT_RATE_LIMITER;
- }
+ @Override
+ public String getContainerName() {
+ return getContainerInfo().getName();
}
}
diff --git a/core/src/main/java/org/testcontainers/containers/traits/VncService.java b/core/src/main/java/org/testcontainers/containers/traits/VncService.java
deleted file mode 100644
index c0f6458c2c0..00000000000
--- a/core/src/main/java/org/testcontainers/containers/traits/VncService.java
+++ /dev/null
@@ -1,22 +0,0 @@
-package org.testcontainers.containers.traits;
-
-/**
- * A container which exposes a VNC server.
- */
-@Deprecated
-public interface VncService {
- /**
- * @return a URL which can be used to connect to the VNC server from the machine running the tests. Exposed for convenience, e.g. to aid manual debugging
- */
- String getVncAddress();
-
- /**
- * @return the VNC password for this server
- */
- String getPassword();
-
- /**
- * @return the port number on which the VNC server is running
- */
- int getPort();
-}
diff --git a/core/src/main/java/org/testcontainers/containers/wait/HostPortWaitStrategy.java b/core/src/main/java/org/testcontainers/containers/wait/HostPortWaitStrategy.java
deleted file mode 100644
index e208b80345d..00000000000
--- a/core/src/main/java/org/testcontainers/containers/wait/HostPortWaitStrategy.java
+++ /dev/null
@@ -1,31 +0,0 @@
-package org.testcontainers.containers.wait;
-
-import lombok.extern.slf4j.Slf4j;
-import org.testcontainers.containers.GenericContainer;
-
-import java.time.Duration;
-
-/**
- * Waits until a socket connection can be established on a port exposed or mapped by the container.
- *
- * @author richardnorth
- *
- * @deprecated Use {@link org.testcontainers.containers.wait.strategy.HostPortWaitStrategy}
- */
-@Deprecated
-@Slf4j
-public class HostPortWaitStrategy extends GenericContainer.AbstractWaitStrategy {
-
- private org.testcontainers.containers.wait.strategy.HostPortWaitStrategy delegateStrategy = new org.testcontainers.containers.wait.strategy.HostPortWaitStrategy();
-
- @Override
- protected void waitUntilReady() {
- delegateStrategy.waitUntilReady(this.waitStrategyTarget);
- }
-
- @Override
- public WaitStrategy withStartupTimeout(Duration startupTimeout) {
- delegateStrategy.withStartupTimeout(startupTimeout);
- return super.withStartupTimeout(startupTimeout);
- }
-}
diff --git a/core/src/main/java/org/testcontainers/containers/wait/HttpWaitStrategy.java b/core/src/main/java/org/testcontainers/containers/wait/HttpWaitStrategy.java
deleted file mode 100644
index d27133c499d..00000000000
--- a/core/src/main/java/org/testcontainers/containers/wait/HttpWaitStrategy.java
+++ /dev/null
@@ -1,77 +0,0 @@
-package org.testcontainers.containers.wait;
-
-import org.testcontainers.containers.GenericContainer;
-
-import java.util.function.Predicate;
-
-/**
- * Waits until an HTTP(S) endpoint returns a given status code.
- *
- * @author Pete Cornish {@literal }
- *
- * @deprecated Use {@link org.testcontainers.containers.wait.strategy.HttpWaitStrategy}
- */
-@Deprecated
-public class HttpWaitStrategy extends GenericContainer.AbstractWaitStrategy {
-
- private org.testcontainers.containers.wait.strategy.HttpWaitStrategy delegateStrategy = new org.testcontainers.containers.wait.strategy.HttpWaitStrategy();
-
- /**
- * Waits for the given status code.
- *
- * @param statusCode the expected status code
- * @return this
- */
- public HttpWaitStrategy forStatusCode(int statusCode) {
- delegateStrategy.forStatusCode(statusCode);
- return this;
- }
-
- /**
- * Waits for the given path.
- *
- * @param path the path to check
- * @return this
- */
- public HttpWaitStrategy forPath(String path) {
- delegateStrategy.forPath(path);
- return this;
- }
-
- /**
- * Indicates that the status check should use HTTPS.
- *
- * @return this
- */
- public HttpWaitStrategy usingTls() {
- delegateStrategy.usingTls();
- return this;
- }
-
- /**
- * Authenticate with HTTP Basic Authorization credentials.
- *
- * @param username the username
- * @param password the password
- * @return this
- */
- public HttpWaitStrategy withBasicCredentials(String username, String password) {
- delegateStrategy.withBasicCredentials(username, password);
- return this;
- }
-
- /**
- * Waits for the response to pass the given predicate
- * @param responsePredicate The predicate to test the response against
- * @return this
- */
- public HttpWaitStrategy forResponsePredicate(Predicate responsePredicate) {
- delegateStrategy.forResponsePredicate(responsePredicate);
- return this;
- }
-
- @Override
- protected void waitUntilReady() {
- delegateStrategy.waitUntilReady(this.waitStrategyTarget);
- }
-}
diff --git a/core/src/main/java/org/testcontainers/containers/wait/LogMessageWaitStrategy.java b/core/src/main/java/org/testcontainers/containers/wait/LogMessageWaitStrategy.java
deleted file mode 100644
index a21b6b66a59..00000000000
--- a/core/src/main/java/org/testcontainers/containers/wait/LogMessageWaitStrategy.java
+++ /dev/null
@@ -1,29 +0,0 @@
-package org.testcontainers.containers.wait;
-
-import org.testcontainers.containers.GenericContainer;
-
-/**
- * Waits until containers logs expected content.
- *
- * @deprecated Use {@link org.testcontainers.containers.wait.strategy.LogMessageWaitStrategy}
- */
-@Deprecated
-public class LogMessageWaitStrategy extends GenericContainer.AbstractWaitStrategy {
-
- private org.testcontainers.containers.wait.strategy.LogMessageWaitStrategy delegateWaitStrategy = new org.testcontainers.containers.wait.strategy.LogMessageWaitStrategy();
-
- @Override
- protected void waitUntilReady() {
- delegateWaitStrategy.waitUntilReady(this.waitStrategyTarget);
- }
-
- public LogMessageWaitStrategy withRegEx(String regEx) {
- delegateWaitStrategy.withRegEx(regEx);
- return this;
- }
-
- public LogMessageWaitStrategy withTimes(int times) {
- delegateWaitStrategy.withTimes(times);
- return this;
- }
-}
diff --git a/core/src/main/java/org/testcontainers/containers/wait/Wait.java b/core/src/main/java/org/testcontainers/containers/wait/Wait.java
deleted file mode 100644
index 66d055395c5..00000000000
--- a/core/src/main/java/org/testcontainers/containers/wait/Wait.java
+++ /dev/null
@@ -1,67 +0,0 @@
-package org.testcontainers.containers.wait;
-
-import java.net.HttpURLConnection;
-
-/**
- * Convenience class with logic for building common {@link WaitStrategy} instances.
- *
- * @author Pete Cornish {@literal }
- *
- * @deprecated Use {@link org.testcontainers.containers.wait.strategy.Wait}
- */
-@Deprecated
-public class Wait {
- /**
- * Convenience method to return the default WaitStrategy.
- *
- * @return a WaitStrategy
- */
- public static WaitStrategy defaultWaitStrategy() {
- return forListeningPort();
- }
-
- /**
- * Convenience method to return a WaitStrategy for an exposed or mapped port.
- *
- * @return the WaitStrategy
- * @see HostPortWaitStrategy
- */
- public static HostPortWaitStrategy forListeningPort() {
- return new HostPortWaitStrategy();
- }
-
- /**
- * Convenience method to return a WaitStrategy for an HTTP endpoint.
- *
- * @param path the path to check
- * @return the WaitStrategy
- * @see HttpWaitStrategy
- */
- public static HttpWaitStrategy forHttp(String path) {
- return new HttpWaitStrategy()
- .forPath(path);
- }
-
- /**
- * Convenience method to return a WaitStrategy for an HTTPS endpoint.
- *
- * @param path the path to check
- * @return the WaitStrategy
- * @see HttpWaitStrategy
- */
- public static HttpWaitStrategy forHttps(String path) {
- return forHttp(path)
- .usingTls();
- }
-
- /**
- * Convenience method to return a WaitStrategy for log messages.
- *
- * @param regex the regex pattern to check for
- * @param times the number of times the pattern is expected
- * @return LogMessageWaitStrategy
- */
- public static LogMessageWaitStrategy forLogMessage(String regex, int times) {
- return new LogMessageWaitStrategy().withRegEx(regex).withTimes(times);
- }
-}
diff --git a/core/src/main/java/org/testcontainers/containers/wait/WaitAllStrategy.java b/core/src/main/java/org/testcontainers/containers/wait/WaitAllStrategy.java
deleted file mode 100644
index 7e3032cd76d..00000000000
--- a/core/src/main/java/org/testcontainers/containers/wait/WaitAllStrategy.java
+++ /dev/null
@@ -1,41 +0,0 @@
-package org.testcontainers.containers.wait;
-
-import org.rnorth.ducttape.timeouts.Timeouts;
-import org.testcontainers.containers.GenericContainer;
-
-import java.time.Duration;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.concurrent.TimeUnit;
-
-/**
- * Wait strategy that waits for a number of other strategies to pass in series.
- *
- * @deprecated Use {@link org.testcontainers.containers.wait.strategy.WaitAllStrategy}
- */
-@Deprecated
-public class WaitAllStrategy implements WaitStrategy {
-
- private final List strategies = new ArrayList<>();
- private Duration timeout = Duration.ofSeconds(30);
-
- @Override
- public void waitUntilReady(GenericContainer container) {
- Timeouts.doWithTimeout((int) timeout.toMillis(), TimeUnit.MILLISECONDS, () -> {
- for (WaitStrategy strategy : strategies) {
- strategy.waitUntilReady(container);
- }
- });
- }
-
- public WaitAllStrategy withStrategy(WaitStrategy strategy) {
- this.strategies.add(strategy);
- return this;
- }
-
- @Override
- public WaitStrategy withStartupTimeout(Duration startupTimeout) {
- this.timeout = startupTimeout;
- return this;
- }
-}
diff --git a/core/src/main/java/org/testcontainers/containers/wait/WaitStrategy.java b/core/src/main/java/org/testcontainers/containers/wait/WaitStrategy.java
deleted file mode 100644
index ee2c14d90ae..00000000000
--- a/core/src/main/java/org/testcontainers/containers/wait/WaitStrategy.java
+++ /dev/null
@@ -1,38 +0,0 @@
-package org.testcontainers.containers.wait;
-
-import org.testcontainers.containers.GenericContainer;
-import org.testcontainers.containers.wait.strategy.WaitStrategyTarget;
-
-import java.time.Duration;
-
-/**
- * Approach to determine whether a container is ready.
- *
- * @author Pete Cornish {@literal }
- *
- * @deprecated Use {@link org.testcontainers.containers.wait.strategy.WaitStrategy}
- */
-@Deprecated
-public interface WaitStrategy extends org.testcontainers.containers.wait.strategy.WaitStrategy {
- /**
- * Wait until the container has started.
- *
- * @param container the container for which to wait
- */
- default void waitUntilReady(GenericContainer container) {
- this.waitUntilReady((WaitStrategyTarget)container);
- }
-
- /**
- * @param startupTimeout the duration for which to wait
- * @return this
- */
- WaitStrategy withStartupTimeout(Duration startupTimeout);
-
- /**
- * {@inheritDoc}
- */
- default void waitUntilReady(WaitStrategyTarget waitStrategyTarget) {
- //default method for backwards compatibility
- }
-}
diff --git a/core/src/main/java/org/testcontainers/dockerclient/AuditLoggingDockerClient.java b/core/src/main/java/org/testcontainers/dockerclient/AuditLoggingDockerClient.java
index 891709e3a0c..2dc88cad313 100644
--- a/core/src/main/java/org/testcontainers/dockerclient/AuditLoggingDockerClient.java
+++ b/core/src/main/java/org/testcontainers/dockerclient/AuditLoggingDockerClient.java
@@ -16,12 +16,10 @@
* Wrapper for {@link DockerClient} to facilitate 'audit logging' of potentially destruction actions using
* {@link org.testcontainers.utility.AuditLogger}.
*
- * @deprecated should not be used publicly
*/
@Slf4j
@SuppressWarnings("unchecked")
-@Deprecated
-public class AuditLoggingDockerClient implements DockerClient {
+class AuditLoggingDockerClient implements DockerClient {
@Delegate(excludes = InterceptedMethods.class)
private final DockerClient wrappedClient;
diff --git a/core/src/main/java/org/testcontainers/dockerclient/auth/AuthDelegatingDockerClientConfig.java b/core/src/main/java/org/testcontainers/dockerclient/AuthDelegatingDockerClientConfig.java
similarity index 90%
rename from core/src/main/java/org/testcontainers/dockerclient/auth/AuthDelegatingDockerClientConfig.java
rename to core/src/main/java/org/testcontainers/dockerclient/AuthDelegatingDockerClientConfig.java
index a68605fdfda..c78a13c99ac 100644
--- a/core/src/main/java/org/testcontainers/dockerclient/auth/AuthDelegatingDockerClientConfig.java
+++ b/core/src/main/java/org/testcontainers/dockerclient/AuthDelegatingDockerClientConfig.java
@@ -1,4 +1,4 @@
-package org.testcontainers.dockerclient.auth;
+package org.testcontainers.dockerclient;
import com.github.dockerjava.api.model.AuthConfig;
import com.github.dockerjava.core.DockerClientConfig;
@@ -15,11 +15,10 @@
* to try and obtain auth credentials, but after that {@link RegistryAuthLocator} will be
* used to try and improve the auth resolution (e.g. using credential helpers).
*
- * @deprecated should not be used publicly, to be moved to docker-java
+ * TODO move to docker-java
*/
@Slf4j
-@Deprecated
-public class AuthDelegatingDockerClientConfig implements DockerClientConfig {
+class AuthDelegatingDockerClientConfig implements DockerClientConfig {
@Delegate(excludes = DelegateExclusions.class)
private DockerClientConfig delegate;
diff --git a/core/src/main/java/org/testcontainers/dockerclient/DockerClientConfigUtils.java b/core/src/main/java/org/testcontainers/dockerclient/DockerClientConfigUtils.java
index 1060d663d65..b494eb087f6 100644
--- a/core/src/main/java/org/testcontainers/dockerclient/DockerClientConfigUtils.java
+++ b/core/src/main/java/org/testcontainers/dockerclient/DockerClientConfigUtils.java
@@ -1,6 +1,5 @@
package org.testcontainers.dockerclient;
-import com.github.dockerjava.core.DockerClientConfig;
import lombok.Getter;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
@@ -18,10 +17,6 @@ public class DockerClientConfigUtils {
// See https://github.com/docker/docker/blob/a9fa38b1edf30b23cae3eade0be48b3d4b1de14b/daemon/initlayer/setup_unix.go#L25
public static final boolean IN_A_CONTAINER = new File("/.dockerenv").exists();
- @Deprecated
- @Getter(lazy = true)
- private static final Optional detectedDockerHostIp = IN_A_CONTAINER ? getDefaultGateway() : Optional.empty();
-
@Getter(lazy = true)
private static final Optional defaultGateway = Optional
.ofNullable(DockerClientFactory.instance().runInsideDocker(
@@ -45,13 +40,9 @@ public class DockerClientConfigUtils {
.filter(StringUtils::isNotBlank);
/**
- * Use {@link DockerClientFactory#dockerHostIpAddress()}
+ * @deprecated use {@link DockerClientProviderStrategy#getDockerHostIpAddress()}
*/
@Deprecated
- public static String getDockerHostIpAddress(DockerClientConfig config) {
- return getDockerHostIpAddress(config.getDockerHost());
- }
-
public static String getDockerHostIpAddress(URI dockerHost) {
switch (dockerHost.getScheme()) {
case "http":
diff --git a/core/src/main/java/org/testcontainers/dockerclient/DockerClientProviderStrategy.java b/core/src/main/java/org/testcontainers/dockerclient/DockerClientProviderStrategy.java
index c305d56389c..f0af6d51ae2 100644
--- a/core/src/main/java/org/testcontainers/dockerclient/DockerClientProviderStrategy.java
+++ b/core/src/main/java/org/testcontainers/dockerclient/DockerClientProviderStrategy.java
@@ -16,7 +16,6 @@
import org.rnorth.ducttape.unreliables.Unreliables;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import org.testcontainers.dockerclient.auth.AuthDelegatingDockerClientConfig;
import org.testcontainers.utility.TestcontainersConfiguration;
import java.net.URI;
diff --git a/core/src/main/java/org/testcontainers/dockerclient/transport/okhttp/NamedPipeSocketFactory.java b/core/src/main/java/org/testcontainers/dockerclient/transport/okhttp/NamedPipeSocketFactory.java
deleted file mode 100644
index d26e2977318..00000000000
--- a/core/src/main/java/org/testcontainers/dockerclient/transport/okhttp/NamedPipeSocketFactory.java
+++ /dev/null
@@ -1,134 +0,0 @@
-package org.testcontainers.dockerclient.transport.okhttp;
-
-import com.sun.jna.platform.win32.Kernel32;
-import lombok.EqualsAndHashCode;
-import lombok.SneakyThrows;
-import lombok.Value;
-import org.rnorth.ducttape.unreliables.Unreliables;
-
-import javax.net.SocketFactory;
-import java.io.*;
-import java.net.InetAddress;
-import java.net.Socket;
-import java.net.SocketAddress;
-import java.util.concurrent.TimeUnit;
-
-/**
- * @deprecated use com.github.docker-java:docker-java-transport-okhttp
- */
-@Deprecated
-@Value
-@EqualsAndHashCode(callSuper = false)
-public class NamedPipeSocketFactory extends SocketFactory {
-
- String socketFileName;
-
- @Override
- @SneakyThrows
- public Socket createSocket() {
- return new Socket() {
-
- RandomAccessFile file;
- InputStream is;
- OutputStream os;
-
- @Override
- public void close() throws IOException {
- if (file != null) {
- file.close();
- file = null;
- }
- }
-
- @Override
- public void connect(SocketAddress endpoint) {
- connect(endpoint, 0);
- }
-
- @Override
- public void connect(SocketAddress endpoint, int timeout) {
- file = Unreliables.retryUntilSuccess(Math.max(timeout, 10_000), TimeUnit.MILLISECONDS, () -> {
- try {
- return new RandomAccessFile(socketFileName, "rw");
- } catch (FileNotFoundException e) {
- Kernel32.INSTANCE.WaitNamedPipe(socketFileName, 100);
- throw e;
- }
- });
-
- is = new InputStream() {
- @Override
- public int read(byte[] bytes, int off, int len) throws IOException {
- if (OkHttpInvocationBuilder.CLOSING.get()) {
- return 0;
- }
- return file.read(bytes, off, len);
- }
-
- @Override
- public int read() throws IOException {
- if (OkHttpInvocationBuilder.CLOSING.get()) {
- return 0;
- }
- return file.read();
- }
-
- @Override
- public int read(byte[] bytes) throws IOException {
- if (OkHttpInvocationBuilder.CLOSING.get()) {
- return 0;
- }
- return file.read(bytes);
- }
- };
-
- os = new OutputStream() {
- @Override
- public void write(byte[] bytes, int off, int len) throws IOException {
- file.write(bytes, off, len);
- }
-
- @Override
- public void write(int value) throws IOException {
- file.write(value);
- }
-
- @Override
- public void write(byte[] bytes) throws IOException {
- file.write(bytes);
- }
- };
- }
-
- @Override
- public InputStream getInputStream() {
- return is;
- }
-
- @Override
- public OutputStream getOutputStream() {
- return os;
- }
- };
- }
-
- @Override
- public Socket createSocket(String s, int i) {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public Socket createSocket(String s, int i, InetAddress inetAddress, int i1) {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public Socket createSocket(InetAddress inetAddress, int i) {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public Socket createSocket(InetAddress inetAddress, int i, InetAddress inetAddress1, int i1) {
- throw new UnsupportedOperationException();
- }
-}
diff --git a/core/src/main/java/org/testcontainers/dockerclient/transport/okhttp/OkHttpDockerCmdExecFactory.java b/core/src/main/java/org/testcontainers/dockerclient/transport/okhttp/OkHttpDockerCmdExecFactory.java
deleted file mode 100644
index 4da568834d5..00000000000
--- a/core/src/main/java/org/testcontainers/dockerclient/transport/okhttp/OkHttpDockerCmdExecFactory.java
+++ /dev/null
@@ -1,162 +0,0 @@
-package org.testcontainers.dockerclient.transport.okhttp;
-
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.github.dockerjava.api.command.PingCmd;
-import com.github.dockerjava.core.AbstractDockerCmdExecFactory;
-import com.github.dockerjava.core.DockerClientConfig;
-import com.github.dockerjava.core.SSLConfig;
-import com.github.dockerjava.core.WebTarget;
-import com.github.dockerjava.core.exec.PingCmdExec;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.MultimapBuilder;
-import lombok.SneakyThrows;
-import lombok.extern.slf4j.Slf4j;
-import okhttp3.ConnectionPool;
-import okhttp3.Dns;
-import okhttp3.HttpUrl;
-import okhttp3.OkHttpClient;
-import org.apache.commons.io.IOUtils;
-
-import javax.net.ssl.SSLContext;
-import javax.net.ssl.X509TrustManager;
-import java.io.IOException;
-import java.net.InetAddress;
-import java.net.URI;
-import java.security.cert.X509Certificate;
-import java.util.Collections;
-import java.util.concurrent.TimeUnit;
-
-/**
- * @deprecated use com.github.docker-java:docker-java-transport-okhttp
- */
-@Deprecated
-@Slf4j
-public class OkHttpDockerCmdExecFactory extends AbstractDockerCmdExecFactory {
-
- private static final String SOCKET_SUFFIX = ".socket";
-
- private ObjectMapper objectMapper;
-
- private OkHttpClient okHttpClient;
-
- private HttpUrl baseUrl;
-
- @Override
- @SneakyThrows
- public void init(DockerClientConfig dockerClientConfig) {
- super.init(dockerClientConfig);
-
- OkHttpClient.Builder clientBuilder = new OkHttpClient.Builder()
- .readTimeout(0, TimeUnit.SECONDS)
- .retryOnConnectionFailure(true);
-
- URI dockerHost = dockerClientConfig.getDockerHost();
- switch (dockerHost.getScheme()) {
- case "unix":
- case "npipe":
- String socketPath = dockerHost.getPath();
-
- if ("unix".equals(dockerHost.getScheme())) {
- clientBuilder
- .socketFactory(new UnixSocketFactory(socketPath));
- } else {
- clientBuilder
- .socketFactory(new NamedPipeSocketFactory(socketPath));
- }
-
- clientBuilder
- // Disable pooling
- .connectionPool(new ConnectionPool(0, 1, TimeUnit.SECONDS))
- .dns(hostname -> {
- if (hostname.endsWith(SOCKET_SUFFIX)) {
- return Collections.singletonList(InetAddress.getByAddress(hostname, new byte[]{0, 0, 0, 0}));
- } else {
- return Dns.SYSTEM.lookup(hostname);
- }
- });
- default:
- }
-
- SSLConfig sslConfig = dockerClientConfig.getSSLConfig();
- if (sslConfig != null) {
- SSLContext sslContext = sslConfig.getSSLContext();
- if (sslContext != null) {
- clientBuilder
- .sslSocketFactory(sslContext.getSocketFactory(), new TrustAllX509TrustManager());
- }
- }
-
- okHttpClient = clientBuilder.build();
-
- HttpUrl.Builder baseUrlBuilder;
-
- switch (dockerHost.getScheme()) {
- case "unix":
- case "npipe":
- baseUrlBuilder = new HttpUrl.Builder()
- .scheme("http")
- .host("docker" + SOCKET_SUFFIX);
- break;
- case "tcp":
- baseUrlBuilder = new HttpUrl.Builder()
- .scheme(sslConfig != null && sslConfig.getSSLContext() != null ? "https" : "http")
- .host(dockerHost.getHost())
- .port(dockerHost.getPort());
- break;
- default:
- baseUrlBuilder = HttpUrl.get(dockerHost.toString()).newBuilder();
- }
- baseUrl = baseUrlBuilder.build();
-
- objectMapper = dockerClientConfig.getObjectMapper();
- }
-
- @Override
- protected OkHttpWebTarget getBaseResource() {
- return new OkHttpWebTarget(
- objectMapper,
- okHttpClient,
- baseUrl,
- ImmutableList.of(),
- MultimapBuilder.hashKeys().hashSetValues().build()
- );
- }
-
- @Override
- public PingCmd.Exec createPingCmdExec() {
- return new PingCmdExec(getBaseResource(), getDockerClientConfig()) {
-
- @Override
- protected Void execute(PingCmd command) {
- WebTarget webResource = getBaseResource().path("/_ping");
-
- // TODO contribute to docker-java, make it close the stream
- IOUtils.closeQuietly(webResource.request().get());
-
- return null;
- }
- };
- }
-
- @Override
- public void close() throws IOException {
-
- }
-
- private static class TrustAllX509TrustManager implements X509TrustManager {
- @Override
- public void checkClientTrusted(X509Certificate[] x509Certificates, String s) {
-
- }
-
- @Override
- public void checkServerTrusted(X509Certificate[] x509Certificates, String s) {
-
- }
-
- @Override
- public X509Certificate[] getAcceptedIssuers() {
- return new X509Certificate[0];
- }
- }
-}
diff --git a/core/src/main/java/org/testcontainers/dockerclient/transport/okhttp/OkHttpInvocationBuilder.java b/core/src/main/java/org/testcontainers/dockerclient/transport/okhttp/OkHttpInvocationBuilder.java
deleted file mode 100644
index cada10328ec..00000000000
--- a/core/src/main/java/org/testcontainers/dockerclient/transport/okhttp/OkHttpInvocationBuilder.java
+++ /dev/null
@@ -1,414 +0,0 @@
-package org.testcontainers.dockerclient.transport.okhttp;
-
-import com.fasterxml.jackson.core.JsonProcessingException;
-import com.fasterxml.jackson.core.type.TypeReference;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.github.dockerjava.api.async.ResultCallback;
-import com.github.dockerjava.api.exception.BadRequestException;
-import com.github.dockerjava.api.exception.ConflictException;
-import com.github.dockerjava.api.exception.DockerException;
-import com.github.dockerjava.api.exception.InternalServerErrorException;
-import com.github.dockerjava.api.exception.NotAcceptableException;
-import com.github.dockerjava.api.exception.NotFoundException;
-import com.github.dockerjava.api.exception.NotModifiedException;
-import com.github.dockerjava.api.exception.UnauthorizedException;
-import com.github.dockerjava.api.model.Frame;
-import com.github.dockerjava.api.model.StreamType;
-import com.github.dockerjava.core.InvocationBuilder;
-import lombok.AccessLevel;
-import lombok.RequiredArgsConstructor;
-import lombok.SneakyThrows;
-import lombok.experimental.FieldDefaults;
-import lombok.extern.slf4j.Slf4j;
-import okhttp3.HttpUrl;
-import okhttp3.MediaType;
-import okhttp3.OkHttpClient;
-import okhttp3.Request;
-import okhttp3.RequestBody;
-import okhttp3.Response;
-import okhttp3.internal.connection.RealConnection;
-import okio.*;
-import org.jetbrains.annotations.Nullable;
-import org.testcontainers.DockerClientFactory;
-
-import java.io.ByteArrayInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.lang.reflect.Field;
-import java.nio.ByteBuffer;
-import java.util.Arrays;
-import java.util.Objects;
-import java.util.function.Consumer;
-
-@Slf4j
-@FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true)
-class OkHttpInvocationBuilder implements InvocationBuilder {
-
- static final ThreadLocal CLOSING = ThreadLocal.withInitial(() -> false);
-
- ObjectMapper objectMapper;
-
- OkHttpClient okHttpClient;
-
- Request.Builder requestBuilder;
-
- public OkHttpInvocationBuilder(ObjectMapper objectMapper, OkHttpClient okHttpClient, HttpUrl httpUrl) {
- this.objectMapper = objectMapper;
- this.okHttpClient = okHttpClient;
-
- requestBuilder = new Request.Builder()
- .url(httpUrl);
- }
-
- @Override
- public OkHttpInvocationBuilder accept(com.github.dockerjava.core.MediaType mediaType) {
- return header("accept", mediaType.getMediaType());
- }
-
- @Override
- public OkHttpInvocationBuilder header(String name, String value) {
- requestBuilder.header(name, value);
- return this;
- }
-
- @Override
- @SneakyThrows
- public void delete() {
- Request request = requestBuilder
- .delete()
- .build();
-
- execute(request).close();
- }
-
- @Override
- @SneakyThrows
- public void get(ResultCallback resultCallback) {
- Request request = requestBuilder
- .get()
- .build();
-
- executeAndStream(
- request,
- resultCallback,
- new FramedSink(resultCallback)
- );
- }
-
- @Override
- @SneakyThrows(IOException.class)
- public T get(TypeReference typeReference) {
- try (InputStream inputStream = get()) {
- return objectMapper.readValue(inputStream, typeReference);
- }
- }
-
- @Override
- public void get(TypeReference typeReference, ResultCallback resultCallback) {
- Request request = requestBuilder
- .get()
- .build();
-
- executeAndStream(
- request,
- resultCallback,
- new JsonSink<>(objectMapper, typeReference, resultCallback)
- );
- }
-
- @Override
- @SneakyThrows
- public InputStream post(Object entity) {
- Request request = requestBuilder
- .post(RequestBody.create(MediaType.parse("application/json"), objectMapper.writeValueAsBytes(entity)))
- .build();
-
- return execute(request).body().byteStream();
- }
-
- @Override
- @SneakyThrows
- public T post(Object entity, TypeReference typeReference) {
- Request request = requestBuilder
- .post(RequestBody.create(MediaType.parse("application/json"), objectMapper.writeValueAsBytes(entity)))
- .build();
-
- try (Response response = execute(request)) {
- String inputStream = response.body().string();
- return objectMapper.readValue(inputStream, typeReference);
- }
- }
-
- @Override
- @SneakyThrows(JsonProcessingException.class)
- public void post(Object entity, TypeReference typeReference, ResultCallback resultCallback) {
- post(typeReference, resultCallback, new ByteArrayInputStream(objectMapper.writeValueAsBytes(entity)));
- }
-
- @Override
- @SneakyThrows(IOException.class)
- public T post(TypeReference typeReference, InputStream body) {
- try (InputStream inputStream = post(body)) {
- return objectMapper.readValue(inputStream, typeReference);
- }
- }
-
- @Override
- @SneakyThrows
- public void post(Object entity, InputStream stdin, ResultCallback resultCallback) {
- Request request = requestBuilder
- .post(RequestBody.create(MediaType.parse("application/json"), objectMapper.writeValueAsBytes(entity)))
- .build();
-
- OkHttpClient okHttpClient = this.okHttpClient;
-
- if (stdin != null) {
- // FIXME there must be a better way of handling it
- okHttpClient = okHttpClient.newBuilder()
- .addNetworkInterceptor(chain -> {
- Response response = chain.proceed(chain.request());
- if (response.isSuccessful()) {
- Thread thread = new Thread() {
- @Override
- @SneakyThrows
- public void run() {
- Field sinkField = RealConnection.class.getDeclaredField("sink");
- sinkField.setAccessible(true);
-
- try (
- BufferedSink sink = (BufferedSink) sinkField.get(chain.connection());
- Source source = Okio.source(stdin);
- ) {
- sink.writeAll(source);
- }
- }
- };
- thread.start();
- }
- return response;
- })
- .build();
- }
-
- executeAndStream(
- okHttpClient,
- request,
- resultCallback,
- new FramedSink(resultCallback)
- );
- }
-
- @Override
- public void post(TypeReference typeReference, ResultCallback resultCallback, InputStream body) {
- Request request = requestBuilder
- .post(toRequestBody(body, null))
- .build();
-
- executeAndStream(
- request,
- resultCallback,
- new JsonSink<>(objectMapper, typeReference, resultCallback)
- );
- }
-
- @Override
- @SneakyThrows
- public void postStream(InputStream body) {
- Request request = requestBuilder
- .post(toRequestBody(body, null))
- .build();
-
- execute(request).close();
- }
-
- @Override
- @SneakyThrows
- public InputStream get() {
- Request request = requestBuilder
- .get()
- .build();
-
- return execute(request).body().byteStream();
- }
-
- @Override
- @SneakyThrows
- public void put(InputStream body, com.github.dockerjava.core.MediaType mediaType) {
- Request request = requestBuilder
- .put(toRequestBody(body, mediaType.toString()))
- .build();
-
- execute(request).close();
- }
-
- protected RequestBody toRequestBody(InputStream body, @Nullable String mediaType) {
- return new RequestBody() {
- @Nullable
- @Override
- public MediaType contentType() {
- if (mediaType == null) {
- return null;
- }
- return MediaType.parse(mediaType);
- }
-
- @Override
- public void writeTo(BufferedSink sink) throws IOException {
- try (Source source = Okio.source(body)) {
- sink.writeAll(source);
- }
- }
- };
- }
-
- protected Response execute(Request request) {
- return execute(okHttpClient, request);
- }
-
- @SneakyThrows(IOException.class)
- protected Response execute(OkHttpClient okHttpClient, Request request) {
- Response response = okHttpClient.newCall(request).execute();
- if (!response.isSuccessful()) {
- String body = response.body().string();
- switch (response.code()) {
- case 304:
- throw new NotModifiedException(body);
- case 400:
- throw new BadRequestException(body);
- case 401:
- throw new UnauthorizedException(body);
- case 404:
- throw new NotFoundException(body);
- case 406:
- throw new NotAcceptableException(body);
- case 409:
- throw new ConflictException(body);
- case 500:
- throw new InternalServerErrorException(body);
- default:
- throw new DockerException(body, response.code());
- }
- } else {
- return response;
- }
- }
-
- protected void executeAndStream(Request request, ResultCallback callback, Consumer sourceConsumer) {
- executeAndStream(okHttpClient, request, callback, sourceConsumer);
- }
-
- protected void executeAndStream(OkHttpClient okHttpClient, Request request, ResultCallback callback, Consumer sourceConsumer) {
- Thread thread = new Thread(DockerClientFactory.TESTCONTAINERS_THREAD_GROUP, () -> {
- try (
- Response response = execute(okHttpClient, request.newBuilder().tag("streaming").build());
- BufferedSource source = response.body().source();
- ) {
- callback.onStart(() -> {
- boolean previous = CLOSING.get();
- CLOSING.set(true);
- try {
- response.close();
- } finally {
- CLOSING.set(previous);
- }
- });
-
- sourceConsumer.accept(source);
- callback.onComplete();
- } catch (Exception e) {
- callback.onError(e);
- }
- }, "tc-okhttp-stream-" + Objects.hashCode(request));
- thread.setDaemon(true);
-
- thread.start();
- }
-
- @RequiredArgsConstructor
- @FieldDefaults(makeFinal = true, level = AccessLevel.PRIVATE)
- private static class JsonSink implements Consumer {
-
- ObjectMapper objectMapper;
-
- TypeReference typeReference;
-
- ResultCallback resultCallback;
-
- @Override
- public void accept(BufferedSource source) {
- try {
- while (true) {
- String line = source.readUtf8Line();
- if (line == null) {
- break;
- }
-
- resultCallback.onNext(objectMapper.readValue(line, typeReference));
- }
- } catch (Exception e) {
- resultCallback.onError(e);
- }
- }
- }
-
- @RequiredArgsConstructor
- @FieldDefaults(makeFinal = true, level = AccessLevel.PRIVATE)
- private static class FramedSink implements Consumer {
-
- private static final int HEADER_SIZE = 8;
-
- ResultCallback resultCallback;
-
- @Override
- public void accept(BufferedSource source) {
- try {
- while (!source.exhausted()) {
- // See https://docs.docker.com/engine/api/v1.37/#operation/ContainerAttach
- // [8]byte{STREAM_TYPE, 0, 0, 0, SIZE1, SIZE2, SIZE3, SIZE4}[]byte{OUTPUT}
-
- if (!source.request(HEADER_SIZE)) {
- return;
- }
- byte[] bytes = source.readByteArray(HEADER_SIZE);
-
- StreamType streamType = streamType(bytes[0]);
-
- if (streamType == StreamType.RAW) {
- resultCallback.onNext(new Frame(StreamType.RAW, bytes));
- byte[] buffer = new byte[1024];
- while (!source.exhausted()) {
- int readBytes = source.read(buffer);
- if (readBytes != -1) {
- resultCallback.onNext(new Frame(StreamType.RAW, Arrays.copyOf(buffer, readBytes)));
- }
- }
- return;
- }
-
- int payloadSize = ByteBuffer.wrap(bytes, 4, 4).getInt();
- if (!source.request(payloadSize)) {
- return;
- }
- byte[] payload = source.readByteArray(payloadSize);
-
- resultCallback.onNext(new Frame(streamType, payload));
- }
- } catch (Exception e) {
- resultCallback.onError(e);
- }
- }
-
- private static StreamType streamType(byte streamType) {
- switch (streamType) {
- case 0:
- return StreamType.STDIN;
- case 1:
- return StreamType.STDOUT;
- case 2:
- return StreamType.STDERR;
- default:
- return StreamType.RAW;
- }
- }
- }
-}
diff --git a/core/src/main/java/org/testcontainers/dockerclient/transport/okhttp/OkHttpWebTarget.java b/core/src/main/java/org/testcontainers/dockerclient/transport/okhttp/OkHttpWebTarget.java
deleted file mode 100644
index 9c360522d20..00000000000
--- a/core/src/main/java/org/testcontainers/dockerclient/transport/okhttp/OkHttpWebTarget.java
+++ /dev/null
@@ -1,113 +0,0 @@
-package org.testcontainers.dockerclient.transport.okhttp;
-
-import com.fasterxml.jackson.core.JsonProcessingException;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.github.dockerjava.core.InvocationBuilder;
-import com.github.dockerjava.core.WebTarget;
-import com.google.common.collect.HashMultimap;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.SetMultimap;
-import lombok.SneakyThrows;
-import lombok.Value;
-import lombok.experimental.Wither;
-import okhttp3.HttpUrl;
-import okhttp3.OkHttpClient;
-import org.apache.commons.lang.StringUtils;
-
-import java.util.Collection;
-import java.util.Map;
-import java.util.Objects;
-import java.util.Set;
-import java.util.stream.Collectors;
-
-@Wither
-@Value
-class OkHttpWebTarget implements WebTarget {
-
- ObjectMapper objectMapper;
-
- OkHttpClient okHttpClient;
-
- HttpUrl baseUrl;
-
- ImmutableList path;
-
- SetMultimap queryParams;
-
- @Override
- @SneakyThrows
- public InvocationBuilder request() {
- String resource = StringUtils.join(path, "/");
-
- if (!resource.startsWith("/")) {
- resource = "/" + resource;
- }
-
- HttpUrl.Builder baseUrlBuilder = baseUrl.newBuilder()
- .encodedPath(resource);
-
- for (Map.Entry> queryParamEntry : queryParams.asMap().entrySet()) {
- String key = queryParamEntry.getKey();
- for (String paramValue : queryParamEntry.getValue()) {
- baseUrlBuilder.addQueryParameter(key, paramValue);
- }
- }
-
- return new OkHttpInvocationBuilder(
- objectMapper,
- okHttpClient,
- baseUrlBuilder.build()
- );
- }
-
- @Override
- public OkHttpWebTarget path(String... components) {
- return this.withPath(
- ImmutableList.builder()
- .addAll(path)
- .add(components)
- .build()
- );
- }
-
- @Override
- public OkHttpWebTarget resolveTemplate(String name, Object value) {
- ImmutableList.Builder newPath = ImmutableList.builder();
- for (String component : path) {
- component = component.replaceAll("\\{" + name + "\\}", value.toString());
- newPath.add(component);
- }
- return this.withPath(newPath.build());
- }
-
- @Override
- public OkHttpWebTarget queryParam(String name, Object value) {
- if (value == null) {
- return this;
- }
-
- SetMultimap newQueryParams = HashMultimap.create(queryParams);
- newQueryParams.put(name, value.toString());
-
- return this.withQueryParams(newQueryParams);
- }
-
- @Override
- public OkHttpWebTarget queryParamsSet(String name, Set> values) {
- SetMultimap newQueryParams = HashMultimap.create(queryParams);
- newQueryParams.replaceValues(name, values.stream().filter(Objects::nonNull).map(Object::toString).collect(Collectors.toSet()));
-
- return this.withQueryParams(newQueryParams);
- }
-
- @Override
- @SneakyThrows(JsonProcessingException.class)
- public OkHttpWebTarget queryParamsJsonMap(String name, Map values) {
- if (values == null || values.isEmpty()) {
- return this;
- }
-
- // when param value is JSON string
- return queryParam(name, objectMapper.writeValueAsString(values));
- }
-}
diff --git a/core/src/main/java/org/testcontainers/dockerclient/transport/okhttp/UnixSocketFactory.java b/core/src/main/java/org/testcontainers/dockerclient/transport/okhttp/UnixSocketFactory.java
deleted file mode 100644
index d1e55f3e647..00000000000
--- a/core/src/main/java/org/testcontainers/dockerclient/transport/okhttp/UnixSocketFactory.java
+++ /dev/null
@@ -1,92 +0,0 @@
-package org.testcontainers.dockerclient.transport.okhttp;
-
-import lombok.EqualsAndHashCode;
-import lombok.SneakyThrows;
-import lombok.Value;
-import org.scalasbt.ipcsocket.UnixDomainSocket;
-
-import javax.net.SocketFactory;
-import java.io.FilterInputStream;
-import java.io.FilterOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.net.InetAddress;
-import java.net.Socket;
-import java.net.SocketAddress;
-
-/**
- * @deprecated use com.github.docker-java:docker-java-transport-okhttp
- */
-@Deprecated
-@Value
-@EqualsAndHashCode(callSuper = false)
-public class UnixSocketFactory extends SocketFactory {
-
- String socketPath;
-
- @Override
- @SneakyThrows
- public Socket createSocket() {
- return new UnixDomainSocket(socketPath) {
- @Override
- public void connect(SocketAddress endpoint, int timeout) throws IOException {
- // Do nothing since it's not "connectable"
- }
-
- @Override
- public InputStream getInputStream() {
- return new FilterInputStream(super.getInputStream()) {
- @Override
- public void close() throws IOException {
- shutdownInput();
- }
-
- @Override
- public int read(byte[] b, int off, int len) throws IOException {
- if (OkHttpInvocationBuilder.CLOSING.get()) {
- return 0;
- }
- return super.read(b, off, len);
- }
- };
- }
-
- @Override
- public OutputStream getOutputStream() {
- return new FilterOutputStream(super.getOutputStream()) {
-
- @Override
- public void write(byte[] b, int off, int len) throws IOException {
- out.write(b, off, len);
- }
-
- @Override
- public void close() throws IOException {
- shutdownOutput();
- }
- };
- }
- };
- }
-
- @Override
- public Socket createSocket(String s, int i) {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public Socket createSocket(String s, int i, InetAddress inetAddress, int i1) {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public Socket createSocket(InetAddress inetAddress, int i) {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public Socket createSocket(InetAddress inetAddress, int i, InetAddress inetAddress1, int i1) {
- throw new UnsupportedOperationException();
- }
-}
diff --git a/core/src/main/java/org/testcontainers/utility/ResourceReaper.java b/core/src/main/java/org/testcontainers/utility/ResourceReaper.java
index 2f668d80426..4d44cbc3842 100644
--- a/core/src/main/java/org/testcontainers/utility/ResourceReaper.java
+++ b/core/src/main/java/org/testcontainers/utility/ResourceReaper.java
@@ -70,11 +70,6 @@ private ResourceReaper() {
dockerClient = DockerClientFactory.instance().client();
}
- @Deprecated
- public static String start(String hostIpAddress, DockerClient client, boolean withDummyMount) {
- return start(hostIpAddress, client);
- }
-
@SneakyThrows(InterruptedException.class)
public static String start(String hostIpAddress, DockerClient client) {
String ryukImage = TestcontainersConfiguration.getInstance().getRyukImage();
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 a4e8cceb558..113d0a76ec0 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
@@ -2,7 +2,7 @@
import org.testcontainers.containers.GenericContainer;
import org.testcontainers.containers.traits.LinkableContainer;
-import org.testcontainers.containers.wait.Wait;
+import org.testcontainers.containers.wait.strategy.Wait;
/**
* A Redmine container.
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 10c0e1835c2..dd48f32bece 100644
--- a/modules/clickhouse/src/main/java/org/testcontainers/containers/ClickHouseContainer.java
+++ b/modules/clickhouse/src/main/java/org/testcontainers/containers/ClickHouseContainer.java
@@ -1,6 +1,6 @@
package org.testcontainers.containers;
-import org.testcontainers.containers.wait.HttpWaitStrategy;
+import org.testcontainers.containers.wait.strategy.HttpWaitStrategy;
import java.time.Duration;
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 6ba7390878e..1c814044023 100644
--- a/modules/postgresql/src/main/java/org/testcontainers/containers/PostgreSQLContainer.java
+++ b/modules/postgresql/src/main/java/org/testcontainers/containers/PostgreSQLContainer.java
@@ -1,13 +1,12 @@
package org.testcontainers.containers;
import org.jetbrains.annotations.NotNull;
-import org.testcontainers.containers.wait.LogMessageWaitStrategy;
+import org.testcontainers.containers.wait.strategy.LogMessageWaitStrategy;
import java.time.Duration;
import java.util.HashSet;
import java.util.Set;
-import static java.lang.String.format;
import static java.time.temporal.ChronoUnit.SECONDS;
/**
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 397f6c4a2cf..16127171c59 100644
--- a/modules/selenium/src/main/java/org/testcontainers/containers/BrowserWebDriverContainer.java
+++ b/modules/selenium/src/main/java/org/testcontainers/containers/BrowserWebDriverContainer.java
@@ -19,11 +19,10 @@
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.testcontainers.containers.traits.LinkableContainer;
-import org.testcontainers.containers.traits.VncService;
-import org.testcontainers.containers.wait.HostPortWaitStrategy;
-import org.testcontainers.containers.wait.LogMessageWaitStrategy;
-import org.testcontainers.containers.wait.WaitAllStrategy;
-import org.testcontainers.containers.wait.WaitStrategy;
+import org.testcontainers.containers.wait.strategy.HostPortWaitStrategy;
+import org.testcontainers.containers.wait.strategy.LogMessageWaitStrategy;
+import org.testcontainers.containers.wait.strategy.WaitAllStrategy;
+import org.testcontainers.containers.wait.strategy.WaitStrategy;
import org.testcontainers.lifecycle.TestDescription;
import org.testcontainers.lifecycle.TestLifecycleAware;
@@ -44,7 +43,7 @@
*
* The container should expose Selenium remote control protocol and VNC.
*/
-public class BrowserWebDriverContainer> extends GenericContainer implements VncService, LinkableContainer, TestLifecycleAware {
+public class BrowserWebDriverContainer> extends GenericContainer implements LinkableContainer, TestLifecycleAware {
private static final String CHROME_IMAGE = "selenium/standalone-chrome-debug:%s";
private static final String FIREFOX_IMAGE = "selenium/standalone-firefox-debug:%s";
@@ -214,17 +213,16 @@ public URL getSeleniumAddress() {
}
}
- @Override
public String getVncAddress() {
return "vnc://vnc:secret@" + getHost() + ":" + getMappedPort(VNC_PORT);
}
- @Override
+ @Deprecated
public String getPassword() {
return DEFAULT_PASSWORD;
}
- @Override
+ @Deprecated
public int getPort() {
return VNC_PORT;
}
From ddae79c2c0ae65d3cf2e898c5aeea9fcf3a55ecd Mon Sep 17 00:00:00 2001
From: Kyle Aure
Date: Fri, 5 Jun 2020 16:22:34 -0500
Subject: [PATCH 0154/4341] Add acceptLicense method to MSSQLServerContainer
(#2085)
Co-authored-by: Richard North
---
docs/modules/databases/mssqlserver.md | 5 +++--
.../containers/MSSQLServerContainer.java | 18 +++++++++++++++---
2 files changed, 18 insertions(+), 5 deletions(-)
diff --git a/docs/modules/databases/mssqlserver.md b/docs/modules/databases/mssqlserver.md
index 9e0bec25dad..29c5435be32 100644
--- a/docs/modules/databases/mssqlserver.md
+++ b/docs/modules/databases/mssqlserver.md
@@ -10,7 +10,8 @@ Running MS SQL Server as a stand-in for in a test:
public class SomeTest {
@Rule
- public MSSQLServerContainer mssqlserver = new MSSQLServerContainer();
+ public MSSQLServerContainer mssqlserver = new MSSQLServerContainer()
+ .acceptLicense();
@Test
public void someTestMethod() {
@@ -20,7 +21,7 @@ public class SomeTest {
```
!!! warning "EULA Acceptance"
- Due to licencing restrictions you are required to accept an EULA for this container image. To indicate that you accept the MS SQL Server image EULA, Please place a file at the root of the classpath named `container-license-acceptance.txt`, e.g. at `src/test/resources/container-license-acceptance.txt`. This file should contain the line: `mcr.microsoft.com/mssql/server:2017-CU12` (or, if you are overriding the docker image name/tag, update accordingly).
+ Due to licencing restrictions you are required to accept an EULA for this container image. To indicate that you accept the MS SQL Server image EULA, call the `acceptLicense()` method, or place a file at the root of the classpath named `container-license-acceptance.txt`, e.g. at `src/test/resources/container-license-acceptance.txt`. This file should contain the line: `mcr.microsoft.com/mssql/server:2017-CU12` (or, if you are overriding the docker image name/tag, update accordingly).
Please see the [`microsoft-mssql-server` image documentation](https://hub.docker.com/_/microsoft-mssql-server#environment-variables) for a link to the EULA document.
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 b500e6fddf0..7550f820d51 100644
--- a/modules/mssqlserver/src/main/java/org/testcontainers/containers/MSSQLServerContainer.java
+++ b/modules/mssqlserver/src/main/java/org/testcontainers/containers/MSSQLServerContainer.java
@@ -50,11 +50,24 @@ protected Integer getLivenessCheckPort() {
@Override
protected void configure() {
- LicenseAcceptance.assertLicenseAccepted(this.getDockerImageName());
- addEnv("ACCEPT_EULA", "Y");
+ // If license was not accepted programatically, check if it was accepted via resource file
+ if (!getEnvMap().containsKey("ACCEPT_EULA")) {
+ LicenseAcceptance.assertLicenseAccepted(this.getDockerImageName());
+ acceptLicense();
+ }
+
addEnv("SA_PASSWORD", password);
}
+ /**
+ * Accepts the license for the SQLServer container by setting the ACCEPT_EULA=Y
+ * variable as described at https://hub.docker.com/_/microsoft-mssql-server
+ */
+ public SELF acceptLicense() {
+ addEnv("ACCEPT_EULA", "Y");
+ return self();
+ }
+
@Override
public String getDriverClassName() {
return "com.microsoft.sqlserver.jdbc.SQLServerDriver";
@@ -116,6 +129,5 @@ private void checkPasswordStrength(String password) {
"or percent (%)."
);
}
-
}
}
From 0035c311b8cd3dc342a092992efdf39d158264b6 Mon Sep 17 00:00:00 2001
From: Sergei Egorov
Date: Sat, 6 Jun 2020 09:35:01 +0200
Subject: [PATCH 0155/4341] Avoid connection leaks in `LogUtils` (#2834)
---
.../wait/strategy/LogMessageWaitStrategy.java | 37 ++++++++++++++-----
.../org/testcontainers/utility/LogUtils.java | 26 ++++++++-----
2 files changed, 44 insertions(+), 19 deletions(-)
diff --git a/core/src/main/java/org/testcontainers/containers/wait/strategy/LogMessageWaitStrategy.java b/core/src/main/java/org/testcontainers/containers/wait/strategy/LogMessageWaitStrategy.java
index bd164096300..9f7a0078f00 100644
--- a/core/src/main/java/org/testcontainers/containers/wait/strategy/LogMessageWaitStrategy.java
+++ b/core/src/main/java/org/testcontainers/containers/wait/strategy/LogMessageWaitStrategy.java
@@ -1,15 +1,21 @@
package org.testcontainers.containers.wait.strategy;
+import com.github.dockerjava.api.command.LogContainerCmd;
+import lombok.SneakyThrows;
import org.testcontainers.DockerClientFactory;
import org.testcontainers.containers.ContainerLaunchException;
+import org.testcontainers.containers.output.FrameConsumerResultCallback;
import org.testcontainers.containers.output.OutputFrame;
import org.testcontainers.containers.output.WaitingConsumer;
-import org.testcontainers.utility.LogUtils;
+import java.io.IOException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
import java.util.function.Predicate;
+import static org.testcontainers.containers.output.OutputFrame.OutputType.STDERR;
+import static org.testcontainers.containers.output.OutputFrame.OutputType.STDOUT;
+
public class LogMessageWaitStrategy extends AbstractWaitStrategy {
private String regEx;
@@ -17,18 +23,31 @@ public class LogMessageWaitStrategy extends AbstractWaitStrategy {
private int times = 1;
@Override
+ @SneakyThrows(IOException.class)
protected void waitUntilReady() {
WaitingConsumer waitingConsumer = new WaitingConsumer();
- LogUtils.followOutput(DockerClientFactory.instance().client(), waitStrategyTarget.getContainerId(), waitingConsumer);
- Predicate waitPredicate = outputFrame ->
- // (?s) enables line terminator matching (equivalent to Pattern.DOTALL)
- outputFrame.getUtf8String().matches("(?s)" + regEx);
+ LogContainerCmd cmd = DockerClientFactory.instance().client().logContainerCmd(waitStrategyTarget.getContainerId())
+ .withFollowStream(true)
+ .withSince(0)
+ .withStdOut(true)
+ .withStdErr(true);
+
+ try (FrameConsumerResultCallback callback = new FrameConsumerResultCallback()) {
+ callback.addConsumer(STDOUT, waitingConsumer);
+ callback.addConsumer(STDERR, waitingConsumer);
+
+ cmd.exec(callback);
+
+ Predicate waitPredicate = outputFrame ->
+ // (?s) enables line terminator matching (equivalent to Pattern.DOTALL)
+ outputFrame.getUtf8String().matches("(?s)" + regEx);
- try {
- waitingConsumer.waitUntil(waitPredicate, startupTimeout.getSeconds(), TimeUnit.SECONDS, times);
- } catch (TimeoutException e) {
- throw new ContainerLaunchException("Timed out waiting for log output matching '" + regEx + "'");
+ try {
+ waitingConsumer.waitUntil(waitPredicate, startupTimeout.getSeconds(), TimeUnit.SECONDS, times);
+ } catch (TimeoutException e) {
+ throw new ContainerLaunchException("Timed out waiting for log output matching '" + regEx + "'");
+ }
}
}
diff --git a/core/src/main/java/org/testcontainers/utility/LogUtils.java b/core/src/main/java/org/testcontainers/utility/LogUtils.java
index b51325cdda7..ce27387490f 100644
--- a/core/src/main/java/org/testcontainers/utility/LogUtils.java
+++ b/core/src/main/java/org/testcontainers/utility/LogUtils.java
@@ -2,12 +2,15 @@
import com.github.dockerjava.api.DockerClient;
import com.github.dockerjava.api.command.LogContainerCmd;
+import lombok.SneakyThrows;
import lombok.experimental.UtilityClass;
import org.testcontainers.containers.output.FrameConsumerResultCallback;
import org.testcontainers.containers.output.OutputFrame;
import org.testcontainers.containers.output.ToStringConsumer;
import org.testcontainers.containers.output.WaitingConsumer;
+import java.io.Closeable;
+import java.io.IOException;
import java.util.function.Consumer;
import static org.testcontainers.containers.output.OutputFrame.OutputType.STDERR;
@@ -59,6 +62,7 @@ public void followOutput(DockerClient dockerClient,
* @param types types of {@link OutputFrame} to receive
* @return all previous output frames (stdout/stderr being separated by newline characters)
*/
+ @SneakyThrows(IOException.class)
public String getOutput(DockerClient dockerClient,
String containerId,
OutputFrame.OutputType... types) {
@@ -73,17 +77,19 @@ public String getOutput(DockerClient dockerClient,
final ToStringConsumer consumer = new ToStringConsumer();
final WaitingConsumer wait = new WaitingConsumer();
- attachConsumer(dockerClient, containerId, consumer.andThen(wait), false, types);
-
- wait.waitUntilEnd();
- return consumer.toUtf8String();
+ try (Closeable closeable = attachConsumer(dockerClient, containerId, consumer.andThen(wait), false, types)) {
+ wait.waitUntilEnd();
+ return consumer.toUtf8String();
+ }
}
- private static void attachConsumer(DockerClient dockerClient,
- String containerId,
- Consumer consumer,
- boolean followStream,
- OutputFrame.OutputType... types) {
+ private static Closeable attachConsumer(
+ DockerClient dockerClient,
+ String containerId,
+ Consumer consumer,
+ boolean followStream,
+ OutputFrame.OutputType... types
+ ) {
final LogContainerCmd cmd = dockerClient.logContainerCmd(containerId)
.withFollowStream(followStream)
@@ -96,6 +102,6 @@ private static void attachConsumer(DockerClient dockerClient,
if (type == STDERR) cmd.withStdErr(true);
}
- cmd.exec(callback);
+ return cmd.exec(callback);
}
}
From 54b3a1869468866a2f2e0b0a003f5a0abcc3f2b4 Mon Sep 17 00:00:00 2001
From: "dependabot-preview[bot]"
<27856297+dependabot-preview[bot]@users.noreply.github.com>
Date: Sat, 6 Jun 2020 08:46:11 +0100
Subject: [PATCH 0156/4341] Bump mongo-java-driver from 3.12.4 to 3.12.5 in
/core (#2844)
Bumps [mongo-java-driver](https://github.com/mongodb/mongo-java-driver) from 3.12.4 to 3.12.5.
- [Release notes](https://github.com/mongodb/mongo-java-driver/releases)
- [Commits](https://github.com/mongodb/mongo-java-driver/compare/r3.12.4...r3.12.5)
Signed-off-by: dependabot-preview[bot]
Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>
---
core/build.gradle | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/core/build.gradle b/core/build.gradle
index 5011d24d70c..e728f1cd48b 100644
--- a/core/build.gradle
+++ b/core/build.gradle
@@ -179,7 +179,7 @@ dependencies {
testCompile 'org.apache.httpcomponents:httpclient:4.5.9'
testCompile 'redis.clients:jedis:3.3.0'
testCompile 'com.rabbitmq:amqp-client:5.9.0'
- testCompile 'org.mongodb:mongo-java-driver:3.12.4'
+ testCompile 'org.mongodb:mongo-java-driver:3.12.5'
testCompile ('org.mockito:mockito-core:3.3.3') {
exclude(module: 'hamcrest-core')
From a4d6963712edd0bdba21e2c7be06c622c80ec943 Mon Sep 17 00:00:00 2001
From: "dependabot-preview[bot]"
<27856297+dependabot-preview[bot]@users.noreply.github.com>
Date: Sat, 6 Jun 2020 08:48:27 +0100
Subject: [PATCH 0157/4341] Bump elasticsearch-rest-client from 7.6.2 to 7.7.1
in /modules/elasticsearch (#2841)
Bumps [elasticsearch-rest-client](https://github.com/elastic/elasticsearch) from 7.6.2 to 7.7.1.
- [Release notes](https://github.com/elastic/elasticsearch/releases)
- [Commits](https://github.com/elastic/elasticsearch/compare/v7.6.2...v7.7.1)
Signed-off-by: dependabot-preview[bot]
Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>
---
modules/elasticsearch/build.gradle | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/modules/elasticsearch/build.gradle b/modules/elasticsearch/build.gradle
index 6deaf802112..04e038864ce 100644
--- a/modules/elasticsearch/build.gradle
+++ b/modules/elasticsearch/build.gradle
@@ -2,6 +2,6 @@ description = "TestContainers :: elasticsearch"
dependencies {
compile project(':testcontainers')
- testCompile "org.elasticsearch.client:elasticsearch-rest-client:7.6.2"
+ testCompile "org.elasticsearch.client:elasticsearch-rest-client:7.7.1"
testCompile "org.elasticsearch.client:transport:6.7.1"
}
From 6d97aa2b5e3e402de7464968bb348e5f9b1049d3 Mon Sep 17 00:00:00 2001
From: "dependabot-preview[bot]"
<27856297+dependabot-preview[bot]@users.noreply.github.com>
Date: Sat, 6 Jun 2020 08:49:28 +0100
Subject: [PATCH 0158/4341] Bump postgresql from 42.2.12 to 42.2.13 in
/examples (#2842)
Bumps [postgresql](https://github.com/pgjdbc/pgjdbc) from 42.2.12 to 42.2.13.
- [Release notes](https://github.com/pgjdbc/pgjdbc/releases)
- [Changelog](https://github.com/pgjdbc/pgjdbc/blob/master/CHANGELOG.md)
- [Commits](https://github.com/pgjdbc/pgjdbc/compare/REL42.2.12...REL42.2.13)
Signed-off-by: dependabot-preview[bot]
Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>
---
examples/linked-container/build.gradle | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/examples/linked-container/build.gradle b/examples/linked-container/build.gradle
index 96dd03c602b..79b66e15c57 100644
--- a/examples/linked-container/build.gradle
+++ b/examples/linked-container/build.gradle
@@ -9,7 +9,7 @@ dependencies {
compileOnly 'org.slf4j:slf4j-api:1.7.30'
implementation 'com.squareup.okhttp3:okhttp:3.14.8'
implementation 'org.json:json:20180813'
- testImplementation 'org.postgresql:postgresql:42.2.12'
+ testImplementation 'org.postgresql:postgresql:42.2.13'
testImplementation 'ch.qos.logback:logback-classic:1.2.3'
testImplementation 'org.testcontainers:postgresql'
}
From adc3729b0d2a949df8c1f2aea1a5bfa0f64580d4 Mon Sep 17 00:00:00 2001
From: "dependabot-preview[bot]"
<27856297+dependabot-preview[bot]@users.noreply.github.com>
Date: Sat, 6 Jun 2020 08:50:02 +0100
Subject: [PATCH 0159/4341] Bump postgresql from 42.2.12 to 42.2.13 in
/modules/spock (#2840)
Bumps [postgresql](https://github.com/pgjdbc/pgjdbc) from 42.2.12 to 42.2.13.
- [Release notes](https://github.com/pgjdbc/pgjdbc/releases)
- [Changelog](https://github.com/pgjdbc/pgjdbc/blob/master/CHANGELOG.md)
- [Commits](https://github.com/pgjdbc/pgjdbc/compare/REL42.2.12...REL42.2.13)
Signed-off-by: dependabot-preview[bot]
Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>
---
modules/spock/build.gradle | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/modules/spock/build.gradle b/modules/spock/build.gradle
index fea1c8baa2d..7e1b05b7719 100644
--- a/modules/spock/build.gradle
+++ b/modules/spock/build.gradle
@@ -15,7 +15,7 @@ dependencies {
testCompile 'com.zaxxer:HikariCP:3.4.5'
testCompile 'org.apache.httpcomponents:httpclient:4.5.12'
- testRuntime 'org.postgresql:postgresql:42.2.12'
+ testRuntime 'org.postgresql:postgresql:42.2.13'
testRuntime 'mysql:mysql-connector-java:8.0.20'
}
From 7c1d2f1f4d1b7a005f48404b5418419e3ad94ca8 Mon Sep 17 00:00:00 2001
From: "dependabot-preview[bot]"
<27856297+dependabot-preview[bot]@users.noreply.github.com>
Date: Sat, 6 Jun 2020 11:48:34 +0100
Subject: [PATCH 0160/4341] Bump postgresql from 42.2.12 to 42.2.13 in
/modules/junit-jupiter (#2845)
Bumps [postgresql](https://github.com/pgjdbc/pgjdbc) from 42.2.12 to 42.2.13.
- [Release notes](https://github.com/pgjdbc/pgjdbc/releases)
- [Changelog](https://github.com/pgjdbc/pgjdbc/blob/master/CHANGELOG.md)
- [Commits](https://github.com/pgjdbc/pgjdbc/compare/REL42.2.12...REL42.2.13)
Signed-off-by: dependabot-preview[bot]
Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>
---
modules/junit-jupiter/build.gradle | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/modules/junit-jupiter/build.gradle b/modules/junit-jupiter/build.gradle
index 485e02f6089..301c7eaaecc 100644
--- a/modules/junit-jupiter/build.gradle
+++ b/modules/junit-jupiter/build.gradle
@@ -15,7 +15,7 @@ dependencies {
testCompile 'org.assertj:assertj-core:3.16.1'
testCompile 'org.junit.jupiter:junit-jupiter-params:5.6.2'
- testRuntime 'org.postgresql:postgresql:42.2.12'
+ testRuntime 'org.postgresql:postgresql:42.2.13'
testRuntime 'mysql:mysql-connector-java:8.0.20'
testRuntime 'org.junit.jupiter:junit-jupiter-engine:5.6.2'
}
From db6e555391a6c6d3d69ec3f458caf37923950672 Mon Sep 17 00:00:00 2001
From: "dependabot-preview[bot]"
<27856297+dependabot-preview[bot]@users.noreply.github.com>
Date: Sat, 6 Jun 2020 11:50:09 +0100
Subject: [PATCH 0161/4341] Bump aws-java-sdk-sqs from 1.11.792 to 1.11.797 in
/modules/localstack (#2847)
Bumps [aws-java-sdk-sqs](https://github.com/aws/aws-sdk-java) from 1.11.792 to 1.11.797.
- [Release notes](https://github.com/aws/aws-sdk-java/releases)
- [Changelog](https://github.com/aws/aws-sdk-java/blob/master/CHANGELOG.md)
- [Commits](https://github.com/aws/aws-sdk-java/compare/1.11.792...1.11.797)
Signed-off-by: dependabot-preview[bot]
Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>
---
modules/localstack/build.gradle | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/modules/localstack/build.gradle b/modules/localstack/build.gradle
index f35d38c3530..ed37cadfb65 100644
--- a/modules/localstack/build.gradle
+++ b/modules/localstack/build.gradle
@@ -5,7 +5,7 @@ dependencies {
compileOnly 'com.amazonaws:aws-java-sdk-s3:1.11.792'
testCompile 'com.amazonaws:aws-java-sdk-s3:1.11.792'
- testCompile 'com.amazonaws:aws-java-sdk-sqs:1.11.792'
+ testCompile 'com.amazonaws:aws-java-sdk-sqs:1.11.797'
testCompile 'com.amazonaws:aws-java-sdk-logs:1.11.792'
testCompile 'software.amazon.awssdk:s3:2.13.23'
}
From ec1c516d4ed77d2adf39f125c77d58acbe07b6aa Mon Sep 17 00:00:00 2001
From: "dependabot-preview[bot]"
<27856297+dependabot-preview[bot]@users.noreply.github.com>
Date: Sat, 6 Jun 2020 11:50:23 +0100
Subject: [PATCH 0162/4341] Bump s3 from 2.13.23 to 2.13.31 in
/modules/localstack (#2848)
Bumps s3 from 2.13.23 to 2.13.31.
Signed-off-by: dependabot-preview[bot]
Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>
---
modules/localstack/build.gradle | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/modules/localstack/build.gradle b/modules/localstack/build.gradle
index ed37cadfb65..4a643d5b7f5 100644
--- a/modules/localstack/build.gradle
+++ b/modules/localstack/build.gradle
@@ -7,5 +7,5 @@ dependencies {
testCompile 'com.amazonaws:aws-java-sdk-s3:1.11.792'
testCompile 'com.amazonaws:aws-java-sdk-sqs:1.11.797'
testCompile 'com.amazonaws:aws-java-sdk-logs:1.11.792'
- testCompile 'software.amazon.awssdk:s3:2.13.23'
+ testCompile 'software.amazon.awssdk:s3:2.13.31'
}
From 99cf50d09cfe6d5817f4d8b1b06e2899214ffe8a Mon Sep 17 00:00:00 2001
From: "dependabot-preview[bot]"
<27856297+dependabot-preview[bot]@users.noreply.github.com>
Date: Sat, 6 Jun 2020 11:51:18 +0100
Subject: [PATCH 0163/4341] Bump postgresql from 42.2.12 to 42.2.13 in
/modules/postgresql (#2846)
Bumps [postgresql](https://github.com/pgjdbc/pgjdbc) from 42.2.12 to 42.2.13.
- [Release notes](https://github.com/pgjdbc/pgjdbc/releases)
- [Changelog](https://github.com/pgjdbc/pgjdbc/blob/master/CHANGELOG.md)
- [Commits](https://github.com/pgjdbc/pgjdbc/compare/REL42.2.12...REL42.2.13)
Signed-off-by: dependabot-preview[bot]
Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>
---
modules/postgresql/build.gradle | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/modules/postgresql/build.gradle b/modules/postgresql/build.gradle
index 1d808b1555d..2fe381f5fb4 100644
--- a/modules/postgresql/build.gradle
+++ b/modules/postgresql/build.gradle
@@ -11,7 +11,7 @@ dependencies {
testCompile project(':jdbc-test')
testCompile project(':test-support')
- testCompile 'org.postgresql:postgresql:42.2.12'
+ testCompile 'org.postgresql:postgresql:42.2.13'
testCompile testFixtures(project(':r2dbc'))
testCompile 'io.r2dbc:r2dbc-postgresql:0.8.3.RELEASE'
From f90ad90db67e432cdabe3e9e347a7931ace0f29e Mon Sep 17 00:00:00 2001
From: "dependabot-preview[bot]"
<27856297+dependabot-preview[bot]@users.noreply.github.com>
Date: Sat, 6 Jun 2020 12:00:42 +0100
Subject: [PATCH 0164/4341] Bump aws-java-sdk-logs from 1.11.792 to 1.11.797 in
/modules/localstack (#2849)
Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>
Co-authored-by: Richard North
---
modules/localstack/build.gradle | 8 +++++---
1 file changed, 5 insertions(+), 3 deletions(-)
diff --git a/modules/localstack/build.gradle b/modules/localstack/build.gradle
index 4a643d5b7f5..ed4b2073a41 100644
--- a/modules/localstack/build.gradle
+++ b/modules/localstack/build.gradle
@@ -3,9 +3,11 @@ description = "Testcontainers :: Localstack"
dependencies {
compile project(':testcontainers')
- compileOnly 'com.amazonaws:aws-java-sdk-s3:1.11.792'
- testCompile 'com.amazonaws:aws-java-sdk-s3:1.11.792'
+ compileOnly 'com.amazonaws:aws-java-sdk-s3:1.11.797'
+ testCompile 'com.amazonaws:aws-java-sdk-s3:1.11.797'
testCompile 'com.amazonaws:aws-java-sdk-sqs:1.11.797'
- testCompile 'com.amazonaws:aws-java-sdk-logs:1.11.792'
+ testCompile 'com.amazonaws:aws-java-sdk-logs:1.11.797'
testCompile 'software.amazon.awssdk:s3:2.13.31'
+ testCompile 'com.amazonaws:aws-java-sdk-sqs:1.11.797'
+ testCompile 'com.amazonaws:aws-java-sdk-logs:1.11.797'
}
From 7ba06573feb6561c6fc857cd5b53ff1449808da9 Mon Sep 17 00:00:00 2001
From: Sergei Egorov
Date: Sat, 6 Jun 2020 21:00:02 +0200
Subject: [PATCH 0165/4341] Use testcontainers/* Docker Hub images (#2850)
---
.../utility/TestcontainersConfiguration.java | 7 ++++---
1 file changed, 4 insertions(+), 3 deletions(-)
diff --git a/core/src/main/java/org/testcontainers/utility/TestcontainersConfiguration.java b/core/src/main/java/org/testcontainers/utility/TestcontainersConfiguration.java
index 44691cfb6fb..7b76039da52 100644
--- a/core/src/main/java/org/testcontainers/utility/TestcontainersConfiguration.java
+++ b/core/src/main/java/org/testcontainers/utility/TestcontainersConfiguration.java
@@ -58,6 +58,7 @@ static AtomicReference getInstanceField() {
this.properties.putAll(environmentProperties);
}
+ @Deprecated
public String getAmbassadorContainerImage() {
return (String) properties.getOrDefault("ambassador.container.image", "richnorth/ambassador:latest");
}
@@ -67,7 +68,7 @@ public String getSocatContainerImage() {
}
public String getVncRecordedContainerImage() {
- return (String) properties.getOrDefault("vncrecorder.container.image", "testcontainersofficial/vnc-recorder:1.1.0");
+ return (String) properties.getOrDefault("vncrecorder.container.image", "testcontainers/vnc-recorder:1.1.0");
}
public String getDockerComposeContainerImage() {
@@ -83,11 +84,11 @@ public boolean isRyukPrivileged() {
}
public String getRyukImage() {
- return (String) properties.getOrDefault("ryuk.container.image", "testcontainersofficial/ryuk:0.3.0");
+ return (String) properties.getOrDefault("ryuk.container.image", "testcontainers/ryuk:0.3.0");
}
public String getSSHdImage() {
- return (String) properties.getOrDefault("sshd.container.image", "testcontainersofficial/sshd:1.0.0");
+ return (String) properties.getOrDefault("sshd.container.image", "testcontainers/sshd:1.0.0");
}
public Integer getRyukTimeout() {
From f353266fe3ec18514f8933a1f9469162ef3c3ad0 Mon Sep 17 00:00:00 2001
From: Sergei Egorov
Date: Wed, 10 Jun 2020 14:21:21 +0200
Subject: [PATCH 0166/4341] Hard deprecate
`ProxiedUnixSocketClientProviderStrategy` (#2851)
---
core/build.gradle | 4 ---
.../DockerMachineClientProviderStrategy.java | 2 +-
...oxiedUnixSocketClientProviderStrategy.java | 32 ++++---------------
....dockerclient.DockerClientProviderStrategy | 1 -
4 files changed, 8 insertions(+), 31 deletions(-)
diff --git a/core/build.gradle b/core/build.gradle
index e728f1cd48b..d0d76392e48 100644
--- a/core/build.gradle
+++ b/core/build.gradle
@@ -155,10 +155,6 @@ dependencies {
exclude(group: "net.java.dev.jna", module: "jna")
}
- compile ('org.rnorth:tcp-unix-socket-proxy:1.0.2') {
- exclude(group: "log4j", module: "log4j")
- }
-
compile "net.java.dev.jna:jna-platform:5.5.0"
shaded ('com.github.docker-java:docker-java-transport-okhttp:3.2.1') {
diff --git a/core/src/main/java/org/testcontainers/dockerclient/DockerMachineClientProviderStrategy.java b/core/src/main/java/org/testcontainers/dockerclient/DockerMachineClientProviderStrategy.java
index f1503477500..fac092044c7 100644
--- a/core/src/main/java/org/testcontainers/dockerclient/DockerMachineClientProviderStrategy.java
+++ b/core/src/main/java/org/testcontainers/dockerclient/DockerMachineClientProviderStrategy.java
@@ -31,7 +31,7 @@ protected boolean isPersistable() {
@Override
protected int getPriority() {
- return ProxiedUnixSocketClientProviderStrategy.PRIORITY - 10;
+ return EnvironmentAndSystemPropertyClientProviderStrategy.PRIORITY - 100;
}
@Override
diff --git a/core/src/main/java/org/testcontainers/dockerclient/ProxiedUnixSocketClientProviderStrategy.java b/core/src/main/java/org/testcontainers/dockerclient/ProxiedUnixSocketClientProviderStrategy.java
index 84671e32efd..b1a21da724c 100644
--- a/core/src/main/java/org/testcontainers/dockerclient/ProxiedUnixSocketClientProviderStrategy.java
+++ b/core/src/main/java/org/testcontainers/dockerclient/ProxiedUnixSocketClientProviderStrategy.java
@@ -1,20 +1,16 @@
package org.testcontainers.dockerclient;
-import lombok.extern.slf4j.Slf4j;
-import org.rnorth.tcpunixsocketproxy.TcpToUnixSocketProxy;
-
-import java.io.File;
-
-@Slf4j
+/**
+ * @deprecated no longer needed since `docker-java` supports all transport modes now
+ */
+@Deprecated
public class ProxiedUnixSocketClientProviderStrategy extends UnixSocketClientProviderStrategy {
public static final int PRIORITY = EnvironmentAndSystemPropertyClientProviderStrategy.PRIORITY - 100;
- private final File socketFile = new File(DOCKER_SOCK_PATH);
-
@Override
protected boolean isApplicable() {
- return socketFile.exists();
+ return false;
}
@Override
@@ -24,26 +20,12 @@ protected int getPriority() {
@Override
public void test() throws InvalidConfigurationException {
- TcpToUnixSocketProxy proxy = new TcpToUnixSocketProxy(socketFile);
-
- try {
- int proxyPort = proxy.start().getPort();
-
- config = tryConfiguration("tcp://localhost:" + proxyPort);
-
- log.debug("Accessing unix domain socket via TCP proxy (" + DOCKER_SOCK_PATH + " via localhost:" + proxyPort + ")");
- } catch (Exception e) {
-
- proxy.stop();
-
- throw new InvalidConfigurationException("ping failed", e);
- }
-
+ throw new InvalidConfigurationException("Deprecated");
}
@Override
public String getDescription() {
- return "local Unix socket (via TCP proxy)";
+ return "[Deprecated] local Unix socket (via TCP proxy)";
}
}
diff --git a/core/src/main/resources/META-INF/services/org.testcontainers.dockerclient.DockerClientProviderStrategy b/core/src/main/resources/META-INF/services/org.testcontainers.dockerclient.DockerClientProviderStrategy
index 25bbb30d725..cde7fc827e4 100644
--- a/core/src/main/resources/META-INF/services/org.testcontainers.dockerclient.DockerClientProviderStrategy
+++ b/core/src/main/resources/META-INF/services/org.testcontainers.dockerclient.DockerClientProviderStrategy
@@ -1,6 +1,5 @@
org.testcontainers.dockerclient.EnvironmentAndSystemPropertyClientProviderStrategy
org.testcontainers.dockerclient.UnixSocketClientProviderStrategy
-org.testcontainers.dockerclient.ProxiedUnixSocketClientProviderStrategy
org.testcontainers.dockerclient.DockerMachineClientProviderStrategy
org.testcontainers.dockerclient.WindowsClientProviderStrategy
org.testcontainers.dockerclient.NpipeSocketClientProviderStrategy
From 556659751849dfb06313f46a6560d5a194efd035 Mon Sep 17 00:00:00 2001
From: Kevin Wittek
Date: Thu, 11 Jun 2020 14:40:24 +0200
Subject: [PATCH 0167/4341] Update Windows docs for WSL2 (#2816)
---
docs/supported_docker_environment/windows.md | 21 ++++++++++++--------
1 file changed, 13 insertions(+), 8 deletions(-)
diff --git a/docs/supported_docker_environment/windows.md b/docs/supported_docker_environment/windows.md
index 6365456b095..6afab5972f2 100644
--- a/docs/supported_docker_environment/windows.md
+++ b/docs/supported_docker_environment/windows.md
@@ -4,18 +4,12 @@
* [Docker for Windows](https://docs.docker.com/docker-for-windows/) needs to be installed
* Docker version 17.06 is confirmed to work on Windows 10 with Hyper-V.
* Testcontainers supports communication with Docker on Docker for Windows using named pipes.
+ * WSL2 backend is supported starting with Windows 10 2004. (**Beta**)
## Limitations
The following features are not available or do not work correctly so make sure you do not use them or use them with
caution. The list may not be complete.
-### Testing
-
-Testcontainers is not regularly tested on Windows, so please consider it to be at an beta level of readiness.
-
-If you wish to use Testcontainers on Windows, please confirm that it works correctly for you before investing significant
-effort.
-
### MySQL containers
* MySQL server prevents custom configuration file (ini-script) from being loaded due to security measures ([link to feature description](../modules/databases/index.md#using-an-init-script-from-a-file))
@@ -23,7 +17,18 @@ effort.
* WCOW is currently not supported, since Testcontainers uses auxiliary Linux containers for certain tasks and Docker for Windows does not support hybrid engine mode at the time of writing.
-## Windows Subsystem for Linux
+## WSL2 backend
+
+Using Docker for Windows with WSL2 backend should work out of the box.
+
+However, there is an [existing issue](https://github.com/microsoft/WSL/issues/4694) in WSL/WSL2 that effects certain older Docker images.
+The currently proposed workaround is to enable vsyscall emulation in the WSL2 kernel:
+```
+[wsl2]
+kernelCommandLine = vsyscall=emulate
+```
+
+## Windows Subsystem for Linux (WSL)
Testcontainers supports communicating with Docker for Windows within the Windows Subsystem for Linux *([**WSL**](https://docs.microsoft.com/en-us/windows/wsl/about))*.
The following additional configurations steps are required:
From 780b8e33811f046e64c7cdf6a25b49fb0fe79ce8 Mon Sep 17 00:00:00 2001
From: Sergei Egorov
Date: Mon, 15 Jun 2020 21:28:37 +0200
Subject: [PATCH 0168/4341] Upgrade to docker-java 3.2.2, add Apache
HttpClient5 option (#2803)
---
.github/workflows/ci.yml | 18 ++++++++++
core/build.gradle | 7 +++-
.../DelegatingDockerClient.java | 12 +++++++
.../testcontainers/DockerClientFactory.java | 7 +++-
.../containers/ContainerState.java | 2 +-
.../DockerClientProviderStrategy.java | 36 ++++++++++++++++---
.../utility/TestcontainersConfiguration.java | 5 ---
examples/build.gradle | 4 +++
8 files changed, 79 insertions(+), 12 deletions(-)
create mode 100644 core/src/main/java/org/testcontainers/DelegatingDockerClient.java
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 6ea2319193d..e2ca5d35daa 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -66,3 +66,21 @@ jobs:
wget -q https://get.cimate.io/release/linux/cimate
chmod +x cimate
./cimate "**/TEST-*.xml"
+ httpclient5_test:
+ runs-on: ubuntu-18.04
+ steps:
+ - uses: actions/checkout@v2
+ - name: Build with Gradle
+ run: |
+ echo "transport.type=httpclient5" > $HOME/.testcontainers.properties
+ cat $HOME/.testcontainers.properties
+ ./gradlew --no-daemon --scan testcontainers:test --tests '*EventStreamTest'
+ - name: aggregate test reports with ciMate
+ if: always()
+ env:
+ CIMATE_PROJECT_ID: 2348n4vl
+ CIMATE_CI_KEY: "CI / Apache HttpClient5"
+ run: |
+ wget -q https://get.cimate.io/release/linux/cimate
+ chmod +x cimate
+ ./cimate "**/TEST-*.xml"
diff --git a/core/build.gradle b/core/build.gradle
index d0d76392e48..c273cede20f 100644
--- a/core/build.gradle
+++ b/core/build.gradle
@@ -157,13 +157,18 @@ dependencies {
compile "net.java.dev.jna:jna-platform:5.5.0"
- shaded ('com.github.docker-java:docker-java-transport-okhttp:3.2.1') {
+ shaded ('com.github.docker-java:docker-java-transport-okhttp:3.2.2') {
exclude(group: 'net.java.dev.jna')
exclude(group: 'com.google.code.findbug')
exclude(group: 'org.slf4j')
exclude(group: 'org.apache.commons', module: 'commons-compress')
}
+ shaded ('com.github.docker-java:docker-java-transport-zerodep:3.2.2') {
+ exclude(group: 'net.java.dev.jna')
+ exclude(group: 'org.slf4j')
+ }
+
shaded "org.yaml:snakeyaml:1.25"
shaded 'org.glassfish.main.external:trilead-ssh2-repackaged:4.1.2'
diff --git a/core/src/main/java/org/testcontainers/DelegatingDockerClient.java b/core/src/main/java/org/testcontainers/DelegatingDockerClient.java
new file mode 100644
index 00000000000..ca25650bb02
--- /dev/null
+++ b/core/src/main/java/org/testcontainers/DelegatingDockerClient.java
@@ -0,0 +1,12 @@
+package org.testcontainers;
+
+import com.github.dockerjava.api.DockerClient;
+import lombok.RequiredArgsConstructor;
+import lombok.experimental.Delegate;
+
+@RequiredArgsConstructor
+class DelegatingDockerClient implements DockerClient {
+
+ @Delegate
+ private final DockerClient dockerClient;
+}
diff --git a/core/src/main/java/org/testcontainers/DockerClientFactory.java b/core/src/main/java/org/testcontainers/DockerClientFactory.java
index 4e16a7edf9d..48900631456 100644
--- a/core/src/main/java/org/testcontainers/DockerClientFactory.java
+++ b/core/src/main/java/org/testcontainers/DockerClientFactory.java
@@ -148,7 +148,12 @@ public DockerClient client() {
String hostIpAddress = strategy.getDockerHostIpAddress();
log.info("Docker host IP address is {}", hostIpAddress);
- final DockerClient client = strategy.getClient();
+ final DockerClient client = new DelegatingDockerClient(strategy.getClient()) {
+ @Override
+ public void close() {
+ throw new IllegalStateException("You should never close the global DockerClient!");
+ }
+ };
Info dockerInfo = client.infoCmd().exec();
Version version = client.versionCmd().exec();
diff --git a/core/src/main/java/org/testcontainers/containers/ContainerState.java b/core/src/main/java/org/testcontainers/containers/ContainerState.java
index 1565b4e7e3e..1b1a99d3b89 100644
--- a/core/src/main/java/org/testcontainers/containers/ContainerState.java
+++ b/core/src/main/java/org/testcontainers/containers/ContainerState.java
@@ -310,8 +310,8 @@ default T copyFileFromContainer(String containerPath, ThrowingFunction"
+ );
strategy.checkOSType();
if (strategy.isPersistable()) {
@@ -171,9 +180,28 @@ public DockerClient getClient() {
}
protected DockerClient getClientForConfig(DockerClientConfig config) {
- return DockerClientImpl
- .getInstance(new AuthDelegatingDockerClientConfig(config))
- .withDockerCmdExecFactory(new OkHttpDockerCmdExecFactory());
+ config = new AuthDelegatingDockerClientConfig(config);
+ final DockerHttpClient dockerHttpClient;
+
+ String transportType = TestcontainersConfiguration.getInstance().getTransportType();
+ switch (transportType) {
+ case "okhttp":
+ dockerHttpClient = new OkDockerHttpClient.Builder()
+ .dockerHost(config.getDockerHost())
+ .sslConfig(config.getSSLConfig())
+ .build();
+ break;
+ case "httpclient5":
+ dockerHttpClient = new ZerodepDockerHttpClient.Builder()
+ .dockerHost(config.getDockerHost())
+ .sslConfig(config.getSSLConfig())
+ .build();
+ break;
+ default:
+ throw new IllegalArgumentException("Unknown transport type '" + transportType + "'");
+ }
+
+ return DockerClientImpl.getInstance(config, dockerHttpClient);
}
protected void ping(DockerClient client, int timeoutInSeconds) {
diff --git a/core/src/main/java/org/testcontainers/utility/TestcontainersConfiguration.java b/core/src/main/java/org/testcontainers/utility/TestcontainersConfiguration.java
index 7b76039da52..aa829573447 100644
--- a/core/src/main/java/org/testcontainers/utility/TestcontainersConfiguration.java
+++ b/core/src/main/java/org/testcontainers/utility/TestcontainersConfiguration.java
@@ -120,11 +120,6 @@ public String getDockerClientStrategyClassName() {
return (String) environmentProperties.get("docker.client.strategy");
}
- /**
- *
- * @deprecated we no longer have different transport types
- */
- @Deprecated
public String getTransportType() {
return properties.getProperty("transport.type", "okhttp");
}
diff --git a/examples/build.gradle b/examples/build.gradle
index 25b7c1fcf29..83e196dac00 100644
--- a/examples/build.gradle
+++ b/examples/build.gradle
@@ -3,4 +3,8 @@ apply from: "$rootDir/../gradle/ci-support.gradle"
subprojects {
apply plugin:"java"
+
+ repositories {
+ jcenter()
+ }
}
From 816b8c309ba526b4f34a9970f9f5e9918ad47d06 Mon Sep 17 00:00:00 2001
From: Sergei Egorov
Date: Tue, 16 Jun 2020 21:56:42 +0200
Subject: [PATCH 0169/4341] Fix log-related leaks (#2883)
* Fix log-related leaks
* Update core/src/main/java/org/testcontainers/utility/ResourceReaper.java
Co-authored-by: Richard North
* Update core/src/main/java/org/testcontainers/utility/ResourceReaper.java
Co-authored-by: Richard North
Co-authored-by: Richard North
---
.../containers/ExecInContainerPattern.java | 9 +++++----
.../testcontainers/utility/ResourceReaper.java | 18 ++++++++++++------
2 files changed, 17 insertions(+), 10 deletions(-)
diff --git a/core/src/main/java/org/testcontainers/containers/ExecInContainerPattern.java b/core/src/main/java/org/testcontainers/containers/ExecInContainerPattern.java
index 359065d732b..9cd68d48ffb 100644
--- a/core/src/main/java/org/testcontainers/containers/ExecInContainerPattern.java
+++ b/core/src/main/java/org/testcontainers/containers/ExecInContainerPattern.java
@@ -73,11 +73,12 @@ public Container.ExecResult execInContainer(InspectContainerResponse containerIn
final ToStringConsumer stdoutConsumer = new ToStringConsumer();
final ToStringConsumer stderrConsumer = new ToStringConsumer();
- FrameConsumerResultCallback callback = new FrameConsumerResultCallback();
- callback.addConsumer(OutputFrame.OutputType.STDOUT, stdoutConsumer);
- callback.addConsumer(OutputFrame.OutputType.STDERR, stderrConsumer);
+ try (FrameConsumerResultCallback callback = new FrameConsumerResultCallback()) {
+ callback.addConsumer(OutputFrame.OutputType.STDOUT, stdoutConsumer);
+ callback.addConsumer(OutputFrame.OutputType.STDERR, stderrConsumer);
- dockerClient.execStartCmd(execCreateCmdResponse.getId()).exec(callback).awaitCompletion();
+ dockerClient.execStartCmd(execCreateCmdResponse.getId()).exec(callback).awaitCompletion();
+ }
Integer exitCode = dockerClient.inspectExecCmd(execCreateCmdResponse.getId()).exec().getExitCode();
final Container.ExecResult result = new Container.ExecResult(
diff --git a/core/src/main/java/org/testcontainers/utility/ResourceReaper.java b/core/src/main/java/org/testcontainers/utility/ResourceReaper.java
index 4d44cbc3842..5d89ab886e7 100644
--- a/core/src/main/java/org/testcontainers/utility/ResourceReaper.java
+++ b/core/src/main/java/org/testcontainers/utility/ResourceReaper.java
@@ -93,7 +93,7 @@ public static String start(String hostIpAddress, DockerClient client) {
StringBuilder ryukLog = new StringBuilder();
- client.logContainerCmd(ryukContainerId)
+ ResultCallback.Adapter logCallback = client.logContainerCmd(ryukContainerId)
.withSince(0)
.withFollowStream(true)
.withStdOut(true)
@@ -164,11 +164,17 @@ public void onNext(Frame frame) {
);
kiraThread.setDaemon(true);
kiraThread.start();
-
- // We need to wait before we can start any containers to make sure that we delete them
- if (!ryukScheduledLatch.await(TestcontainersConfiguration.getInstance().getRyukTimeout(), TimeUnit.SECONDS)) {
- log.error("Timeout out waiting for Ryuk. Ryuk's log:\n{}", ryukLog);
- throw new IllegalStateException(String.format("Can not connect to Ryuk at %s:%s", hostIpAddress, ryukPort));
+ try {
+ // We need to wait before we can start any containers to make sure that we delete them
+ if (!ryukScheduledLatch.await(TestcontainersConfiguration.getInstance().getRyukTimeout(), TimeUnit.SECONDS)) {
+ log.error("Timed out waiting for Ryuk container to start. Ryuk's logs:\n{}", ryukLog);
+ throw new IllegalStateException(String.format("Could not connect to Ryuk at %s:%s", hostIpAddress, ryukPort));
+ }
+ } finally {
+ try {
+ logCallback.close();
+ } catch (IOException ignored) {
+ }
}
return ryukContainerId;
From bfd2f2672360c7b7876ceec86b03dfa4c8ed20df Mon Sep 17 00:00:00 2001
From: Sergei Egorov
Date: Wed, 17 Jun 2020 15:08:55 +0200
Subject: [PATCH 0170/4341] Update to docker-java 3.2.3 (#2885)
---
core/build.gradle | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/core/build.gradle b/core/build.gradle
index c273cede20f..deabf16e90d 100644
--- a/core/build.gradle
+++ b/core/build.gradle
@@ -157,14 +157,14 @@ dependencies {
compile "net.java.dev.jna:jna-platform:5.5.0"
- shaded ('com.github.docker-java:docker-java-transport-okhttp:3.2.2') {
+ shaded ('com.github.docker-java:docker-java-transport-okhttp:3.2.3') {
exclude(group: 'net.java.dev.jna')
exclude(group: 'com.google.code.findbug')
exclude(group: 'org.slf4j')
exclude(group: 'org.apache.commons', module: 'commons-compress')
}
- shaded ('com.github.docker-java:docker-java-transport-zerodep:3.2.2') {
+ shaded ('com.github.docker-java:docker-java-transport-zerodep:3.2.3') {
exclude(group: 'net.java.dev.jna')
exclude(group: 'org.slf4j')
}
From c88fcc1c6359ba22c811a21c9f3b17bb3c614513 Mon Sep 17 00:00:00 2001
From: "dependabot-preview[bot]"
<27856297+dependabot-preview[bot]@users.noreply.github.com>
Date: Thu, 18 Jun 2020 16:37:10 +0100
Subject: [PATCH 0171/4341] Bump aws-java-sdk-s3 from 1.11.797 to 1.11.802 in
/modules/localstack (#2870)
Bumps [aws-java-sdk-s3](https://github.com/aws/aws-sdk-java) from 1.11.797 to 1.11.802.
- [Release notes](https://github.com/aws/aws-sdk-java/releases)
- [Changelog](https://github.com/aws/aws-sdk-java/blob/master/CHANGELOG.md)
- [Commits](https://github.com/aws/aws-sdk-java/compare/1.11.797...1.11.802)
Signed-off-by: dependabot-preview[bot]
Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>
---
modules/localstack/build.gradle | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/modules/localstack/build.gradle b/modules/localstack/build.gradle
index ed4b2073a41..4c04a049591 100644
--- a/modules/localstack/build.gradle
+++ b/modules/localstack/build.gradle
@@ -3,7 +3,7 @@ description = "Testcontainers :: Localstack"
dependencies {
compile project(':testcontainers')
- compileOnly 'com.amazonaws:aws-java-sdk-s3:1.11.797'
+ compileOnly 'com.amazonaws:aws-java-sdk-s3:1.11.802'
testCompile 'com.amazonaws:aws-java-sdk-s3:1.11.797'
testCompile 'com.amazonaws:aws-java-sdk-sqs:1.11.797'
testCompile 'com.amazonaws:aws-java-sdk-logs:1.11.797'
From dac46206afca670c34f67cd2d1d478b4f32cd26b Mon Sep 17 00:00:00 2001
From: "dependabot-preview[bot]"
<27856297+dependabot-preview[bot]@users.noreply.github.com>
Date: Thu, 18 Jun 2020 16:37:28 +0100
Subject: [PATCH 0172/4341] Bump postgresql from 42.2.13 to 42.2.14 in
/modules/postgresql (#2867)
Bumps [postgresql](https://github.com/pgjdbc/pgjdbc) from 42.2.13 to 42.2.14.
- [Release notes](https://github.com/pgjdbc/pgjdbc/releases)
- [Changelog](https://github.com/pgjdbc/pgjdbc/blob/master/CHANGELOG.md)
- [Commits](https://github.com/pgjdbc/pgjdbc/compare/REL42.2.13...REL42.2.14)
Signed-off-by: dependabot-preview[bot]
Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>
---
modules/postgresql/build.gradle | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/modules/postgresql/build.gradle b/modules/postgresql/build.gradle
index 2fe381f5fb4..7e6adea9cf1 100644
--- a/modules/postgresql/build.gradle
+++ b/modules/postgresql/build.gradle
@@ -11,7 +11,7 @@ dependencies {
testCompile project(':jdbc-test')
testCompile project(':test-support')
- testCompile 'org.postgresql:postgresql:42.2.13'
+ testCompile 'org.postgresql:postgresql:42.2.14'
testCompile testFixtures(project(':r2dbc'))
testCompile 'io.r2dbc:r2dbc-postgresql:0.8.3.RELEASE'
From a74afbfc3458cdaf5b9db194710168c2671485de Mon Sep 17 00:00:00 2001
From: "dependabot-preview[bot]"
<27856297+dependabot-preview[bot]@users.noreply.github.com>
Date: Thu, 18 Jun 2020 16:37:48 +0100
Subject: [PATCH 0173/4341] Bump tomcat-jdbc from 9.0.35 to 9.0.36 in
/modules/jdbc (#2865)
Bumps tomcat-jdbc from 9.0.35 to 9.0.36.
Signed-off-by: dependabot-preview[bot]
Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>
---
modules/jdbc/build.gradle | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/modules/jdbc/build.gradle b/modules/jdbc/build.gradle
index 1cfdeab73b2..3b6aea15c59 100644
--- a/modules/jdbc/build.gradle
+++ b/modules/jdbc/build.gradle
@@ -6,7 +6,7 @@ dependencies {
testCompile 'commons-dbutils:commons-dbutils:1.7'
testCompile 'org.vibur:vibur-dbcp:25.0'
- testCompile 'org.apache.tomcat:tomcat-jdbc:9.0.35'
+ testCompile 'org.apache.tomcat:tomcat-jdbc:9.0.36'
testCompile 'com.zaxxer:HikariCP-java6:2.3.13'
testCompile 'com.googlecode.junit-toolbox:junit-toolbox:2.4'
}
From 5a793a6c24460c7837dde0ffce50abbcd46a6fc7 Mon Sep 17 00:00:00 2001
From: "dependabot-preview[bot]"
<27856297+dependabot-preview[bot]@users.noreply.github.com>
Date: Thu, 18 Jun 2020 16:37:59 +0100
Subject: [PATCH 0174/4341] Bump org.springframework.boot from 2.3.0.RELEASE to
2.3.1.RELEASE in /examples (#2871)
Bumps [org.springframework.boot](https://github.com/spring-projects/spring-boot) from 2.3.0.RELEASE to 2.3.1.RELEASE.
- [Release notes](https://github.com/spring-projects/spring-boot/releases)
- [Commits](https://github.com/spring-projects/spring-boot/compare/v2.3.0.RELEASE...v2.3.1.RELEASE)
Signed-off-by: dependabot-preview[bot]
Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>
---
examples/selenium-container/build.gradle | 2 +-
examples/spring-boot/build.gradle | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/examples/selenium-container/build.gradle b/examples/selenium-container/build.gradle
index 49e015f1af3..dc59ca877ab 100644
--- a/examples/selenium-container/build.gradle
+++ b/examples/selenium-container/build.gradle
@@ -1,6 +1,6 @@
plugins {
id 'java'
- id 'org.springframework.boot' version '2.3.0.RELEASE'
+ id 'org.springframework.boot' version '2.3.1.RELEASE'
}
apply plugin: 'io.spring.dependency-management'
diff --git a/examples/spring-boot/build.gradle b/examples/spring-boot/build.gradle
index ad8d8252fb6..060a7f48357 100644
--- a/examples/spring-boot/build.gradle
+++ b/examples/spring-boot/build.gradle
@@ -1,6 +1,6 @@
plugins {
id 'java'
- id 'org.springframework.boot' version '2.3.0.RELEASE'
+ id 'org.springframework.boot' version '2.3.1.RELEASE'
}
apply plugin: 'io.spring.dependency-management'
From 9e361ba447af11a158cbfdb7a3b687292ff6752c Mon Sep 17 00:00:00 2001
From: "dependabot-preview[bot]"
<27856297+dependabot-preview[bot]@users.noreply.github.com>
Date: Thu, 18 Jun 2020 16:38:13 +0100
Subject: [PATCH 0175/4341] Bump s3 from 2.13.31 to 2.13.36 in
/modules/localstack (#2872)
Bumps s3 from 2.13.31 to 2.13.36.
Signed-off-by: dependabot-preview[bot]
Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>
---
modules/localstack/build.gradle | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/modules/localstack/build.gradle b/modules/localstack/build.gradle
index 4c04a049591..8a2a372a0f1 100644
--- a/modules/localstack/build.gradle
+++ b/modules/localstack/build.gradle
@@ -7,7 +7,7 @@ dependencies {
testCompile 'com.amazonaws:aws-java-sdk-s3:1.11.797'
testCompile 'com.amazonaws:aws-java-sdk-sqs:1.11.797'
testCompile 'com.amazonaws:aws-java-sdk-logs:1.11.797'
- testCompile 'software.amazon.awssdk:s3:2.13.31'
+ testCompile 'software.amazon.awssdk:s3:2.13.36'
testCompile 'com.amazonaws:aws-java-sdk-sqs:1.11.797'
testCompile 'com.amazonaws:aws-java-sdk-logs:1.11.797'
}
From 66a2cb07068d70ab5874b5267565177956524f1e Mon Sep 17 00:00:00 2001
From: "dependabot-preview[bot]"
<27856297+dependabot-preview[bot]@users.noreply.github.com>
Date: Thu, 18 Jun 2020 16:38:23 +0100
Subject: [PATCH 0176/4341] Bump postgresql from 42.2.13 to 42.2.14 in
/modules/junit-jupiter (#2869)
Bumps [postgresql](https://github.com/pgjdbc/pgjdbc) from 42.2.13 to 42.2.14.
- [Release notes](https://github.com/pgjdbc/pgjdbc/releases)
- [Changelog](https://github.com/pgjdbc/pgjdbc/blob/master/CHANGELOG.md)
- [Commits](https://github.com/pgjdbc/pgjdbc/compare/REL42.2.13...REL42.2.14)
Signed-off-by: dependabot-preview[bot]
Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>
---
modules/junit-jupiter/build.gradle | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/modules/junit-jupiter/build.gradle b/modules/junit-jupiter/build.gradle
index 301c7eaaecc..ffc060d8b01 100644
--- a/modules/junit-jupiter/build.gradle
+++ b/modules/junit-jupiter/build.gradle
@@ -15,7 +15,7 @@ dependencies {
testCompile 'org.assertj:assertj-core:3.16.1'
testCompile 'org.junit.jupiter:junit-jupiter-params:5.6.2'
- testRuntime 'org.postgresql:postgresql:42.2.13'
+ testRuntime 'org.postgresql:postgresql:42.2.14'
testRuntime 'mysql:mysql-connector-java:8.0.20'
testRuntime 'org.junit.jupiter:junit-jupiter-engine:5.6.2'
}
From 4207844d1f9b2dbfb55c0df533ce1a799cc006d5 Mon Sep 17 00:00:00 2001
From: "dependabot-preview[bot]"
<27856297+dependabot-preview[bot]@users.noreply.github.com>
Date: Thu, 18 Jun 2020 16:38:36 +0100
Subject: [PATCH 0177/4341] Bump tomcat-jdbc from 9.0.35 to 9.0.36 in
/modules/jdbc-test (#2866)
Bumps tomcat-jdbc from 9.0.35 to 9.0.36.
Signed-off-by: dependabot-preview[bot]
Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>
---
modules/jdbc-test/build.gradle | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/modules/jdbc-test/build.gradle b/modules/jdbc-test/build.gradle
index 23564279332..e901869f04e 100644
--- a/modules/jdbc-test/build.gradle
+++ b/modules/jdbc-test/build.gradle
@@ -15,7 +15,7 @@ dependencies {
}
compile 'commons-dbutils:commons-dbutils:1.7'
- compile 'org.apache.tomcat:tomcat-jdbc:9.0.35'
+ compile 'org.apache.tomcat:tomcat-jdbc:9.0.36'
compile 'org.vibur:vibur-dbcp:25.0'
compile 'mysql:mysql-connector-java:8.0.20'
}
From 4219f078222545bcab005d4f6f3a76dda5847c18 Mon Sep 17 00:00:00 2001
From: "dependabot-preview[bot]"
<27856297+dependabot-preview[bot]@users.noreply.github.com>
Date: Thu, 18 Jun 2020 16:38:45 +0100
Subject: [PATCH 0178/4341] Bump postgresql from 42.2.13 to 42.2.14 in
/modules/spock (#2873)
Bumps [postgresql](https://github.com/pgjdbc/pgjdbc) from 42.2.13 to 42.2.14.
- [Release notes](https://github.com/pgjdbc/pgjdbc/releases)
- [Changelog](https://github.com/pgjdbc/pgjdbc/blob/master/CHANGELOG.md)
- [Commits](https://github.com/pgjdbc/pgjdbc/compare/REL42.2.13...REL42.2.14)
Signed-off-by: dependabot-preview[bot]
Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>
---
modules/spock/build.gradle | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/modules/spock/build.gradle b/modules/spock/build.gradle
index 7e1b05b7719..ee4ac56053f 100644
--- a/modules/spock/build.gradle
+++ b/modules/spock/build.gradle
@@ -15,7 +15,7 @@ dependencies {
testCompile 'com.zaxxer:HikariCP:3.4.5'
testCompile 'org.apache.httpcomponents:httpclient:4.5.12'
- testRuntime 'org.postgresql:postgresql:42.2.13'
+ testRuntime 'org.postgresql:postgresql:42.2.14'
testRuntime 'mysql:mysql-connector-java:8.0.20'
}
From c7ebdd7ae0f5fdae9b2bc10874c5d6f8c9cfff2b Mon Sep 17 00:00:00 2001
From: Richard North
Date: Thu, 18 Jun 2020 19:14:08 +0100
Subject: [PATCH 0179/4341] Use PyPI published version of
mkdocs-codeinclude-plugin
---
requirements.txt | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/requirements.txt b/requirements.txt
index dd80510a4b4..227c646dd6b 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -1,5 +1,5 @@
mkdocs==1.0.4
--e git+https://github.com/rnorth/mkdocs-codeinclude-plugin#egg=mkdocs_codeinclude_plugin
+mkdocs-codeinclude-plugin==0.0.1
mkdocs-material==4.6.0
mkdocs-markdownextradata-plugin==0.1.1
markdown>=3.1,<3.2
From b9ee64c9acecb5bc6c0637f9cc669c08562ad1e5 Mon Sep 17 00:00:00 2001
From: Richard North
Date: Thu, 18 Jun 2020 19:21:39 +0100
Subject: [PATCH 0180/4341] Use PyPI published version of
mkdocs-codeinclude-plugin
---
Pipfile | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Pipfile b/Pipfile
index 145ddf858a2..2236de86daf 100644
--- a/Pipfile
+++ b/Pipfile
@@ -7,7 +7,7 @@ verify_ssl = true
[packages]
mkdocs = "*"
-mkdocs-codeinclude-plugin = {editable = true,git = "https://github.com/rnorth/mkdocs-codeinclude-plugin"}
+mkdocs-codeinclude-plugin = "*"
mkdocs-material = "*"
mkdocs-markdownextradata-plugin = "*"
From 8767b8619356bd31e33a9893c361c070bd3ded10 Mon Sep 17 00:00:00 2001
From: Alex Yaroslavsky
Date: Fri, 19 Jun 2020 12:33:33 +0300
Subject: [PATCH 0181/4341] Fix compilation error related to unicode in source
code (#2464)
Co-authored-by: Richard North
---
core/src/main/java/org/testcontainers/DockerClientFactory.java | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/core/src/main/java/org/testcontainers/DockerClientFactory.java b/core/src/main/java/org/testcontainers/DockerClientFactory.java
index 48900631456..50c0f3d021c 100644
--- a/core/src/main/java/org/testcontainers/DockerClientFactory.java
+++ b/core/src/main/java/org/testcontainers/DockerClientFactory.java
@@ -239,7 +239,7 @@ private void checkDiskSpace(DockerClient dockerClient, String id) {
private void check(String message, boolean isSuccessful) {
if (isSuccessful) {
- log.info("\u2714︎ {}", message);
+ log.info("\u2714\ufe0e {}", message);
} else {
log.error("\u274c {}", message);
throw new IllegalStateException("Check failed: " + message);
From d345b9163898f556ea63d9c0db25487a74e8cf5a Mon Sep 17 00:00:00 2001
From: sullis
Date: Sat, 20 Jun 2020 13:03:23 -0700
Subject: [PATCH 0182/4341] upgrade to Dependabot 2 (#2898)
https://github.blog/2020-06-01-keep-all-your-packages-up-to-date-with-dependabot/
https://help.github.com/en/github/administering-a-repository/configuration-options-for-dependency-updates
---
.dependabot/config.yml | 160 -----------------------------------------
.github/dependabot.yml | 136 +++++++++++++++++++++++++++++++++++
2 files changed, 136 insertions(+), 160 deletions(-)
delete mode 100644 .dependabot/config.yml
create mode 100644 .github/dependabot.yml
diff --git a/.dependabot/config.yml b/.dependabot/config.yml
deleted file mode 100644
index bf80d72ab92..00000000000
--- a/.dependabot/config.yml
+++ /dev/null
@@ -1,160 +0,0 @@
-# See https://github.com/dependabot/feedback/issues/70 for current (beta) configurability
-version: 1
-update_configs:
- - package_manager: "java:gradle"
- directory: "/core"
- update_schedule: "weekly"
-
-# Explicit entry for each module
- - package_manager: "java:gradle"
- directory: "/modules/cassandra"
- update_schedule: "weekly"
- automerged_updates:
- - match: { dependency_type: "development", update_type: "semver:minor" }
- - match: { dependency_type: "production", update_type: "semver:minor" }
- - package_manager: "java:gradle"
- directory: "/modules/clickhouse"
- update_schedule: "weekly"
- automerged_updates:
- - match: { dependency_type: "development", update_type: "semver:minor" }
- - match: { dependency_type: "production", update_type: "semver:minor" }
- - package_manager: "java:gradle"
- directory: "/modules/couchbase"
- update_schedule: "weekly"
- automerged_updates:
- - match: { dependency_type: "development", update_type: "semver:minor" }
- - match: { dependency_type: "production", update_type: "semver:minor" }
- - package_manager: "java:gradle"
- directory: "/modules/database-commons"
- update_schedule: "weekly"
- automerged_updates:
- - match: { dependency_type: "development", update_type: "semver:minor" }
- - match: { dependency_type: "production", update_type: "semver:minor" }
- - package_manager: "java:gradle"
- directory: "/modules/dynalite"
- update_schedule: "weekly"
- automerged_updates:
- - match: { dependency_type: "development", update_type: "semver:minor" }
- - match: { dependency_type: "production", update_type: "semver:minor" }
- - package_manager: "java:gradle"
- directory: "/modules/elasticsearch"
- update_schedule: "weekly"
- automerged_updates:
- - match: { dependency_type: "development", update_type: "semver:minor" }
- - match: { dependency_type: "production", update_type: "semver:minor" }
- - package_manager: "java:gradle"
- directory: "/modules/influxdb"
- update_schedule: "weekly"
- automerged_updates:
- - match: { dependency_type: "development", update_type: "semver:minor" }
- - match: { dependency_type: "production", update_type: "semver:minor" }
- - package_manager: "java:gradle"
- directory: "/modules/jdbc"
- update_schedule: "weekly"
- automerged_updates:
- - match: { dependency_type: "development", update_type: "semver:minor" }
- - match: { dependency_type: "production", update_type: "semver:minor" }
- - package_manager: "java:gradle"
- directory: "/modules/jdbc-test"
- update_schedule: "weekly"
- automerged_updates:
- - match: { dependency_type: "development", update_type: "semver:minor" }
- - match: { dependency_type: "production", update_type: "semver:minor" }
- - package_manager: "java:gradle"
- directory: "/modules/junit-jupiter"
- update_schedule: "weekly"
- automerged_updates:
- - match: { dependency_type: "development", update_type: "semver:minor" }
- - match: { dependency_type: "production", update_type: "semver:minor" }
- - package_manager: "java:gradle"
- directory: "/modules/kafka"
- update_schedule: "weekly"
- automerged_updates:
- - match: { dependency_type: "development", update_type: "semver:minor" }
- - match: { dependency_type: "production", update_type: "semver:minor" }
- - package_manager: "java:gradle"
- directory: "/modules/localstack"
- update_schedule: "weekly"
- automerged_updates:
- - match: { dependency_type: "development", update_type: "semver:minor" }
- - match: { dependency_type: "production", update_type: "semver:minor" }
- - package_manager: "java:gradle"
- directory: "/modules/mariadb"
- update_schedule: "weekly"
- automerged_updates:
- - match: { dependency_type: "development", update_type: "semver:minor" }
- - match: { dependency_type: "production", update_type: "semver:minor" }
- - package_manager: "java:gradle"
- directory: "/modules/mockserver"
- update_schedule: "weekly"
- automerged_updates:
- - match: { dependency_type: "development", update_type: "semver:minor" }
- - match: { dependency_type: "production", update_type: "semver:minor" }
- - package_manager: "java:gradle"
- directory: "/modules/mssqlserver"
- update_schedule: "weekly"
- automerged_updates:
- - match: { dependency_type: "development", update_type: "semver:minor" }
- - match: { dependency_type: "production", update_type: "semver:minor" }
- - package_manager: "java:gradle"
- directory: "/modules/mysql"
- update_schedule: "weekly"
- automerged_updates:
- - match: { dependency_type: "development", update_type: "semver:minor" }
- - match: { dependency_type: "production", update_type: "semver:minor" }
- - package_manager: "java:gradle"
- directory: "/modules/neo4j"
- update_schedule: "weekly"
- automerged_updates:
- - match: { dependency_type: "development", update_type: "semver:minor" }
- - match: { dependency_type: "production", update_type: "semver:minor" }
- - package_manager: "java:gradle"
- directory: "/modules/nginx"
- update_schedule: "weekly"
- automerged_updates:
- - match: { dependency_type: "development", update_type: "semver:minor" }
- - match: { dependency_type: "production", update_type: "semver:minor" }
- - package_manager: "java:gradle"
- directory: "/modules/oracle-xe"
- update_schedule: "weekly"
- automerged_updates:
- - match: { dependency_type: "development", update_type: "semver:minor" }
- - match: { dependency_type: "production", update_type: "semver:minor" }
- - package_manager: "java:gradle"
- directory: "/modules/postgresql"
- update_schedule: "weekly"
- automerged_updates:
- - match: { dependency_type: "development", update_type: "semver:minor" }
- - match: { dependency_type: "production", update_type: "semver:minor" }
- - package_manager: "java:gradle"
- directory: "/modules/pulsar"
- update_schedule: "weekly"
- automerged_updates:
- - match: { dependency_type: "development", update_type: "semver:minor" }
- - match: { dependency_type: "production", update_type: "semver:minor" }
- - package_manager: "java:gradle"
- directory: "/modules/selenium"
- update_schedule: "weekly"
- automerged_updates:
- - match: { dependency_type: "development", update_type: "semver:minor" }
- - match: { dependency_type: "production", update_type: "semver:minor" }
- - package_manager: "java:gradle"
- directory: "/modules/spock"
- update_schedule: "weekly"
- automerged_updates:
- - match: { dependency_type: "development", update_type: "semver:minor" }
- - match: { dependency_type: "production", update_type: "semver:minor" }
- - package_manager: "java:gradle"
- directory: "/modules/vault"
- update_schedule: "weekly"
- automerged_updates:
- - match: { dependency_type: "development", update_type: "semver:minor" }
- - match: { dependency_type: "production", update_type: "semver:minor" }
-
-# Examples
- - package_manager: "java:gradle"
- directory: "/examples"
- update_schedule: "weekly"
- automerged_updates:
- - match: { dependency_type: "development", update_type: "semver:minor" }
- - match: { dependency_type: "production", update_type: "semver:minor" }
diff --git a/.github/dependabot.yml b/.github/dependabot.yml
new file mode 100644
index 00000000000..8abda8d8c5a
--- /dev/null
+++ b/.github/dependabot.yml
@@ -0,0 +1,136 @@
+version: 2
+updates:
+ - package-ecosystem: "gradle"
+ directory: "/core"
+ schedule:
+ interval: "weekly"
+ open-pull-requests-limit: 10
+
+# Explicit entry for each module
+ - package-ecosystem: "gradle"
+ directory: "/modules/cassandra"
+ schedule:
+ interval: "weekly"
+ open-pull-requests-limit: 10
+ - package-ecosystem: "gradle"
+ directory: "/modules/clickhouse"
+ schedule:
+ interval: "weekly"
+ open-pull-requests-limit: 10
+ - package-ecosystem: "gradle"
+ directory: "/modules/couchbase"
+ schedule:
+ interval: "weekly"
+ open-pull-requests-limit: 10
+ - package-ecosystem: "gradle"
+ directory: "/modules/database-commons"
+ schedule:
+ interval: "weekly"
+ open-pull-requests-limit: 10
+ - package-ecosystem: "gradle"
+ directory: "/modules/dynalite"
+ schedule:
+ interval: "weekly"
+ open-pull-requests-limit: 10
+ - package-ecosystem: "gradle"
+ directory: "/modules/elasticsearch"
+ schedule:
+ interval: "weekly"
+ open-pull-requests-limit: 10
+ - package-ecosystem: "gradle"
+ directory: "/modules/influxdb"
+ schedule:
+ interval: "weekly"
+ open-pull-requests-limit: 10
+ - package-ecosystem: "gradle"
+ directory: "/modules/jdbc"
+ schedule:
+ interval: "weekly"
+ open-pull-requests-limit: 10
+ - package-ecosystem: "gradle"
+ directory: "/modules/jdbc-test"
+ schedule:
+ interval: "weekly"
+ open-pull-requests-limit: 10
+ - package-ecosystem: "gradle"
+ directory: "/modules/junit-jupiter"
+ schedule:
+ interval: "weekly"
+ open-pull-requests-limit: 10
+ - package-ecosystem: "gradle"
+ directory: "/modules/kafka"
+ schedule:
+ interval: "weekly"
+ open-pull-requests-limit: 10
+ - package-ecosystem: "gradle"
+ directory: "/modules/localstack"
+ schedule:
+ interval: "weekly"
+ open-pull-requests-limit: 10
+ - package-ecosystem: "gradle"
+ directory: "/modules/mariadb"
+ schedule:
+ interval: "weekly"
+ open-pull-requests-limit: 10
+ - package-ecosystem: "gradle"
+ directory: "/modules/mockserver"
+ schedule:
+ interval: "weekly"
+ open-pull-requests-limit: 10
+ - package-ecosystem: "gradle"
+ directory: "/modules/mssqlserver"
+ schedule:
+ interval: "weekly"
+ open-pull-requests-limit: 10
+ - package-ecosystem: "gradle"
+ directory: "/modules/mysql"
+ schedule:
+ interval: "weekly"
+ open-pull-requests-limit: 10
+ - package-ecosystem: "gradle"
+ directory: "/modules/neo4j"
+ schedule:
+ interval: "weekly"
+ open-pull-requests-limit: 10
+ - package-ecosystem: "gradle"
+ directory: "/modules/nginx"
+ schedule:
+ interval: "weekly"
+ open-pull-requests-limit: 10
+ - package-ecosystem: "gradle"
+ directory: "/modules/oracle-xe"
+ schedule:
+ interval: "weekly"
+ open-pull-requests-limit: 10
+ - package-ecosystem: "gradle"
+ directory: "/modules/postgresql"
+ schedule:
+ interval: "weekly"
+ open-pull-requests-limit: 10
+ - package-ecosystem: "gradle"
+ directory: "/modules/pulsar"
+ schedule:
+ interval: "weekly"
+ open-pull-requests-limit: 10
+ - package-ecosystem: "gradle"
+ directory: "/modules/selenium"
+ schedule:
+ interval: "weekly"
+ open-pull-requests-limit: 10
+ - package-ecosystem: "gradle"
+ directory: "/modules/spock"
+ schedule:
+ interval: "weekly"
+ open-pull-requests-limit: 10
+ - package-ecosystem: "gradle"
+ directory: "/modules/vault"
+ schedule:
+ interval: "weekly"
+ open-pull-requests-limit: 10
+
+# Examples
+ - package-ecosystem: "gradle"
+ directory: "/examples"
+ schedule:
+ interval: "weekly"
+ open-pull-requests-limit: 10
From 0bc4a4db37c1aad0dc97229d0b5e409904a52510 Mon Sep 17 00:00:00 2001
From: "dependabot-preview[bot]"
<27856297+dependabot-preview[bot]@users.noreply.github.com>
Date: Sat, 20 Jun 2020 21:04:27 +0100
Subject: [PATCH 0183/4341] Bump elasticsearch-rest-client from 7.7.1 to 7.8.0
in /modules/elasticsearch (#2889)
Bumps [elasticsearch-rest-client](https://github.com/elastic/elasticsearch) from 7.7.1 to 7.8.0.
- [Release notes](https://github.com/elastic/elasticsearch/releases)
- [Commits](https://github.com/elastic/elasticsearch/compare/v7.7.1...v7.8.0)
Signed-off-by: dependabot-preview[bot]
Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>
---
modules/elasticsearch/build.gradle | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/modules/elasticsearch/build.gradle b/modules/elasticsearch/build.gradle
index 04e038864ce..591760d7b0e 100644
--- a/modules/elasticsearch/build.gradle
+++ b/modules/elasticsearch/build.gradle
@@ -2,6 +2,6 @@ description = "TestContainers :: elasticsearch"
dependencies {
compile project(':testcontainers')
- testCompile "org.elasticsearch.client:elasticsearch-rest-client:7.7.1"
+ testCompile "org.elasticsearch.client:elasticsearch-rest-client:7.8.0"
testCompile "org.elasticsearch.client:transport:6.7.1"
}
From d1f319491ed34c80b43d8bbba7575cc8fd570b31 Mon Sep 17 00:00:00 2001
From: "dependabot-preview[bot]"
<27856297+dependabot-preview[bot]@users.noreply.github.com>
Date: Sat, 20 Jun 2020 21:05:13 +0100
Subject: [PATCH 0184/4341] Bump cucumber-junit from 5.7.0 to 6.1.1 in
/examples (#2891)
Bumps [cucumber-junit](https://github.com/cucumber/cucumber-jvm) from 5.7.0 to 6.1.1.
- [Release notes](https://github.com/cucumber/cucumber-jvm/releases)
- [Changelog](https://github.com/cucumber/cucumber-jvm/blob/master/CHANGELOG.md)
- [Commits](https://github.com/cucumber/cucumber-jvm/compare/v5.7.0...v6.1.1)
Signed-off-by: dependabot-preview[bot]
Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>
---
examples/cucumber/build.gradle | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/examples/cucumber/build.gradle b/examples/cucumber/build.gradle
index 011b2bddecd..dfd80dc16c2 100644
--- a/examples/cucumber/build.gradle
+++ b/examples/cucumber/build.gradle
@@ -11,6 +11,6 @@ dependencies {
implementation 'org.seleniumhq.selenium:selenium-firefox-driver:3.141.59'
implementation 'org.seleniumhq.selenium:selenium-chrome-driver:3.14.0'
testImplementation 'io.cucumber:cucumber-java:5.7.0'
- testImplementation 'io.cucumber:cucumber-junit:5.7.0'
+ testImplementation 'io.cucumber:cucumber-junit:6.1.1'
testImplementation 'org.testcontainers:selenium'
}
From d4c2230d1de7c765a12087aecdd1f3da197f05a9 Mon Sep 17 00:00:00 2001
From: "dependabot-preview[bot]"
<27856297+dependabot-preview[bot]@users.noreply.github.com>
Date: Sat, 20 Jun 2020 21:05:28 +0100
Subject: [PATCH 0185/4341] Bump pulsar-client from 2.5.2 to 2.6.0 in
/modules/pulsar (#2893)
Bumps [pulsar-client](https://github.com/apache/pulsar) from 2.5.2 to 2.6.0.
- [Release notes](https://github.com/apache/pulsar/releases)
- [Commits](https://github.com/apache/pulsar/compare/v2.5.2...v2.6.0)
Signed-off-by: dependabot-preview[bot]
Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>
---
modules/pulsar/build.gradle | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/modules/pulsar/build.gradle b/modules/pulsar/build.gradle
index 4082197b8ea..371aa0c11d0 100644
--- a/modules/pulsar/build.gradle
+++ b/modules/pulsar/build.gradle
@@ -3,6 +3,6 @@ description = "Testcontainers :: Pulsar"
dependencies {
compile project(':testcontainers')
- testCompile group: 'org.apache.pulsar', name: 'pulsar-client', version: '2.5.2'
+ testCompile group: 'org.apache.pulsar', name: 'pulsar-client', version: '2.6.0'
testCompile group: 'org.assertj', name: 'assertj-core', version: '3.16.1'
}
From 0e6e14725418a99a38c87b05f3e13d87d428bda3 Mon Sep 17 00:00:00 2001
From: "dependabot-preview[bot]"
<27856297+dependabot-preview[bot]@users.noreply.github.com>
Date: Sat, 20 Jun 2020 21:05:47 +0100
Subject: [PATCH 0186/4341] Bump postgresql from 42.2.13 to 42.2.14 in
/examples (#2892)
Bumps [postgresql](https://github.com/pgjdbc/pgjdbc) from 42.2.13 to 42.2.14.
- [Release notes](https://github.com/pgjdbc/pgjdbc/releases)
- [Changelog](https://github.com/pgjdbc/pgjdbc/blob/master/CHANGELOG.md)
- [Commits](https://github.com/pgjdbc/pgjdbc/compare/REL42.2.13...REL42.2.14)
Signed-off-by: dependabot-preview[bot]
Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>
---
examples/linked-container/build.gradle | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/examples/linked-container/build.gradle b/examples/linked-container/build.gradle
index 79b66e15c57..52d2d58b6e7 100644
--- a/examples/linked-container/build.gradle
+++ b/examples/linked-container/build.gradle
@@ -9,7 +9,7 @@ dependencies {
compileOnly 'org.slf4j:slf4j-api:1.7.30'
implementation 'com.squareup.okhttp3:okhttp:3.14.8'
implementation 'org.json:json:20180813'
- testImplementation 'org.postgresql:postgresql:42.2.13'
+ testImplementation 'org.postgresql:postgresql:42.2.14'
testImplementation 'ch.qos.logback:logback-classic:1.2.3'
testImplementation 'org.testcontainers:postgresql'
}
From 1955de455c36008048b3756b5a9623fd0382b13f Mon Sep 17 00:00:00 2001
From: "dependabot-preview[bot]"
<27856297+dependabot-preview[bot]@users.noreply.github.com>
Date: Sat, 20 Jun 2020 21:06:02 +0100
Subject: [PATCH 0187/4341] Bump aws-java-sdk-s3 from 1.11.802 to 1.11.807 in
/modules/localstack (#2894)
Bumps [aws-java-sdk-s3](https://github.com/aws/aws-sdk-java) from 1.11.802 to 1.11.807.
- [Release notes](https://github.com/aws/aws-sdk-java/releases)
- [Changelog](https://github.com/aws/aws-sdk-java/blob/master/CHANGELOG.md)
- [Commits](https://github.com/aws/aws-sdk-java/compare/1.11.802...1.11.807)
Signed-off-by: dependabot-preview[bot]
Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>
---
modules/localstack/build.gradle | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/modules/localstack/build.gradle b/modules/localstack/build.gradle
index 8a2a372a0f1..12f7dbe7e63 100644
--- a/modules/localstack/build.gradle
+++ b/modules/localstack/build.gradle
@@ -3,8 +3,8 @@ description = "Testcontainers :: Localstack"
dependencies {
compile project(':testcontainers')
- compileOnly 'com.amazonaws:aws-java-sdk-s3:1.11.802'
- testCompile 'com.amazonaws:aws-java-sdk-s3:1.11.797'
+ compileOnly 'com.amazonaws:aws-java-sdk-s3:1.11.807'
+ testCompile 'com.amazonaws:aws-java-sdk-s3:1.11.807'
testCompile 'com.amazonaws:aws-java-sdk-sqs:1.11.797'
testCompile 'com.amazonaws:aws-java-sdk-logs:1.11.797'
testCompile 'software.amazon.awssdk:s3:2.13.36'
From 7278c496f4a6ad2cfdf79c187efae36fa35324f0 Mon Sep 17 00:00:00 2001
From: Simon Schneider <10846939+raynigon@users.noreply.github.com>
Date: Sat, 20 Jun 2020 22:07:37 +0200
Subject: [PATCH 0188/4341] Use codeinclude for Elasticsearch Module (#2828)
Co-authored-by: Simon Schneider
---
docs/modules/elasticsearch.md | 39 +++--------
.../ElasticsearchContainerTest.java | 69 +++++++++++++++----
2 files changed, 66 insertions(+), 42 deletions(-)
diff --git a/docs/modules/elasticsearch.md b/docs/modules/elasticsearch.md
index c7efa872df6..9959d0b7926 100644
--- a/docs/modules/elasticsearch.md
+++ b/docs/modules/elasticsearch.md
@@ -9,31 +9,11 @@ Note that it's based on the [official Docker image](https://www.elastic.co/guide
You can start an elasticsearch container instance from any Java application by using:
-```java
-// Create the elasticsearch container.
-ElasticsearchContainer container = new ElasticsearchContainer("docker.elastic.co/elasticsearch/elasticsearch:6.4.1");
+
+[HttpClient](../../modules/elasticsearch/src/test/java/org/testcontainers/elasticsearch/ElasticsearchContainerTest.java) inside_block:httpClientContainer
+[TransportClient](../../modules/elasticsearch/src/test/java/org/testcontainers/elasticsearch/ElasticsearchContainerTest.java) inside_block:transportClientContainer
+
-// Start the container. This step might take some time...
-container.start();
-
-// Do whatever you want with the rest client ...
-final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
-credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials("elastic", "changeme"));
-RestClient restClient = RestClient.builder(HttpHost.create(container.getHttpHostAddress()))
- .setHttpClientConfigCallback(httpClientBuilder -> httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider))
- .build();
-Response response = restClient.performRequest(new Request("GET", "/"));
-
-// ... or the transport client
-TransportAddress transportAddress = new TransportAddress(container.getTcpHost());
-Settings settings = Settings.builder().put("cluster.name", "docker-cluster").build();
-TransportClient transportClient = new PreBuiltTransportClient(settings)
- .addTransportAddress(transportAddress);
-ClusterHealthResponse healths = transportClient.admin().cluster().prepareHealth().get();
-
-// Stop the container.
-container.stop();
-```
Note that if you are still using the [TransportClient](https://www.elastic.co/guide/en/elasticsearch/client/java-api/6.3/transport-client.html)
(not recommended as it is deprecated), the default cluster name is set to `docker-cluster` so you need to change `cluster.name` setting
@@ -41,13 +21,12 @@ or set `client.transport.ignore_cluster_name` to `true`.
## Choose your Elasticsearch license
-If you prefer to start a Docker image with the pure OSS version (which means with no security or
-other advanced features), you can use this instead:
+If you prefer to start a Docker image with the pure OSS version (which means with no security in older versions or
+other new and advanced features), you can use this instead:
-```java
-// Create the elasticsearch container.
-ElasticsearchContainer container = new ElasticsearchContainer("docker.elastic.co/elasticsearch/elasticsearch-oss:6.4.1");
-```
+
+[Elasticsearch OSS](../../modules/elasticsearch/src/test/java/org/testcontainers/elasticsearch/ElasticsearchContainerTest.java) inside_block:oosContainer
+
## Adding this module to your project dependencies
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 7aaf49d3af7..5da759872c9 100644
--- a/modules/elasticsearch/src/test/java/org/testcontainers/elasticsearch/ElasticsearchContainerTest.java
+++ b/modules/elasticsearch/src/test/java/org/testcontainers/elasticsearch/ElasticsearchContainerTest.java
@@ -1,5 +1,12 @@
package org.testcontainers.elasticsearch;
+import static org.hamcrest.CoreMatchers.containsString;
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.rnorth.visibleassertions.VisibleAssertions.assertThrows;
+import static org.testcontainers.elasticsearch.ElasticsearchContainer.ELASTICSEARCH_DEFAULT_VERSION;
+
+import java.io.IOException;
import org.apache.http.HttpHost;
import org.apache.http.auth.AuthScope;
@@ -7,6 +14,7 @@
import org.apache.http.client.CredentialsProvider;
import org.apache.http.impl.client.BasicCredentialsProvider;
import org.apache.http.util.EntityUtils;
+import org.elasticsearch.Version;
import org.elasticsearch.action.admin.cluster.health.ClusterHealthResponse;
import org.elasticsearch.client.Request;
import org.elasticsearch.client.Response;
@@ -19,16 +27,13 @@
import org.junit.After;
import org.junit.Test;
-import java.io.IOException;
-
-import static org.hamcrest.CoreMatchers.containsString;
-import static org.hamcrest.CoreMatchers.is;
-import static org.hamcrest.MatcherAssert.assertThat;
-import static org.rnorth.visibleassertions.VisibleAssertions.assertThrows;
-import static org.testcontainers.elasticsearch.ElasticsearchContainer.ELASTICSEARCH_DEFAULT_VERSION;
-
public class ElasticsearchContainerTest {
+ /**
+ * Elasticsearch version which should be used for the Tests
+ */
+ private static final String ELASTICSEARCH_VERSION = Version.CURRENT.toString();
+
/**
* Elasticsearch default username, when secured with a license > basic
*/
@@ -51,10 +56,14 @@ public void stopRestClient() throws IOException {
@Test
public void elasticsearchDefaultTest() throws IOException {
+ // Create the elasticsearch container.
try (ElasticsearchContainer container = new ElasticsearchContainer()
.withEnv("foo", "bar") // dummy env for compiler checking correct generics usage
) {
+ // Start the container. This step might take some time...
container.start();
+
+ // Do whatever you want with the rest client ...
Response response = getClient(container).performRequest(new Request("GET", "/"));
assertThat(response.getStatusLine().getStatusCode(), is(200));
assertThat(EntityUtils.toString(response.getEntity()), containsString(ELASTICSEARCH_DEFAULT_VERSION));
@@ -69,19 +78,22 @@ public void elasticsearchDefaultTest() throws IOException {
@Test
public void elasticsearchVersion() throws IOException {
- try (ElasticsearchContainer container = new ElasticsearchContainer("docker.elastic.co/elasticsearch/elasticsearch:5.6.12")) {
+ try (ElasticsearchContainer container = new ElasticsearchContainer("docker.elastic.co/elasticsearch/elasticsearch:" + ELASTICSEARCH_VERSION)) {
container.start();
Response response = getClient(container).performRequest(new Request("GET", "/"));
assertThat(response.getStatusLine().getStatusCode(), is(200));
String responseAsString = EntityUtils.toString(response.getEntity());
- assertThat(responseAsString, containsString("5.6.12"));
+ assertThat(responseAsString, containsString(ELASTICSEARCH_VERSION));
}
}
@Test
public void elasticsearchOssImage() throws IOException {
- try (ElasticsearchContainer container =
- new ElasticsearchContainer("docker.elastic.co/elasticsearch/elasticsearch-oss:" + ELASTICSEARCH_DEFAULT_VERSION)) {
+ try (
+ // oosContainer {
+ ElasticsearchContainer container = new ElasticsearchContainer("docker.elastic.co/elasticsearch/elasticsearch-oss:" + ELASTICSEARCH_VERSION)
+ // }
+ ) {
container.start();
Response response = getClient(container).performRequest(new Request("GET", "/"));
assertThat(response.getStatusLine().getStatusCode(), is(200));
@@ -92,11 +104,41 @@ public void elasticsearchOssImage() throws IOException {
}
}
+ @Test
+ public void restClientClusterHealth() throws IOException {
+ // httpClientContainer {
+ // Create the elasticsearch container.
+ try (ElasticsearchContainer container = new ElasticsearchContainer()) {
+ // Start the container. This step might take some time...
+ container.start();
+
+ // Do whatever you want with the rest client ...
+ final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
+ credentialsProvider.setCredentials(AuthScope.ANY,
+ new UsernamePasswordCredentials(ELASTICSEARCH_USERNAME, ELASTICSEARCH_PASSWORD));
+
+ client = RestClient.builder(HttpHost.create(container.getHttpHostAddress()))
+ .setHttpClientConfigCallback(httpClientBuilder -> httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider))
+ .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 {{
+ }
+ // }
+ }
+
@Test
public void transportClientClusterHealth() {
+ // transportClientContainer {
+ // Create the elasticsearch container.
try (ElasticsearchContainer container = new ElasticsearchContainer()) {
+ // Start the container. This step might take some time...
container.start();
+ // Do whatever you want with the transport client
TransportAddress transportAddress = new TransportAddress(container.getTcpHost());
String expectedClusterName = "docker-cluster";
Settings settings = Settings.builder().put("cluster.name", expectedClusterName).build();
@@ -104,9 +146,12 @@ public void transportClientClusterHealth() {
.addTransportAddress(transportAddress)) {
ClusterHealthResponse healths = transportClient.admin().cluster().prepareHealth().get();
String clusterName = healths.getClusterName();
+ // }}}
assertThat(clusterName, is(expectedClusterName));
+ // transportClientContainer {{{
}
}
+ // }
}
private RestClient getClient(ElasticsearchContainer container) {
From 0053dfe559a90c4d8abb2a296d046d513abf0a08 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Sat, 20 Jun 2020 21:12:21 +0100
Subject: [PATCH 0189/4341] Bump aws-java-sdk-dynamodb from 1.11.479 to
1.11.807 in /modules/dynalite (#2905)
Bumps [aws-java-sdk-dynamodb](https://github.com/aws/aws-sdk-java) from 1.11.479 to 1.11.807.
- [Release notes](https://github.com/aws/aws-sdk-java/releases)
- [Changelog](https://github.com/aws/aws-sdk-java/blob/master/CHANGELOG.md)
- [Commits](https://github.com/aws/aws-sdk-java/compare/1.11.479...1.11.807)
Signed-off-by: dependabot[bot]
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
---
modules/dynalite/build.gradle | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/modules/dynalite/build.gradle b/modules/dynalite/build.gradle
index 32d522aa964..7101f40552f 100644
--- a/modules/dynalite/build.gradle
+++ b/modules/dynalite/build.gradle
@@ -3,6 +3,6 @@ description = "Testcontainers :: Dynalite"
dependencies {
compile project(':testcontainers')
- compileOnly 'com.amazonaws:aws-java-sdk-dynamodb:1.11.479'
+ compileOnly 'com.amazonaws:aws-java-sdk-dynamodb:1.11.807'
testCompile 'com.amazonaws:aws-java-sdk-dynamodb:1.11.479'
}
From 924d36f9773fefc3321f6d3e23d97fea8852ff8e Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Sat, 20 Jun 2020 21:13:44 +0100
Subject: [PATCH 0190/4341] Bump me.champeau.gradle.japicmp from 0.2.8 to 0.2.9
in /core (#2900)
Bumps me.champeau.gradle.japicmp from 0.2.8 to 0.2.9.
Signed-off-by: dependabot[bot]
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
---
core/build.gradle | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/core/build.gradle b/core/build.gradle
index deabf16e90d..69788d1f0de 100644
--- a/core/build.gradle
+++ b/core/build.gradle
@@ -10,7 +10,7 @@ buildscript {
}
plugins {
- id 'me.champeau.gradle.japicmp' version '0.2.8'
+ id 'me.champeau.gradle.japicmp' version '0.2.9'
}
apply plugin: 'com.github.johnrengelman.shadow'
From e61bff8675847eec9db1d626ece77b588c70ad80 Mon Sep 17 00:00:00 2001
From: "dependabot-preview[bot]"
<27856297+dependabot-preview[bot]@users.noreply.github.com>
Date: Sun, 21 Jun 2020 09:50:05 +0100
Subject: [PATCH 0191/4341] Bump aws-java-sdk-sqs from 1.11.797 to 1.11.807 in
/modules/localstack (#2896)
Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>
Co-authored-by: Richard North
---
modules/localstack/build.gradle | 6 ++----
1 file changed, 2 insertions(+), 4 deletions(-)
diff --git a/modules/localstack/build.gradle b/modules/localstack/build.gradle
index 12f7dbe7e63..d90e8e1611a 100644
--- a/modules/localstack/build.gradle
+++ b/modules/localstack/build.gradle
@@ -5,9 +5,7 @@ dependencies {
compileOnly 'com.amazonaws:aws-java-sdk-s3:1.11.807'
testCompile 'com.amazonaws:aws-java-sdk-s3:1.11.807'
- testCompile 'com.amazonaws:aws-java-sdk-sqs:1.11.797'
- testCompile 'com.amazonaws:aws-java-sdk-logs:1.11.797'
+ testCompile 'com.amazonaws:aws-java-sdk-sqs:1.11.807'
+ testCompile 'com.amazonaws:aws-java-sdk-logs:1.11.807'
testCompile 'software.amazon.awssdk:s3:2.13.36'
- testCompile 'com.amazonaws:aws-java-sdk-sqs:1.11.797'
- testCompile 'com.amazonaws:aws-java-sdk-logs:1.11.797'
}
From f358ebfcfa36c84ef50707767d4beaa644e7a070 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Sun, 21 Jun 2020 09:51:51 +0100
Subject: [PATCH 0192/4341] Bump selenium-remote-driver from 3.14.0 to 3.141.59
in /examples (#2913)
Bumps [selenium-remote-driver](https://github.com/SeleniumHQ/selenium) from 3.14.0 to 3.141.59.
- [Release notes](https://github.com/SeleniumHQ/selenium/releases)
- [Commits](https://github.com/SeleniumHQ/selenium/compare/selenium-3.14.0...selenium-3.141.59)
Signed-off-by: dependabot[bot]
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Richard North